用c语言如何编写“用梯形法求定积分∫sinxdx的近似值 上限为不b=π下限为a=0”这一问题,求代码
答案:1 悬赏:70 手机版
解决时间 2021-11-26 03:09
- 提问者网友:自食苦果
- 2021-11-25 04:58
用c语言如何编写“用梯形法求定积分∫sinxdx的近似值 上限为不b=π下限为a=0”这一问题,求代码
最佳答案
- 五星知识达人网友:鱼忧
- 2021-11-25 05:34
首先解决怎么算,计算机肯定不会积分,所以我开始想用sinx的泰勒展开式,然后选3-4次作为近似,然后积分。听你说梯形法,是数值计算的内容,刚好这学期在学,就把我调试的程序发一个给你吧这是romberg算法,把a 换为0,b换为pi就好了吧。附上书上的代码。
#include
#include
#define f(x) (sin(x))
#define N_H 20
#define MAXREPT 10
#define a 1.0
#define b 2.0
#define epsilon 0.00001
double computeT(double aa,double bb,long int n)
{
int i;double sum=0.0;double h=(bb-aa)/n;
for(i=1;i {
sum+=f(aa+i*h);
}
sum+=(f(aa)+f(bb))/2;
return (h*sum);
}
void main()
{
int i;
long int n=N_H,m=0;
double T[MAXREPT+1][2];
T[0][1]=computeT(a,b,n);
n*=2;
for (m=1;m {
for (i=0;i {
T[i][0]=T[i][1];
}
T[0][1]=computeT(a,b,n);
n*=2;
for (i=1;i<=m;i++)
{
T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
if((T[m-1][1]T[m][1]-epsilon))
{
}
}
}
追问有没有简单点的 我是大一的初学者,做个简单的作业而已,这些东西还没学过,交上去有点不适合吧追答那这样吧,如果只求这个sinx的积分,你可以这样,根据积分的定义就是做适当的分割,每个小区间内,用曲面的内接梯形来近似整个曲面的面积(也就是精确积分)。
基于这个你把0到π均分为30份,设置一个long float变量f,每个小区间做一次循环,循环一次,将这个小区间的梯形面积加到f里去,循环30次,最后的f就是近似值。不过我觉得这样算没什么意义。我稍微写几行试试。
int i=0;
float a=0;
long float f;
for(i=0;i<30;i++)
{
f=f+sin(a+pi/60)*(pi/30);
a=a+pi/30;
}
a+=PI/30;
}
printf("the answer is%lf",f);
}
#include
#include
#define f(x) (sin(x))
#define N_H 20
#define MAXREPT 10
#define a 1.0
#define b 2.0
#define epsilon 0.00001
double computeT(double aa,double bb,long int n)
{
int i;double sum=0.0;double h=(bb-aa)/n;
for(i=1;i
sum+=f(aa+i*h);
}
sum+=(f(aa)+f(bb))/2;
return (h*sum);
}
void main()
{
int i;
long int n=N_H,m=0;
double T[MAXREPT+1][2];
T[0][1]=computeT(a,b,n);
n*=2;
for (m=1;m
for (i=0;i
T[i][0]=T[i][1];
}
T[0][1]=computeT(a,b,n);
n*=2;
for (i=1;i<=m;i++)
{
T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
if((T[m-1][1]
{
printf("the integrate is %lf
",T[m][1]);
}
}
}
printf("return no solved...
");
追问有没有简单点的 我是大一的初学者,做个简单的作业而已,这些东西还没学过,交上去有点不适合吧追答那这样吧,如果只求这个sinx的积分,你可以这样,根据积分的定义就是做适当的分割,每个小区间内,用曲面的内接梯形来近似整个曲面的面积(也就是精确积分)。
基于这个你把0到π均分为30份,设置一个long float变量f,每个小区间做一次循环,循环一次,将这个小区间的梯形面积加到f里去,循环30次,最后的f就是近似值。不过我觉得这样算没什么意义。我稍微写几行试试。
int i=0;
float a=0;
long float f;
for(i=0;i<30;i++)
{
f=f+sin(a+pi/60)*(pi/30);
a=a+pi/30;
}
a+=PI/30;
}
printf("the answer is%lf",f);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯