首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言的梯形Riemann和

C语言的梯形Riemann和
EN

Stack Overflow用户
提问于 2018-02-21 20:30:31
回答 1查看 1.2K关注 0票数 3

在下面的代码中,我尝试用梯形和矩形两种方式来近似(显然,梯形方式会更好)。

我试着在纸上做了一个算法,得到了如下结果:注意:N是矩形(或梯形)的数量,dx是使用a,b和N( dx = (b-a)/N )计算的。f(x) = x^2

矩形方法:

代码语言:javascript
复制
<a href="http://www.codecogs.com/eqnedit.php?latex=\int_a^b&space;x^2&space;dx&space;\approx&space;\sum_{i=1}^N&space;f(a&space;&plus;&space;(i-1)dx)dx" target="_blank"><img src="http://latex.codecogs.com/png.latex?\int_a^b&space;x^2&space;dx&space;\approx&space;\sum_{i=1}^N&space;f(a&space;&plus;&space;(i-1)dx)dx" title="\int_a^b x^2 dx \approx \sum_{i=1}^N f(a + (i-1)dx)dx" /></a>

梯形法:

代码语言:javascript
复制
<a href="http://www.codecogs.com/eqnedit.php?latex=\int_a^b&space;x^2&space;dx&space;\approx&space;\sum_{i=1}^N&space;[f(a&space;&plus;&space;(i-1)dx)&space;&plus;&space;f(a&space;&plus;&space;i\cdot&space;dx)]dx" target="_blank"><img src="http://latex.codecogs.com/png.latex?\int_a^b&space;x^2&space;dx&space;\approx&space;\sum_{i=1}^N&space;[f(a&space;&plus;&space;(i-1)dx)&space;&plus;&space;f(a&space;&plus;&space;i\cdot&space;dx)]dx" title="\int_a^b x^2 dx \approx \sum_{i=1}^N [f(a + (i-1)dx) + f(a + i\cdot dx)]dx" /></a>

code (在下面的代码中,f(x)=x^2,F(x)是它的逆导数(x^3/3):

代码语言:javascript
复制
int main() {
    int no_of_rects;
    double  a, b;

    printf("Number of subdivisions = ");
    scanf("%d", &no_of_rects);

    printf("a = ");
    scanf("%lf", &a);

    printf("b = ");
    scanf("%lf", &b);

    double dx = (b-a)/no_of_rects;

    double rectangular_riemann_sum = 0;

    int i;
    for (i=1;i<=no_of_rects;i++) {
        rectangular_riemann_sum +=  (f(a + (i-1)*dx)*dx);
    }

    double trapezoidal_riemann_sum = 0;

    int j;
    for (j=1;j<=no_of_rects;j++) {
        trapezoidal_riemann_sum += (1/2)*(dx)*(f(a + (j-1)*dx) + f(a + j*dx));
        printf("trapezoidal_riemann_sum: %lf\n", trapezoidal_riemann_sum);
    }

    double exact_integral = F(b) - F(a);
    double rect_error = exact_integral - rectangular_riemann_sum;
    double trap_error = exact_integral - trapezoidal_riemann_sum;

    printf("\n\nExact Integral: %lf", exact_integral);
    printf("\nRectangular Riemann Sum: %lf", rectangular_riemann_sum);
    printf("\nTrapezoidal Riemann Sum: %lf", trapezoidal_riemann_sum);
    printf("\n\nRectangular Error: %lf", rect_error);
    printf("\nTrapezoidal Error: %lf\n", trap_error);

    return 0;
}

其中:

代码语言:javascript
复制
double f(double x) {
    return x*x;
}

double F(double x) {
    return x*x*x/3;
}

我已经包含了数学和stdio头文件。实际情况是矩形riemann和是可以的,但是梯形riemann和由于某种原因总是为0。

有什么问题吗?是不是我的公式里有什么?还是我的代码?(顺便说一下,我是C语言的新手)

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-21 20:46:48

在此语句中:

代码语言:javascript
复制
trapezoidal_riemann_sum += (1/2)*(dx)*(f(a + (j-1)*dx) + f(a + j*dx));

1/2 ==为零,所以整个语句为零。至少将分子或分母更改为双精度形式,以获得双精度值。也就是说,1/2.01.0/21.0/2.0都可以工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48906002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档