概述
一个骗分的工具(一般辛普森自适应积分可解决的问题都有更优的准确解做法)
用于计算一定精度范围内数值积分
基本思想是转一定区间内函数为二次函数计算值,二分迭代知道精度满足误差
辛普森公式
\[ \begin{split} \int_a^bf(x)dx&\approx\int_a^bAx^2+Bx+C\\ &=\frac{A}{3}(b^3-a^3)+\frac{B}{2}(b^2-a^2)+C(a-b)\\ &=\frac{(b-a)}{6}[2A(b^2+ab+a^2)+3B(b+a)+6C]\\ &=\frac{(b-a)}{6}(2Ab^2+2Aab+2Aa^2+3Bb+3Ba+6C)\\ &=\frac{(b-a)}{6}[Aa^2+Ba+C+Ab^2+Bb+C+4A(\frac{a+b}{2})^2+4B(\frac{a+b}{2})+4C]\\ &=\frac{(b-a)}{6}(f(a)+f(b)+4f(\frac{a+b}{2})) \end{split} \]
\(e.g.\)求半径为\(r\)的球体积
\(S_1=0,S_0=\pi r^2,S_2=0,h=2r\)
\(V=\frac{h}{6}*4\pi r^2=\frac{2\pi r^2h}{3}\)
inline double Calc(re double l,re double r){re double mid=(l+r)/2.;return (r-l)/6.*(f(l)+f(r)+4.*f(mid));}
inline double Simpson(re double l,re double r){
re double mid=(l+r)/2.,s1=Calc(l,r),s2=Calc(l,mid)+Calc(mid,r);
if(fabs(s2-s1)
对于\(f\)具体实现即可
例题
\(\mathtt{BSOJ1805}\):求一些圆的面积并
\(f(x_0)\)就是与\(l:x=x_0\)相交的线段长,直接套Simpson
\(\mathtt{BSOJ2250}\):求一棵由圆台、圆锥组成的树在平行光下的阴影面积
考虑圆台\(\Rightarrow\)圆+梯形,圆锥\(\Rightarrow\)圆+三角形
我们需要确定这些梯形,三角形位置就等价于求解公切线交点