近來學了這個知識,似乎沒有想象中的那麼難。
已知$f(x)$, 求定積分$$\int_^f(x)dx$$
容易從上面的推導過程發現,辛普森公式是以二次曲線逼近的方式取代矩形或梯形的積分公式。那麼如果要求$\int_^f(x)dx$,可以將$[l,r]$分成若干$[l,r]$,但如果$r-l$過大,精度就無法保證;而如果$r-l$過小,時間吃不消。
因此有了自適應辛普森法,可以自動控制區間分割的大小,以保證精度。
實現就是二分遞迴的過程,如果$\int_^f(x)dx+\int_^f(x)dx$與$\int_^f(x)dx$的差小於需要的精度就結束遞迴,注意這個精度在遞迴時也是需要改變的。
具體細節看**。
辛普森法其實是一種近似的方法,有可能被刻意針對。下圖中三個點在同一二次函式上,這樣就會錯。
[noi2005]月下檸檬樹
圓的投影還是圓,圓台的側面投影下去就是底面和頂面投影的切線,圍成的圖形就是梯形,把圓和梯形表示出來,用辛普森積分法求解即可。
#include#includeview code#include
#include
#include
using
namespace
std;
const
int maxn = 505
;const
double eps = 1e-9
;int
n;double
h[maxn];
bool
b[maxn];
struct
circc[maxn];
struct
tpzda[maxn];
double calc(double
x)
for(int i = 1; i <= n; ++i)
if(b[i] && a[i].l - eps < x && a[i].r + eps >x)
return
ret;
}double calc2(double l, double
r)double solve(double l, double r, double epsn, double
las)
intmain()
for(int i = 1; i <= n; ++i)
printf(
"%.2f
", 2 * solve(l, r, 1e-4
, calc2(l, r)));
return0;
}
辛普森積分法
定義 辛普森法則 simpson s rule 是一種數值積分方法,是牛頓 寇次公式的特殊形式,以二次曲線逼近的方式取代矩形或梯形積分公式,以求得定積分的數值近似解。其近似值如下 注 辛普森法則是數值分析領域中乙個非常簡單好用的近似求解函式區間上的一種方法,概括起來,它是將區間端點和區間中點做對應的...
Erlang 並行梯度積分法
這個 寫了兩天,從沒思路到有思路,還好最終搞定了 不過這個程序數必須為2 n個。先貼乙個執行截圖 子程序求部分和 child proces f,x1,width,0,sum,n1 io format p s result is p n self sum loop send get sum child...
Mathemaitca做蒙特卡羅積分法
目錄蒙特卡羅積分法是一種利用模擬來近似計算定積分值 int a b f x dx 的一種方法 公式是 int f x mathrm x frac sum frac right right quad x sim p x right 是隨機變數服從分布的pdf在 x 處的值 這裡以計算 int 0 pi...