a 了這道超短的紫題,來發表一下自己的一些想法...
首先泰勒展開大家都聽說過吧?【霧
沒聽說過?安利某知乎回答:蒼老師教你如何更好地記憶泰勒展開
然後你就知道了,泰勒展開其實是對於某個函式在乙個點不斷去高階求導,然後用求導得到的資訊構造乙個多項式,使得這個多項式在一定範圍內幾乎和原函式擬合(可以理解為接近重合的意思吧...)
那麼其實自適應辛普森也是類似的道理,只不過它是用了分治的方法去構造這個 假 擬合 多項式(其實就是二次函式,究其原因應該就是這玩意兒比較好積分並且存在弧度,容易擬合吧...)
至於為什麼前面加了個自適應呢?因為我們考慮分治是要有終止條件的(像對於乙個序列分治的話就是分治的區間長度為 1 時停止),但是我們這裡是在實數域上擬合乙個多項式啊,不存在什麼規定的終止點...
於是我們考慮怎樣去設定終止條件?那當然是給定乙個誤差範圍(比如 1e-6),然後如果擬合函式和原函式大多數點的 y 值誤差不超過這個範圍就終止分治,直接拿當前的函式去積分就好了,當然具體怎麼比較的先別管(你看到下面之後會發現根本不需要比較兩個函式 2333 )
然後我們發現這個誤差越大答案越不準確,越小跑的越慢,那麼我們就要調整這個誤差範圍,然後這樣的過程就有點像"自適應"了
我們先將原函式約等於成乙個二次多項式:
\[f(x)≈ax^2+bx+c
\]然後題目要我們求的東西也轉化一下:
\[ans=\int_a^b f(x)dx
\]\[≈\int_a^b ax^2+bx+c
\]\[=(b^3-a^3) + (b^2-a^2) +c(b-a)
\]\[= [ 2a(b^2+ab+a^2) + 3b(b+a)+6c]
\]\[= [ (aa^2 + ba+c) + (ab^2+bb+c)+4(~a~()^2 + b ()+c)]
\]\[≈ [~ f(a) + f(b) + 4~f()~]
\]恩?你問我推導**來的? 大佬%%%
我們發現最後約回去了,a b c 都不見了,而且這時候式子裡面已經沒有積分了...
沒錯,我們發現上面其實根本不需要用到這個擬合二次函式的具體係數 a、b、c ,只需要將 f 的式子帶入計算求值就好了
但是這樣的話我們發現之前說的終止條件不見了,因為我們的擬合函式已經不需要了(而且找出來也很麻煩...)
其實我們只需要比較當前區間 \([a,b]\) 不分治時候的答案 \(ans\) 和 分治下的答案 \(ansl+ansr\) 的誤差是否超過了我們設定的精度範圍就好了
至於正確性?(我怎麼知道)
因為我們知道這個分治肯定是層數越多越精確的,所以分治的結果精確度肯定高於當前 ans 的精確度,那麼我們卡卡精度就能讓答案在誤差允許範圍內了
faq: mmp 原來真的不用比較原函式和擬合函式...
如果要比較的話又能怎麼比較呢?反正我是不會的...**超級短!相應的我們可以知道這裡我們只需要將 f 函式改一改就能解決其他函式的積分問題了(一定精度下)
//by judge
#include#define db double
using namespace std;
db a,b,c,d,l,r;
inline db f(db x)
inline db simpson(db l,db r)
db asr(db l,db r,db eps,db ans)
inline db asr(db l,db r,db eps)
int main()
自適應辛普森
辛普森定理 對於一段函式f在 l,r 範圍內的面積 r,l f x dx,我們可以由辛普森定理得到下列式子 是積分的意思 即 r,l f x dx r l 6 f l 4f l r 2 f r 但問題是這樣做是把f x 在 l,r 範圍內看做乙個二次函式來算的,所以精度並不高。因此,我們需要一種可以...
自適應辛普森積分
寫在前面方便複習 例題 題目大意 給定 a,b l,r a,b,l,r a,b,l,r 求橢圓 x2a 2 y2 b2 1 frac frac 1 a2x2 b2y2 1 在 l,r l,r l,r 的積分 題目分析 題目所求即為 2 l rb1 x2a2 dx 2 int l rb sqrt dx...
自適應辛普森積分
乙個完全不會計算幾何的蒟蒻的自我拯救 有的時候會有一些毒瘤計算幾何題,要求的圖形面積邊緣是一段函式,而這個函式解析式通常非常繁瑣,沒辦法直接用公式積分,所以就需要用辛普森積分求近似值。辛普森積分的用途就是在精度要求不高的時候 通常是求圖形面積 求函式積分的近似值,大概步驟就是在積分區間 a,b 中不...