数值积分与数值微分方法比较_数值积分和微分

b42e86269b307ee49ea8cd72a76d314f.png

积分

针对

equation?tex=f%3A+%5Cmathbb%7BR%7D+%5Cto+%5Cmathbb%7BR%7D

黎曼和

记得我第一次看 黎曼和/黎曼积分 的时候觉得真是有意思,觉得这个东西很不言自明,我们推推导积分的时候从有限小到无限小,而当我们为了计算机计算,又从无穷小到可衡量的有限小。有意思。

积分也就是求和。而且觉得这一切都和 中值定理 有着千丝万缕的联系,o(╯□╰)o :

对一个在闭区间 [a,b]有定义的实值函数f, f关于取样分割
equation?tex=+x_%7B0%7D%2C%5Cldots+%2Cx_%7Bn%7D%E3%80%81t_%7B0%7D%2C%5Cldots+%2Ct_%7Bn-1%7D 的黎曼和(积分和)定义为以下和
equation?tex=%5Csum+_%7Bi%3D0%7D%5E%7Bn-1%7Df%28t_%7Bi%7D%29%28x_%7Bi%2B1%7D-x_%7Bi%7D%29%5C%5C

和式中的每一项是子区间长度
equation?tex=+x_%7Bi%2B1%7D-x_%7Bi%7D 与在 $t_{i}$ 处的函数值
equation?tex=f%28t_%7Bi%7D%29 的乘积。直观地说,就是以标记点
equation?tex=t_%7Bi%7D 到 X轴 的距离为高,以分割的子区间为长的矩形的面积。

9017052548ad4b581635135a6a30a90e.png
图片来自wikipedia

在上图中,

equation?tex=f%28t_i%29 选择分别为 左端、右端、极小值、极大值。

梯形法则

在一个‘小区间’我们就能玩出很多花样:

d7d4c818eff69cd2d0cb508caaeb879a.png
图片来自wikipedia

比如我们如果取两端来估算 面积 的话:

equation?tex=%7B%5Cdisplaystyle+%5Cint+%5Climits+_%7Ba%7D%5E%7Bb%7Df%28x%29dx%5Capprox+%7B%5Cfrac+%7Bb-a%7D%7B2%7D%7D%5Bf%28a%29%2Bf%28b%29%5D%7D+%5C%5C

我们也可以取区间中点的高度来估计 面积:

equation?tex=%7B%5Cdisplaystyle+%5Cint+%5Climits+_%7Ba%7D%5E%7Bb%7Df%28x%29dx%5Capprox+%28b-a%29f%28%7B%5Cfrac+%7Ba%2Bb%7D%7B2%7D%7D%29%7D%5C%5C

以上都被称为 梯形法则(Trapezoidal rule),这里可以是整个函数,也可以只是一个小区间,我们可以用黎曼和来对待小区间:

  1. 分割许多小区间
  2. 把小区间加起来

f01d3ad2cd417b63017ba0b6fcd9bdb9.png
图片来自wikipedia

辛普森法则

辛普森法则(Simpson's rule)是一种数值积分方法,是牛顿-寇次公式的特殊形式,以二次曲线逼近的方式取代矩形或梯形积分公式,以求得定积分的数值近似解。其近似值如下:

equation?tex=%5Cint_%7Ba%7D%5E%7Bb%7D+f%28x%29+%5C%2C+dx+%5Capprox+%5Cfrac%7Bb-a%7D%7B6%7D%5Cleft%5Bf%28a%29+%2B+4f%5Cleft%28%5Cfrac%7Ba%2Bb%7D%7B2%7D%5Cright%29%2Bf%28b%29%5Cright%5D+%5C%5C

bbb6a3c9051925591acf786ead35cc9c.png
图片来自wikipedia

辛普森法则可以令

equation?tex=f%28x%29+%3D+A+x%5E2+%2B+Bx++%2B+C 然后推导出来。

同样也可以分割小区间然后求和。

实际上上面两种无非是采取了不不同的近似,梯形法则 使用直线来近似原函数, 辛普森法则 使用二次曲线来 近似原函数。它们都是 牛顿-柯特斯公式(Newton-Cotes rule / Newton-Cotes formula) 的特殊形式。

牛顿-柯特斯公式

还有一些有趣的看法,比如我们始终是利用 n 个离散的点的值来得到积分结果 - 一个数字,那么积分总可以写成这样:

equation?tex=%5Cint+_%7Ba%7D%5E%7Bb%7Df%28x%29%5C%2Cdx%5Capprox+%5Csum+_%7B%7Bi%3D0%7D%7D%5E%7Bn%7Dw_%7Bi%7D%5C%2Cf%28x_%7Bi%7D%29+%5C%5C

这种看法的原理是:

  • 假设已知
    equation?tex=f%28x_%7B0%7D%29%2Cf%28x_%7B1%7D%29%2C%5Cdots+%2Cf%28x_%7Bn%7D%29 的值。
  • 以n+1点进行插值,求得对应 f(x)的拉格朗日多项式。
  • 对该n次的多项式求积。

该积分便可以作为

equation?tex=%5Cint+_%7Ba%7D%5E%7Bb%7Df%28x%29%5C%2Cdx 的近似,而由于该拉格朗日多项式的系数都是常数(由n决定其值),所以积函数的系数(即
equation?tex=w_i )都是常数。

或者就这样写:

equation?tex=%5Cbegin%7Balign%2A%7D+%5Cint_a%5Eb+f%28x%29dx+%26%3D+%5Cint_a%5Eb+%5Cbigg%5B+%5Csum_i+a_i+%5Cphi_i%28x%29%5Cbigg%5D+dx++%5C%5C+%26%3D%5Csum_i+a_i+%5Cbigg%5B+%5Cint_a%5Eb++%5Cphi_i%28x%29%5Cbigg%5D+dx%5C%5C+%26%3D+%5Csum_i+c_i+a_i%2C+%5Ctext%7B+for+%7D+c_i+%5Cequiv+%5Cint_a%5Eb+%5Cphi_i%28x%29+dx+%5Cend%7Balign%2A%7D%5C%5C

然后我们就可以写出方程组:

equation?tex=w_1+%5Ccdot+1+%2B+w_2+%5Ccdot+2+%2B+%5Ccdots+%2B+w_n+%5Ccdot+1+%3D+%5Cint_a%5Eb+1dx+%3D+b+-+a+%5C%5C+w_1+%5Ccdot+x_1+%2B+w_2+%5Ccdot+x_2+%2B+%5Ccdots+%2B+w_n+%5Ccdot+x_n+%3D+%5Cint_a%5Eb+xdx+%3D+%28b%5E2+-+a%5E2%29%2F2+%5C%5C+%5Cvdots+%5C%5C+w_1+%5Ccdot+x_1%5E%7Bn-1%7D+%2B+w_2+%5Ccdot+x_2%5E%7Bn-1%7D+%2B+%5Ccdots+%2B+w_n+%5Ccdot+x_n%5E%7Bn-1%7D+%3D+%5Cint_a%5Eb+x%5E%7Bn-1%7Ddx+%3D+%28b%5En+-+a%5En%29%2Fn+%5C%5C

然后也就是一个解线性方程组的问题。

这个方法明显会有 高阶多项式震荡的厉害的 龙格现象, 我还是更喜欢拆小区间,然后再组合小区间的做法。

精确度

用 拆小区间再复合 梯形法则的精确度是

equation?tex=O%28%5CDelta+x%5E2%29 , 辛普森 的精确度是
equation?tex=O%28%5CDelta+x%5E4%29

针对

equation?tex=f%3A+%5Cmathbb%7BR%7D%5Ek+%5Cto+%5Cmathbb%7BR%7D , 好像针对多元函数,蒙特卡洛积分比较常见/用一点。

微分

关于微分,我们首先也可以用插值类似的思想来看

equation?tex=f%27%28x%29+%3D+%5Csum_i+a_i+%5Cphi_i%27%28x%29%5C%5C

这是有限元的思想。

当然更简单的就是我们直接从定义入手:

equation?tex=f%27%28x%29+%3D+%5Clim_%7Bh+%5Cto+0%7D+%5Cfrac%7Bf%28x%2Bh%29+-+f%28x%29%7D%7Bh%7D+%5C%5C

选择比较小的h, 得到 前向差分公式:

equation?tex=f%27%28x%29+%5Capprox++%5Cfrac%7Bf%28x%2Bh%29+-+f%28x%29%7D%7Bh%7D+%5C%5C

也可以从 x 向后 得到 后向差分公式:

equation?tex=f%27%28x%29+%5Capprox+%5Cfrac%7Bf%28x%29+-+f%28x-h%29%7D%7Bh%7D+%5C%5C

以上两个式子本质都是用的泰勒展开:

equation?tex=f%28x%2Bh%29+%3D+f%28x%29+%2B+f%27%28x%29+h+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+h%5E2+%2B+%5Ccdots+%5C%5C+

精度为 O(h):

equation?tex=f%27%28x%29+%3D+%5Cfrac%7Bf%28x%2Bh%29+-+f%28x%29%7D%7Bh%7D+%2B+O%28h%29+%5C%5C

或者我们可以用下面的办法展开:

equation?tex=f%28x%2Bh%29+%3D+f%28x%29+%2B+f%27%28x%29+h+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+h%5E2+%2B+%5Cfrac%7B1%7D%7B6%7Df%27%27%27%28x%29h%5E3+%2B+%5Ccdots++%5Ctag%7B1%7D%5C%5C+

equation?tex=f%28x-h%29+%3D+f%28x%29+-+f%27%28x%29+h+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+h%5E2+-+%5Cfrac%7B1%7D%7B6%7Df%27%27%27%28x%29h%5E3+%2B+%5Ccdots++%5Ctag%7B2%7D+

上下两式相减:

equation?tex=f%28x%2Bh%29+-+f%28x+-h%29+%3D+2f%27%28x%29+%2B+%5Cfrac%7B1%7D%7B3%7Df%27%27%27%28x%29h%5E3+%2B+%5Ccdots++%5C%5C

这叫做 中点差分公式, 精度是

equation?tex=O%28h%5E2%29

equation?tex=f%27%28x%29++%5Capprox+%5Cfrac%7Bf%28x%2Bh%29+-+f%28x-h%29%7D%7B2h%7D+%5C%5C

我们也可以用(1),(2)式得到二阶导数的 O(h) 中点差分公式:

equation?tex=+f%27%27%28x%29+%5Capprox+%5Cfrac%7Bf%28x%2Bh%29+-+2f%28x%29+%2B++f%28x-h%29%7D%7Bh%5E2%7D+%5C%5C

我们可以利用 理查德森外推法 来提高 二阶导的精度:

equation?tex=D%28h%29+%3D+%5Cfrac%7Bf%28x%2Bh%29+-+f%28x%29%7D%7Bh%7D+%3D+f%27%28x%29+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+h+%2B+O%28h%5E2%29+%5C%5C

对于任意

equation?tex=%5Calpha ,我们可以有
equation?tex=D%28h%29%2C+D%28%5Calpha+h%29 :

equation?tex=D%28h%29+%3D+f%27%28x%29+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+h+%2B+O%28h%5E2%29+%5C%5C+D%28%5Calpha+h%29+%3D+f%27%28x%29+%2B+%5Cfrac%7B1%7D%7B2%7D+f%27%27%28x%29+%5Calpha+h+%2B+O%28h%5E2%29+%5C%5C

写成矩阵形式:

equation?tex=+%5Cbegin%7Bpmatrix%7D+D%28h%29+%5C%5C+D%28%5Calpha+h%29+%5Cend%7Bpmatrix%7D+++%3D+%5Cbegin%7Bpmatrix%7D+1+%26+%5Cfrac%7B1%7D%7B2%7Dh++%5C%5C+1+%26+%5Cfrac%7B1%7D%7B2%7D%5Calpha+h++%5Cend%7Bpmatrix%7D%5Cbegin%7Bpmatrix%7D+f%27%28x%29+%5C%5C+f%27%27%28x%29+%5Cend%7Bpmatrix%7D+++%2B+O%28h%5E2%29+%5C%5C

equation?tex=%5Cbegin%7Bpmatrix%7D+f%27%28x%29+%5C%5C+f%27%27%28x%29+%5Cend%7Bpmatrix%7D+%3D+%5Cbegin%7Bpmatrix%7D+1+%26+%5Cfrac%7B1%7D%7B2%7Dh++%5C%5C+1+%26+%5Cfrac%7B1%7D%7B2%7D%5Calpha+h+++%5Cend%7Bpmatrix%7D%5E%7B-1%7D++%5Cbegin%7Bpmatrix%7D+D%28h%29+%5C%5C+D%28%5Calpha+h%29+%5Cend%7Bpmatrix%7D++%2B+O%28h%5E2%29+%5C%5C

这样可以以解出精度为

equation?tex=O%28h%5E2%29 的 f'(x):

equation?tex=f%27%28x%29+%3D+%5Cfrac%7B1%7D%7B1-+%5Calpha%7D%28-%5Calpha+D%28h%29+%2B+D%28%5Calpha+h%29%29+%2B+O%28h%5E2%29+%5C%5C

参考:

  • 差分
  • 理查德森外推法
  • 牛顿-柯特斯公式
  • Taylor series
  • Riemann_sum
  • Trapezoidal rule
  • Simpson's rule

数值积分和微分当然非常有用,中文翻译的 差分 也很合适,其实数值积分和微分就是 求和 和 差分。这当然很重要,有了 积分和微分(求和和差分)才能帮我们把一些数学方程/模型方便的用到计算机上。

比如渲染领域的蒙特卡洛积分。

然后发现 Scipy 也提供 integrate, 例子可以查看: SciPy求函数的积分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值