C语言求定积分的问题。

下面程序是用梯形法求定积分,程序没错,能执行的。我不明白的是语句 s=(fun(a)+fun(b))/2;。s的初值为什么要是 (fun(a)+fun(b))/2;?我觉得s的初值应该是0。累加嘛,一开始应该为0才对啊。
我试过,如果s的初值为0,误差比较大。

#include <math.h>
float integral(float(*fun)(float x),float a,float b,int n)
{float s,h,y;
int i;
s=(fun(a)+fun(b))/2;
h=(b-a)/n; /*积分步长*/
for(i=1;i<n;i++)
s=s+fun(a+i*h);
y=s*h;
return y;/*返回积分值*/
}

float f(float x)
{return(x*sin(x)) /*修改此处可以改变被积函数*/
}

main()
{float y;
y=integral(f,1.0,2.0,150);/*修改此处可以改变积分上下限和步长*/
printf("y=%f\n",y);
}

根据梯形法求积分的原理,设间隔h= (b-a)/n,则积分近似计算公式为:

s = h/2 *[f(a)+f(a+h)] + h/2 *[f(a+h)+f(a+2h)] +...+h/2 *[f(b-h)+f(b)] 

   = h/2 *[f(a)+f(b)]   + h* [ f(a+h) + f(a+2h) + f(a+3h) + ... + f(b -h)] 

令积分s初始值为 h/2 *[f(a)+f(b)]  ï¼ŒåŽé¢ä»¤i=1,...,n-1来迭代s = s+h*f(a+ih)。

   

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-01
#include <stdio.h>
#include <math.h>
double integral(double(*fun)(double x),double a,double b,int n)
{
double s,h,y;
int i;
s=(fun(a)+fun(b))/2;//因为后面的循环没有包括ab两点

h=(b-a)/n; /*积分步长*/
for(i=1;i<n;i++)
s=s+fun(a+i*h);
y=s*h;
return y;/*返回积分值*/
}

double f(double x)
{
return(x*sin(x)) ; /*修改此处可以改变被积函数*/
}

void main()
{
double y;
y=integral(f,1.0,2.0,150);/*修改此处可以改变积分上下限和步长*/
printf("y=%lf\n",y);
}

第2个回答  2020-02-12
h=(b-a)/n;改为h=(float)(b-a)/n;
必须进行强制类型转换,否则
h=(b-a)/n=0.
还有for循环中,当i=1时
x=a+(i-1)*h=0+(1-1)*1000=0;
t1=(sin(x))/x=(sin0)/0;
分母不能为零吧。