Riemann Sum,C中的梯形法则

时间:2016-11-04 10:57:39

标签: c function loops math area

我一直在尝试编写一个程序,通过使用梯形法则来解决C中曲线下的区域。问题是,我认为我的逻辑是正确的,我已经多次检查算法,但我仍然无法找到错误。

这是由我的教授指定的,他不希望我们使用数组,这就是为什么你不会看到任何数据。

它会扫描func,a,p,q,err,其中func是将要使用的函数(函数#1或#2,但我只做了#1),a是常量, p是最初的x,q是最终的x,我认为错误是误差。

程序将划分间隔并计算区域,直到最后计算面积 - 我们刚计算的总面积等于小于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。

1 个答案:

答案 0 :(得分:1)

List<MonthHours> oList=new List<MonthHours>(); Int total=0; TimeSpan span=new TimeSpan(); foreach(var data in oList) { Span=data.EndTime-data.StartTime; Total+=span.hours; } 应该为sump+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