关于辛普生积分的c语言代码问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 15:56:11
要求用c语言编写辛普生积分公式的代码。辛普生积分公式为:
积分上下限分别为b,a,被积函数f(x),则积分值为
I=(b-a)*[f(a)+f(b)+4*f(a+b)]/6
小弟写了个代码,将积分区间细分为n段,不知对不对:
double CmpInteXinPuSheng1D(double (*fun)(double),double xa,double xb,double EPS,int &n)
{
int i;
double val,valpre,tmp,xi,xi1;
n=1;
val=(fun(xa)+4*fun((xa+xb)/2)+fun(xb));
while(1)
{
n=n*2;
h=(xb-xa)/n;
h2=h/2;
valpre=val;
for(i=0;i<n;i++)
{
xi=xa+i*h;
xi1=xi+h;
val=val+(fun(xi)+4*fun(xi+h2)+fun(xi1));
}
val=val*6/h;
tmp=fabs((val-valpre)/val);
if(tmp<EPS) break;
}
return val;
}
如果有问题,请高手指教。还有,如果是二重积分的话该怎么办?(这是重点,因为我不知道该怎么转换。如果有高手知道希望告知。有二重辛普生积分的代码最好。)

你这肯定不对~~~

你说的将积分区间细分为n段是把一元辛普森积分拓展到任意一个牛顿柯特斯积分吧?

辛普森积分就是分成3段 如果是任意段而要最高精度那就是牛顿柯特斯积分

牛顿 科特斯公式有个系数表你知道吧? 那就是分成n段时对应的每一个结点值对应的系数~~

而你这段函数功能代码里 先不说有别的错误(比如h h2没定义)

就你把函数积分通过分解为n段来求的想法里出现了

val=val+(fun(xi)+4*fun(xi+h2)+fun(xi1));

语句就知道算法不对头了~~

你这是把辛普森积分和牛顿柯特斯积分揉一块了

我用C++写了一个牛顿柯特斯积分的 用c已不习惯了~~

虽然不是c的希望对你能有所帮助

======================================================================
//***********************************************
//************将Simpson一元函数积分**************
//***************拓展到任意一个牛顿柯特斯积分****

#include<iostream>
#include<math.h>
using namespace std;

//设置全局数组——牛顿 科特斯公式系数表

double C[6][7]={{1.0/2,1.0/2},{1.0/6,4.0/6,1.0/6},{1.0/8,3.0/8,3.0/8,1.0/8},

{7.0/90,16.0/45,2.0/15,16.0/45,7.0/90},

{19.0/288,25.0/96,25.0/144,25.0/144,25.0/96,19.0/188},