【问题标题】:Integrating via trapezium rule in C在 C 中通过梯形规则积分
【发布时间】:2015-03-17 12:00:52
【问题描述】:

我正在尝试使用梯形规则将函数 1/((1+x^2)x^0.5) 集成在 0 和无穷大之间。

我需要找到在使用双浮点数时提供最高精度的 N 值,我通过运行程序来完成此操作,增加 N 的值,直到 N 的连续值给出的总数之间没有差异.但是我陷入了无限循环。

谢谢

贝丝

#include<stdio.h>
#include<math.h>
#include<float.h>

double inter(double x, double h, double y, double N, double total) 
{
        h=(y-x)/(N-1); 
        total= total +0.5*(1/((1+pow(x,2))*sqrt(x)));
        x=x+h;

    while (x<y)
        {
        total=total+(1/((1+pow(x,2))*sqrt(x)));
        x=x+h;
        //printf("t - %lf \n", total);
        //printf("x - %lf \n", x);
        }
    total= total +0.5*(1/((1+pow(x,2))*sqrt(x)));
    total=total*h;
    return total;
}

main()
{   
    double x,y,total,h,c,d,f,N, finish;
    x=DBL_EPSILON;
    y=331;
    total=0;
    N=0.5;
    c=inter(x,h,y,N,total);
    d=0;
    finish=0;

while(finish==0)
{
    d=inter(x,h,y,N,total);
    if(d==c)
    {
        finish=1;
    }
    else
    {
        c=d;
        d=0;
        h++;
        printf("%lf/n", h);
    }
}       

printf("%lf\n", d);
}

【问题讨论】:

  • 是否有可能h=(y-x)/(N-1) 最终将h 设置为零并且循环条件x&lt;y 永远不会变为假?
  • @Codor h 也可能变得非常小,以至于 x=x+h 由于浮点不准确而不会改变 x

标签: c integrate


【解决方案1】:

在您的 iter() 函数中,h 是负数,这会导致 x 变为负数。负数的sqrt() 返回NaN。此外,由于h 为负数,x 不断变小,因此总是小于y,这就是死循环的原因。

h 是负数,因为分母 (N-1) 等于 -0.5(N 作为 0.5 传入)。

【讨论】:

    【解决方案2】:

    double h 尚未初始化。您将它作为函数参数传递,然后将其覆盖以用作局部变量。但是,在主循环中,您递增h(使用++ 运算符,这将是h+=1 更好)然后再次将其传递给函数,但它没有效果,因为h 仍然被覆盖在函数中。

    作为一个技术点,您使用double finish 作为布尔值。应该是int finish

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2021-07-12
      • 2015-06-21
      • 1970-01-01
      • 2014-10-10
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多