Skip to main content

积分

Summary

数值积分给出辛普森积分法,用一段二次抛物线拟合被积函数,得到区间积分的近似式 (b−a)/6 乘 f(a)+4f((a+b)/2)+f(b)。自适应辛普森递归地把区间二分,当左右两半的辛普森值之和与整段足够接近时停止,否则继续细分,从而在保证精度的同时控制计算量。给出 simpson 与 asr 两个函数的实现,调用时传入被积函数与初始区间即可求出定积分。

参考资料​

辛普森积分法​

∫abf(x)dx≈b−a6[f(a)+4f(a+b2)+f(b)]\int_a^b f(x)\mathrm{d}x\approx\frac{b-a}{6}\left[f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right]

辛普森法用一段二次抛物线拟合被积函数,得到上面的近似式。自适应辛普森 递归地把区间二分:当左右两半的辛普森值之和与整段足够接近时停止,否则继续细分,从而在保证精度的同时控制计算量。下面的 f 为被积函数,调用 asr(l,r,eps,simpson(l,r)) 即得 [l,r][l,r] 上的积分。

318 Bcpp
double simpson(double l,double r)
{
double mid=(l+r)/2;
return (r-l)*(f(l)+4*f(mid)+f(r))/6;
}
double asr(double l,double r,double eps,double s)
{
double mid=(l+r)/2;
double sl=simpson(l,mid),sr=simpson(mid,r);
if(fabs(sl+sr-s)<=15*eps)return sl+sr+(sl+sr-s)/15;
return asr(l,mid,eps/2,sl)+asr(mid,r,eps/2,sr);
}

例题​

试计算积分:

∫LRcx+dax+bdx\displaystyle{\int_L^R\frac{cx+d}{ax+b}\mathrm{d}x}

结果保留至小数点后 66 位。

给定实数 aa,计算积分 ∫0∞xax−xdx\displaystyle{\int_0^\infty x^{\frac{a}{x}-x}\mathrm{d}x}。若积分发散,请输出 orz。(∣a∣≤50|a|\le 50)