C语言求定积分的问题。 5

下面程序是用梯形法求定积分,程序没错,能执行的。我不明白的是语句s=(fun(a)+fun(b))/2;。s的初值为什么要是(fun(a)+fun(b))/2;?我觉得s... 下面程序是用梯形法求定积分,程序没错,能执行的。我不明白的是语句 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);
}
展开
 我来答
我已经匿名了
2014-11-01 · TA获得超过816个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:285万
展开全部

根据梯形法求积分的原理,设间隔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)。

   

kaixingui2012
2014-11-01 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:7760万
展开全部
#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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者SJ7Alp1V0g
2020-02-12 · TA获得超过3965个赞
知道小有建树答主
回答量:3154
采纳率:27%
帮助的人:195万
展开全部
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;
分母不能为零吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式