【筆記】辛普森演算法

CloudWings發表於2024-07-19

核心思想是將被積區間分為若干小段,每段套用二次函式的積分公式進行計算。

具體而言,對於一個二次函式 \(f(x)\),有:

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

1 普通辛普森

直接分成若干段來計算。

2 自適應辛普森

對於 \(f(x)\) 的一個區間,可能她本身就和二次函式長的很像,我們也沒必要再細分她。

具體而言,對於一個區間,如果分成左右兩半分別計算,和直接計算整個區間的答案是差不多的,那就不在分下去。

double f (double x) {
	
}
double simpson (double l, double r) {
	return (r-l) * (f(l) + 4*f((l+r)/2) + f(r)) / 6;
}
double calc (double l, double r, double eps, double ans, int step) {
	double mid = (l + r) / 2;
	double fl = simpson(l, mid), fr = simpson(mid, r);
	if (abs(fl + fr - ans) <= 15 * eps && step < 0)
		return fl + fr + (fl + fr - ans) / 15;
	return calc(l, mid, eps / 2, fl, step - 1) + calc(mid, r, eps / 2, fr, step - 1);
}
calc(l, r, eps, simpson(l, r), 12);

相關文章