【问题标题】:Composite simpson rule code keep getting wrong output?复合辛普森规则代码不断得到错误的输出?
【发布时间】:2019-12-08 11:59:33
【问题描述】:

算法:enter image description here

我正在尝试实现这个复合辛普森规则,它将计算以下积分:1/sqrt(x),结果应该是:2

但是,我不断收到错误的输出,例如 1.61663

#include <cmath>
#include <iostream>
using namespace std;

double f(double n)
{

    return 1/sqrt(n);
}

double simpson(double a, double b, double n)
{

double x0=f(a)+f(b);
double h=(b-a)/(n);
double x1=0,x2=0;
double x=0;
for(int i = 1 ; i <n;i++){
        x=a+(i*h);
        if(i%2==0)
        {
            x2=x2+f(x);
        }
        else
        {
            x1=x1+f(x);
        }
    }
        x1=(h*(x0+2*x2+4*x1))/3;
        return x1;
}

 int main(){

            cout<<"Integral is: "<<" "<<simpson(0.0004,1,20)<<" "<<endl;
    }

【问题讨论】:

  • 你是不是忘了初始化一些变量,比如x1x2
  • 默认初始化为0
  • 没有。只有全局变量通过归零初始化。
  • 完成但输出仍然相同
  • 不应该将 x0 初始化为 f(a) + f(b) 而不是乘以这些值吗?

标签: c++ algorithm math calculus


【解决方案1】:

问题不在于您的代码,而在于您尝试集成的功能。当x 变为零时,此函数发散到无穷大。导数也会发散。

对于区间[a, 1] 和小的a,误差项以O[1/(N^4 a^4.5)] 为界。这就是为什么要计算这个区间的积分,网格应该非常密集才能获得合理的误差界限。

simpson(0.0004, 1, N) 产生以下值:

N      Result         Error
--------------------------------
20     2.549041009    0.5890
200    1.986462457    0.0265
2000   1.960181808    1.8181e-4
20000  1.960000049    4.9374e-8 
200000 1.960000000    5.0810e-12

事实上,对于大的N,我们越来越接近精确值1.96,错误为O(1/N^4)

【讨论】:

  • 这个怎么样:simpson(0.0000001,1,2000000) 更准确
  • @sanjep,错误界限包含四阶导数,它也发散了。 a 越小,您需要的网格就越密集。
  • @sanjep,从结果中减去 1.96
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2013-11-05
  • 2014-01-06
  • 2012-10-19
  • 2020-01-19
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多