【问题标题】:Riemann Sum, Trapezoidal rule in C黎曼和,C 中的梯形法则
【发布时间】:2016-11-04 10:57:39
【问题描述】:

我一直在尝试编写一个程序,通过使用梯形规则来求解 C 中曲线下的面积。问题是,我觉得我的逻辑是ok的,我已经复习了很多次算法,我仍然找不到错误。

这是我的教授分配的东西,他不希望我们使用数组,这就是你看不到任何东西的原因。

它扫描 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。

【问题讨论】:

  • 它不应该做什么?什么是错误/问题?
  • 有什么问题?有什么错误?您的实现没有它可能有用,因为您将所有代码都放在一个 main 方法中,而不是一个可以在多个地方调用的函数。
  • 您需要在每次尝试之间将sum 重置为0
  • 更改n时需要重新计算h
  • @PaulOgilvie 当我输入 1、4、-2、1、9 时。它应该输出 5.05481,但它却输出 4.59808。

标签: c function loops math area


【解决方案1】:

sum应该将p+hp+(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

【讨论】:

  • 非常感谢!我进行了这些更改,现在我更接近获得正确的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多