自适应辛普森积分学习小记

版权声明:转吧转吧这条东西只是来搞笑的。。 https://blog.csdn.net/jpwang8/article/details/88218534

BG


今天没题做,来康点好康的

正题


我们要求 a b f ( x ) d x \int_{a}^{b}{f(x)dx}
方法一:
a b f ( x ) d x = lim n + i = 1 n f ( a + i n ) 1 n \int_{a}^{b}{f(x)dx}=\lim\limits_{n\to +\infty}^{}\sum_{i=1}^{n}f(a+\frac{i}{n})\cdot \frac{1}{n}
方法二:
a b f ( x ) d x = F ( b ) F ( a )    F ( x ) = f ( x ) \int_{a}^{b}{f(x)dx}=F(b)-F(a),\; 满足F'(x)=f(x)

以上是中学课本内容

方法三:
辛普森积分只能用来算有限精度的实数
我们用二次函数拟合某一个函数 f ( x ) f(x) ,即令 f ( x ) A x 2 + B x + C f(x)\approx Ax^2+Bx+C
那么: a b f ( x ) d x a b ( A x 2 + B x + C ) d x \int_{a}^{b}{f(x)dx}\approx\int_{a}^{b}{(Ax^2+Bx+C)dx}
又有 a b ( A x 2 + B x + C ) d x = A 3 ( b 3 a 3 ) + B 2 ( b 2 a 2 ) + C ( b a ) \int_{a}^{b}{(Ax^2+Bx+C)dx}=\frac{A}{3}(b^3-a^3)+\frac{B}{2}(b^2-a^2)+C(b-a)
化简得到 = ( b a ) ( 2 A b 2 + 2 A a b + 2 A a 2 + 3 B b + 3 + 6 C ) 6 = ( b a ) ( f ( a ) + f ( b ) + 4 f ( a + b 2 ) ) 6 原式=\frac{(b-a)(2Ab^2+2Aab+2Aa^2+3Bb+3+6C)}{6}=\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6}

所谓自适应就是加入判断精度的流程使得结果更加合理

我们发现这个东西的精度和 b a 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);
}

猜你喜欢

转载自blog.csdn.net/jpwang8/article/details/88218534