一、積分的概念
積分(integral)的幾何意義是函數的曲線上 x 的一段區間與 x 軸圍成的曲邊梯形的面積:
x 的區間爲 [a,b] ,那麼上圖陰影面積爲:
∫baf(x)dx
計算方法一:分割成無窮多個小區間。
∫baf(x)dx=limn→∞∑i=1nb−anf(a+b−ani)
計算方法二:牛頓-萊布尼茨公式。
若
F′(x)=f(x) ,那麼
∫baf(x)dx=F(b)−F(a)
如果容易求出
n 趨近於無窮大時
f 的和,可以使用方法一,如
f(x)=x2 。
而這時
f(x)=1x 就不適用。
如果容易求得
F ,可以使用方法二,如
f(x)=1x 。
但如果兩個特點都不滿足,那麼兩種方法都無法使用。
於是,我們引入了
數值積分。
最常用的就是自適應辛普森積分。
二、辛普森公式
基本思想就是把複雜的函數 f 近似成二次函數。
∫baf(x)dx≈∫ba(Ax2+Bx+C)dx
=A3(b3−a3)+B2(b2−a2)+C(b−a)
=2A(b3−a3)+3B(b2−a2)+6C(b−a)6
=2A(b−a)(b2+ab+a2)+3B(b+a)(b−a)+6C(b−a)6
=(b−a)(2Ab2+2Aab+2Aa2+3Bb+3Ba+6C)6
=(b−a)(Aa2+Ba+C+Ab2+Bb+C+Aa2+2Aab+Ab2+2Bb+2Ba+4C)6
=(b−a)(f(a)+f(b)+A(a+b)2+2B(a+b)+4C)6
=(b−a)(f(a)+f(b)+4(A(a+b2)2+B(a+b2)+C))6
=(b−a)(f(a)+f(b)+4f(a+b2))6
我們得到辛普森公式:
∫baf(x)dx≈(b−a)(f(a)+f(b)+4f(a+b2))6
b−a 的值越小,上式兩邊越接近。
三、處理精度問題
有了 Simpson 公式,一個自然的想法是把積分區間拆成多個小區間後求和。
但是分成區間的個數和長度因積分區間和精度要求甚至被積函數而異。
換句話說,分的區間數太少不滿足精度要求,太多了會 TLE 。
「自適應」就是求積分時能夠自動控制切割的區間大小和長度,使精度能滿足要求。
具體地: solve(l,r,f) 表示求 ∫rlf(x)dx 。
(1)取 mid=l+r2 。
(2)用 Simpson 公式近似計算 f(x) 在區間 [l,mid] 和區間 [mid,r] 內的積分,分別爲 ls 和 rs ,及 [l,r] 的近似積分 sum 。
(3)如果 ls+rs 與 sum 的誤差允許,則返回 sum 。
(4)否則遞歸 solve(l,mid) 和 solve(mid,r) ,返回這兩個遞歸計算結果的和。
四、代碼
很短。
double solve(double L, double R, double ans) {
double mid = (L + R) / 2, l = simpson(L, mid), r = simpson(mid, R);
if (fabs(l + r - ans) <= eps) return ans;
return solve(L, mid, l) + solve(mid, R, r);
}
五、應用