版权声明:转吧转吧这条东西只是来搞笑的。。 https://blog.csdn.net/jpwang8/article/details/88218534
BG
今天没题做,来康点好康的
正题
我们要求
∫abf(x)dx
方法一:
∫abf(x)dx=n→+∞limi=1∑nf(a+ni)⋅n1
方法二:
∫abf(x)dx=F(b)−F(a),满足F′(x)=f(x)
以上是中学课本内容
方法三:
辛普森积分只能用来算有限精度的实数
我们用二次函数拟合某一个函数
f(x),即令
f(x)≈Ax2+Bx+C
那么:
∫abf(x)dx≈∫ab(Ax2+Bx+C)dx
又有
∫ab(Ax2+Bx+C)dx=3A(b3−a3)+2B(b2−a2)+C(b−a)
化简得到
原式=6(b−a)(2Ab2+2Aab+2Aa2+3Bb+3+6C)=6(b−a)(f(a)+f(b)+4f(2a+b))
所谓自适应就是加入判断精度的流程使得结果更加合理
我们发现这个东西的精度和
b−a有关,那么递归做就可以了
具体说来就是f(a,b)表示a到b的积分,f(a,b)=f(a,mid)+f(mid,b)这样递归
精度的话我们用辛普森积分算出(a,mid)和(mid,b),与(a,b)比较,如果相差在允许范围内退出就行了
Code
double solve(double l,double r) {
double mid=(l+r)*0.5;
if (f(l,mid)+f(mid,r)-f(l,r)<eps) return f(l,r);
return solve(l,mid)+solve(mid,r);
}