辛普森積分法


定積分

函數 \(f(x)\) 在區間 \([l,r]\) 上的定積分 \(\int_{l}^{r} f(x) dx\) 指的是 \(f(x)\) 在區間 \([l,r]\) 內與 \(x\) 軸所圍成的區域的面積(\(x\)軸上方為正,下方為負)。

我們需要一種高效的求解這種積分的近似值的方法,於是就有了辛普森積分法

普通辛普森法

辛普森法的基本思想是將求解區間分成若干段,每一段都使用二次函數的積分公式來進行求解。

二次函數積分公式(辛普森公式):

對於一個二次函數\(f(x)=Ax^2+Bx+C\),有

\[\int_l^r f(x) {\mathrm d}x = \frac{(r-l)(f(l)+f(r)+4 f(\frac{l+r}{2}))}{6} \]

證(from OI-Wiki):

求積分可得

\[F(x)=\int_0^x f(x) {\mathrm d}x = \frac{a}{3}x^3+\frac{b}{2}x^2+cx+D \]

那么則有

\[\begin{aligned} \int_l^r f(x) {\mathrm d}x &= F(r)-F(l) \\ &= \frac{a}{3}(r^3-l^3)+\frac{b}{2}(r^2-l^2)+c(r-l) \\ &=(r-l)(\frac{a}{3}(l^2+r^2+lr)+\frac{b}{2}(l+r)+c) \\ &=\frac{r-l}{6}(2al^2+2ar^2+2alr+3bl+3br+6c)\\ &=\frac{r-l}{6}((al^2+bl+c)+(ar^2+br+c)+4(a(\frac{l+r}{2})^2+b(\frac{l+r}{2})+c)) \\ &=\frac{r-l}{6}(f(l)+f(r)+4f(\frac{l+r}{2})) \end{aligned} \]

然后我們通過套公式就可以寫出這樣一段代碼:

double simpson(double l, double r) {
    const double mid = (l + r) / 2;
    return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6; //f(x)為待求解的函數
}

自適應辛普森

普通的辛普森積分法為了保證精度,在時間效率上會很大地受到區間的限制。

問題在於:區間少了精度不夠,區間多了又太慢。

自適應辛普森做到了自動控制拆分區間的大小

double asr(double l, double r, double eps, double ans) {
    const double mid = (l + r) / 2;
    const double fl = simpson(l, mid), fr = simpson(mid, r);
    if (abs(fl + fr - ans) <= 15 * eps)
        return fl + fr + (fl + fr - ans) / 15;
    return asr(l, mid, eps / 2, fl) + asr(mid, r, eps / 2, fr);
}

到了這里,你就可以去做 Luogu P4525 【模板】自適應辛普森法1了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM