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