黎曼和,C中的梯形规则

黎曼和,C中的梯形规则,c,function,loops,math,area,C,Function,Loops,Math,Area,我一直在试图写一个程序,用梯形法则来计算C中曲线下的面积。问题是,我认为我的逻辑是正确的,我已经检查了很多次算法,但仍然找不到错误 这是我的教授布置的,他不想让我们使用数组,所以你们看不到 它扫描func,a,p,q,err,其中func是将要使用的函数(函数#1或#2,但我只做了#1),a是常数,p是初始x,q是最终x,err是误差范围,我想 程序将划分间隔并计算面积,直到最后一次计算面积-我们刚刚计算的总面积等于小于10^-err 编辑:多亏了LutzL,我做了一些改变 #include&l

我一直在试图写一个程序,用梯形法则来计算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;
}
#包括
#包括
双F1(双x,双a){
双f1=0.0;
f1=(sqrt(a-pow(x,2));
返回f1;
}
int main(){
双a=0.0,p=0.0,q=0.0,h=0.0,x=0.0,err=0;
int func=3,n=2;
双功率=0.0,T=0.0;
双和=0.0,最后一个=0.0,差=1.0;
scanf(“%d”和&func);
while(func!=0){
n=2;
扫描(“%lf%lf%lf%lf”、&a、&p、&q、&err);
功率=功率(10.0,-误差);
h=(q-p)/n;
如果(func==1){
差异=1.0;
而(差异>=功率){
h=(q-p)/n;
总和=0.0;

对于(x=p+h;x
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

它不应该做什么?错误/问题是什么?问题是什么?错误是什么?你的实现没有它可能有用,因为你的所有代码都在一个主方法中,而不是一个可以在多个地方调用的函数。你需要将
sum
重置为
0
n每次尝试。当我输入1,4,-2,1,9时,更改
n
@PaulOgilvie时,您需要重新计算
h
。它应该输出5.05481,但相反,它输出4.59808。非常感谢!我做了这些更改,现在我更接近获得正确的输出了