如何在 C 中实现具有无限限制的梯形积分?
How to implement Trapezoidal Integration with Infinite Limits in C?
我正在尝试创建一个 c 程序来对 0 和无穷大之间的 sin(x)/sqrt(x) 进行积分。当函数趋于无穷大时,我通过切断端点来使用梯形规则。
但是返回的总金额太高,我不知道为什么。这是代码:
#include<math.h>
#include<stdio.h>
double func(double u)
{ double a;
a = ((sin(u))/(sqrt(u)));
return a;}
void main()
{
int i, N;
double sum, u, a, b, h, Fa, Fb, F;
printf("Enter value of N\n");
scanf("%d" ,&N);
a=0.01;
b=1000;
h=(b-a)/(N-1);
sum=0;
F=func(a);
u=a;
for(i=0; i<N; i++)
{
sum=sum+F;
u=u+h;
F=fabs(func(u));
}
Fa=func(a);
Fb=func(b);
sum=sum-(0.5*Fa)-(0.5*Fb);
sum=sum*h;
printf("I: %lf\n", sum);
}
有什么想法吗?
只需删除 F=fabs(func(u));
行中的 fabs
。
你应该在最后使用 int main(void)
和 return 0;
而不是 void main()
。
您的问题在线
F=fabs(func(u));
您真正想要集成 func
的是
F=func(u);
在这种情况下,我认为问题在于 fabs(func(u))
在无穷大处不可积,因此您的算法会发散。
我正在尝试创建一个 c 程序来对 0 和无穷大之间的 sin(x)/sqrt(x) 进行积分。当函数趋于无穷大时,我通过切断端点来使用梯形规则。
但是返回的总金额太高,我不知道为什么。这是代码:
#include<math.h>
#include<stdio.h>
double func(double u)
{ double a;
a = ((sin(u))/(sqrt(u)));
return a;}
void main()
{
int i, N;
double sum, u, a, b, h, Fa, Fb, F;
printf("Enter value of N\n");
scanf("%d" ,&N);
a=0.01;
b=1000;
h=(b-a)/(N-1);
sum=0;
F=func(a);
u=a;
for(i=0; i<N; i++)
{
sum=sum+F;
u=u+h;
F=fabs(func(u));
}
Fa=func(a);
Fb=func(b);
sum=sum-(0.5*Fa)-(0.5*Fb);
sum=sum*h;
printf("I: %lf\n", sum);
}
有什么想法吗?
只需删除 F=fabs(func(u));
行中的 fabs
。
你应该在最后使用 int main(void)
和 return 0;
而不是 void main()
。
您的问题在线
F=fabs(func(u));
您真正想要集成 func
的是
F=func(u);
在这种情况下,我认为问题在于 fabs(func(u))
在无穷大处不可积,因此您的算法会发散。