
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);
} 展开
我试过,如果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);
} 展开
3个回答
展开全部
#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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
分母不能为零吧。
必须进行强制类型转换,否则
h=(b-a)/n=0.
还有for循环中,当i=1时
x=a+(i-1)*h=0+(1-1)*1000=0;
t1=(sin(x))/x=(sin0)/0;
分母不能为零吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询