在 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
.
我正在尝试使用梯形规则在 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
.