用C语言编程实现Sin(x)/sqrt(x)在0和无穷远之间的梯形规则数值积分

用C语言编程实现Sin(x)/sqrt(x)在0和无穷远之间的梯形规则数值积分,c,integration,numerical-methods,numerical-integration,C,Integration,Numerical Methods,Numerical Integration,在C编程中,我遇到了一个问题,即如何找到sinx/sqrtx的0到无穷大之间的积分的良好近似值。我试着用梯形法则。在我的代码中,我还希望用户输入一个精度值,例如0.001,其中输出值将精确到小数位数。这个代码出了什么问题 包括 包括 包括 int mainvoid { int i,N;//要在循环中交互的整数// 双h,x,y,精度,下限=0.0001,上限=10000,f0,fN; 印刷精度:; 扫描频率%lf,&精度; N=10; 双区域存储,新区域; 做{ 新面积=0.0; areast

在C编程中,我遇到了一个问题,即如何找到sinx/sqrtx的0到无穷大之间的积分的良好近似值。我试着用梯形法则。在我的代码中,我还希望用户输入一个精度值,例如0.001,其中输出值将精确到小数位数。这个代码出了什么问题

包括 包括 包括 int mainvoid { int i,N;//要在循环中交互的整数// 双h,x,y,精度,下限=0.0001,上限=10000,f0,fN; 印刷精度:; 扫描频率%lf,&精度; N=10; 双区域存储,新区域; 做{ 新面积=0.0; areastored=newarea;//areastored是我想要与计算为N个分区的新区域进行比较的区域,以检查新值的精度,看看它是否是更好的近似值// h=上限-下限/N-1; fN=sinupperLim/sqrtupperLim; f0=sinlowerLim/sqrtlowerLim;//在函数中计算的端点// 新面积=新面积+0.5*h*f0+fN; 对于int i=1;iprecision;//如果为false,则应具有达到所需精度的区域// printf积分的计算结果为:%lf\n,newarea;
} 如果你调试你的程序,你会看到

h = (upperLim - lowerLim)/N-1;
导致N=1250时的h值为负值

这导致了一个无休止的循环

for (x=lowerLim+h; x < upperLim; x+=h) {

如果你调试你的程序,你会看到

h = (upperLim - lowerLim)/N-1;
导致N=1250时的h值为负值

这导致了一个无休止的循环

for (x=lowerLim+h; x < upperLim; x+=h) {

您的代码中至少有两个错误

// ...
newarea = 0.0;                       // <-- It's initialized here
do {
    // ...
    h = (upperLim - lowerLim)/N-1;   // <-- This doesn't do what you think
    // ...
    // It's updated, but never reset 
    newarea = newarea + 0.5*h*(f0 + fN);
    // ...
} while ( ... );
您应该移动newarea=0.0;在循环内划线,并修改计算h的公式


还注意到,你有一个固定的上限1000,而对于这种类型的积分,你应该考虑一个增加的上限,或者可能是一个不均匀的网格间距。

在你的代码

中至少有两个错误。
// ...
newarea = 0.0;                       // <-- It's initialized here
do {
    // ...
    h = (upperLim - lowerLim)/N-1;   // <-- This doesn't do what you think
    // ...
    // It's updated, but never reset 
    newarea = newarea + 0.5*h*(f0 + fN);
    // ...
} while ( ... );
您应该移动newarea=0.0;在循环内划线,并修改计算h的公式


还注意到,你有一个固定的上限1000,而对于这种类型的积分,你应该考虑一个增加的上限,或者可能是一个不均匀的网格间距。

什么使你认为你的代码出了什么问题?@云诺奇我以前使用了一个积分计算器来帮助我计算出我的目标值。程序输出中弹出的值到处都是跳跃式的,而且程序通常不会停止。是什么让你认为你的代码出了问题?@Yunnosch我以前使用过一个积分计算器来帮助我计算出我的目标值。在程序输出中弹出的值到处都是非常不稳定的,而且程序通常不会停止。感谢您的帮助,我希望能够增加上限,而不是保持固定不变。为了实现这一点,你能为我提供进一步的指导吗?也可以更改为x=lowerLim+h;x