通过梯形法在C中进行整合

时间:2015-03-17 12:00:53

标签: c integrate

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

我需要找到N的值,它在使用double float时可以提供最高精度,我通过运行程序增加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);
}

2 个答案:

答案 0 :(得分:0)

iter()函数中,h为否定,导致x为负数。负数的sqrt()会返回NaN。此外,由于h为负数,x继续变小,因此总是小于y,这是无限循环的原因。< / p>

h是否定的,因为分母(N-1)出现在-0.5(N传入0.5)。

答案 1 :(得分:0)

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

作为一种技术,您使用h作为布尔值。它应该是double finish