我一直在尝试编写一个程序,使用梯形法则来解决C曲线下的面积。问题是,我认为我的逻辑还可以,我对算法进行了很多次审查,但仍然找不到错误。
这是我的教授分配的东西,他不希望我们使用数组,这就是为什么您看不到数组的原因。
它扫描func,a,p,q,err,其中func是将要使用的函数(函数#1或#2,但我只做过#1),a是常数,p是初始x我认为q是最终的x,而err是误差范围。
程序将划分间隔并计算面积,直到最后一次计算面积-我们刚刚计算出的总面积小于10 ^ -err
编辑:感谢LutzL,我进行了一些更改
#include<stdio.h>
#include<math.h>
double F1(double x,double a){
double f1=0.0;
f1=(sqrt(a-pow(x,2)));
return f1;
}
int main(){
double a=0.0,p=0.0,q=0.0,h=0.0,x=0.0,err=0;
int func=3,n=2;
double power=0.0,T=0.0;
double sum=0.0,last=0.0,difference=1.0;
scanf("%d",&func);
while(func!=0){
n=2;
scanf("%lf%lf%lf%lf",&a,&p,&q,&err);
power=pow(10.0,-err);
h=(q-p)/n;
if(func==1){
difference=1.0;
while(difference>=power){
h=(q-p)/n;
sum=0.0;
for(x=p+h;x<=q-h;x++){
sum+=(2*F1(x,a));
}
T=(h/2)*(F1(p,a)+F1(q,a)+sum);
if(difference==1.0){
difference=T;
}else{
difference=last-T;
}
last=T;
n++;
}
}
printf("%.5lf\n",T);
scanf("%d",&func);
}
return 0;
}
错误是当我输入1、4,-2、1、9时出现的。它应该输出5.05481,但是输出4.59808。
最佳答案
sum
应该将p+h
的参数的函数值添加到p+(n-1)*h=q-h
,即n-1
函数值。目前,您添加了n
函数值。
您不要在循环内将n
加倍。
最佳实现使用中点和
M(k)= f(p+h/2)+f(p+3h/2)+...+f(p+(2n-1)*h/2)
其中
n=2^k, h=(q-p)/2^k
。然后是梯形和
T(k)=0.5*f(p)+f(p+h)+...+f(p+(n-1)*h)+0.5*f(q)
满足递归
T(k+1) = T(k) + M(k)
与
T(0)=(f(p)+f(q))/2
。积分近似当然是T(k)*(q-p)/2^k
。关于c - Riemann Sum,C中的梯形法则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40420936/