在 C 中通过梯形规则积分

Integrating via trapezium rule in C

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

我需要找到使用双浮点数时可能提供最高精度的 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);
}

在您的 iter() 函数中,h 为负数,这导致 x 变为负数。 sqrt() 的负数 returns NaN。此外,由于 h 为负,x 继续变小,因此 总是 小于 y,这是无穷大的原因循环。

h是负数,因为分母(N-1)出来是-0.5(N传入0.5)。

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

作为技术要点,您将 double finish 用作布尔值。应该是 int finish.