[学习笔记]自适应辛普森(Simpson)积分

本文介绍了积分的概念,重点讲解了辛普森公式,并探讨了处理积分精度问题的方法,提出自适应辛普森积分的思想。通过将区间动态划分以满足精度需求,避免了过多计算导致的时间过长问题。同时,给出了简洁的代码实现,并举例说明了该方法在求解平面几何图形面积和正态分布概率等领域的应用。

一、积分的概念

积分(integral)的几何意义是函数的曲线上 xx 的一段区间与 x 轴围成的曲边梯形的面积:
这里写图片描述
xx 的区间为 [a,b] ,那么上图阴影面积为:

baf(x)dx∫abf(x)dx

计算方法一:分割成无穷多个小区间。
baf(x)dx=limni=1nbanf(a+bani)∫abf(x)dx=limn→∞∑i=1nb−anf(a+b−ani)

计算方法二:牛顿-莱布尼茨公式。
F(x)=f(x)F′(x)=f(x) ,那么
baf(x)dx=F(b)F(a)∫abf(x)dx=F(b)−F(a)

如果容易求出 nn 趋近于无穷大时 f 的和,可以使用方法一,如 f(x)=x2f(x)=x2
而这时 f(x)=1xf(x)=1x 就不适用。
如果容易求得 FF ,可以使用方法二,如 f(x)=1x
但如果两个特点都不满足,那么两种方法都无法使用。
于是,我们引入了数值积分
最常用的就是自适应辛普森积分。

二、辛普森公式

基本思想就是把复杂的函数 ff 近似成二次函数。

abf(x)dxab(Ax2+Bx+C)dx

=A3(b3a3)+B2(b2a2)+C(ba)=A3(b3−a3)+B2(b2−a2)+C(b−a)

=2A(b3a3)+3B(b2a2)+6C(ba)6=2A(b3−a3)+3B(b2−a2)+6C(b−a)6

=2A(ba)(b2+ab+a2)+3B(b+a)(ba)+6C(ba)6=2A(b−a)(b2+ab+a2)+3B(b+a)(b−a)+6C(b−a)6

=(ba)(2Ab2+2Aab+2Aa2+3Bb+3Ba+6C)6=(b−a)(2Ab2+2Aab+2Aa2+3Bb+3Ba+6C)6

=(ba)(Aa2+Ba+C+Ab2+Bb+C+Aa2+2Aab+Ab2+2Bb+2Ba+4C)6=(b−a)(Aa2+Ba+C+Ab2+Bb+C+Aa2+2Aab+Ab2+2Bb+2Ba+4C)6

=(ba)(f(a)+f(b)+A(a+b)2+2B(a+b)+4C)6=(b−a)(f(a)+f(b)+A(a+b)2+2B(a+b)+4C)6

=(ba)(f(a)+f(b)+4(A(a+b2)2+B(a+b2)+C))6=(b−a)(f(a)+f(b)+4(A(a+b2)2+B(a+b2)+C))6

=(ba)(f(a)+f(b)+4f(a+b2))6=(b−a)(f(a)+f(b)+4f(a+b2))6

我们得到辛普森公式:
baf(x)dx(ba)(f(a)+f(b)+4f(a+b2))6∫abf(x)dx≈(b−a)(f(a)+f(b)+4f(a+b2))6

bab−a 的值越小,上式两边越接近。

三、处理精度问题

有了 Simpson 公式,一个自然的想法是把积分区间拆成多个小区间后求和。
但是分成区间的个数和长度因积分区间和精度要求甚至被积函数而异。
换句话说,分的区间数太少不满足精度要求,太多了会 TLE 。
「自适应」就是求积分时能够自动控制切割的区间大小和长度,使精度能满足要求。
具体地: solve(l,r,f)solve(l,r,f) 表示求 rlf(x)dx∫lrf(x)dx
(1)取 mid=l+r2mid=l+r2
(2)用 Simpson 公式近似计算 f(x)f(x) 在区间 [l,mid][l,mid] 和区间 [mid,r][mid,r] 内的积分,分别为 lslsrsrs ,及 [l,r][l,r] 的近似积分 sumsum
(3)如果 ls+rsls+rssumsum 的误差允许,则返回 sumsum
(4)否则递归 solve(l,mid)solve(l,mid)solve(mid,r)solve(mid,r) ,返回这两个递归计算结果的和。

四、代码

很短。

double solve(double L, double R, double ans) {
    double mid = (L + R) / 2, l = simpson(L, mid), r = simpson(mid, R);
    if (fabs(l + r - ans) <= eps) return ans;
    return solve(L, mid, l) + solve(mid, R, r);
}

五、应用

  • 求平面几何图形的面积并
  • 求正态分布概率
  • etc.
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值