辛普森自适应积分

概述

一个骗分的工具(一般辛普森自适应积分可解决的问题都有更优的准确解做法)

用于计算一定精度范围内数值积分

基本思想是转一定区间内函数为二次函数计算值,二分迭代知道精度满足误差

辛普森公式

\[ \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\)圆+三角形

我们需要确定这些梯形,三角形位置就等价于求解公切线交点

你可能感兴趣的:(辛普森自适应积分)