Chap 4: Numerical Differentiation and Integration⚓︎
约 2463 个字 13 行代码 预计阅读时间 12 分钟
Numerical Differentiation⚓︎
目标:对于给定的 \(x_0\),近似计算 \(f'(x_0)\)(即数值微分(numerical differentiation))
微分计算公式:\(f'(x_0) = \lim\limits_{h \rightarrow 0} \dfrac{f(x_0 + h) - f(x_0)}{h}\)
- 后向:\(f'(x_0) \approx \dfrac{f(x_0 + h) - f(x_0)}{h}\)
- 前向:\(f'(x_0) \approx \dfrac{f(x_0) - f(x_0 - h)}{h}\)
现在我们用 \(f(x)\) 的带有插值点 \(x_0, x_0 + h\) 的拉格朗日多项式来近似表示 \(f(x)\):
因此 \(f'(x_0) = \dfrac{f(x_0 + h) - f(x_0)}{h} - \dfrac{h}{2}f''(\xi)\)
接下来用插值点为 \(\{x_0, x_1, \dots, x_n\}\) 的拉格朗日多项式来近似表示 \(f(x)\)
注
- 一般来说,更多的评估点(即这里的插值点)会带来更大的近似精度
- 但另一方面,随着评估点的增加,舍入误差也在变大,因此数值微分是不稳定的!
例子
给定三个点 \(x_0, x_0 + h, x_0 + 2h\),请求得关于每个点的三点公式,然后选出对于 \(f'(x)\) 而言最佳的三点公式。

寻找近似计算 \(f''(x_0)\) 的方式。
考虑在 \(x_0\) 处的 \(f(x_0 + h), f(x_0 - h)\) 的泰勒展开式:
因此:\(f''(x_0) = \dfrac{1}{h^2} [f(x_0 - h) - 2f(x_0) + f(x_0 + h)] - \dfrac{h^2}{12} f^{(4)} (\xi)\)
Elements of Numerical Integration⚓︎
目标:近似计算 \(I = \int_a^b f(x) dx\)(即数值求积(numerical quadratrue))
思路:使用 \(f(x)\) 的拉格朗日插值多项式——从区间 \([a, b]\) 上选择一组不同的点 \(a \le x_0 < x_1 \dots < x_n \le b\)。拉格朗日多项式为 \(P_n(x) = \sum\limits_{k=0}^n f(x_k) L_k(x)\),因此:
令 \(A_k = \int_a^b L_k(x) dx = \int_a^b \prod\limits_{j \ne k} \dfrac{x - x_j}{x_k - x_j} dx\)
误差 \(R[f]\) 为:
定义
求积公式的精度(degree of accuracy/precision) 为最大的正整数 \(n\),使得公式对于每个 \(x^k(k = 0, 1, \dots, n)\) 都是精确的。
例子
考虑在 \([a, b]\) 上的线性插值,我们有 \(P_1(x) = \dfrac{x - b}{a - b}f(a) + \dfrac{x - a}{b - a}f(b)\)。可以得到:
- \(A_1 = A_2 = \dfrac{b - a}{2}\)
- \(\int_a^b f(x) dx \approx \dfrac{b - a}{2}[f(a) + f(b)]\)
请计算上述公式的精度。
考虑 \(x^k(k = 0, 1, \dots)\):
- \(x^0\):\(\int_a^b 1dx = b - a = \dfrac{b - a}{2}[1 + 1]\)
- \(x^1\):\(\int_a^b xdx = \dfrac{b^2 - a^2}{2} = \dfrac{b - a}{2}[a + b]\)
- \(x^2\):\(\int_a^b x^2dx = \dfrac{b^3 - a^3}{3} = \dfrac{b - a}{2}[a^2 + b^2]\)

因此精度阶数 = 1
对于等间距的节点 \(x_i = a + ih, h = \dfrac{b - a}{n}, i = 0, 1, \dots, n\)
注
科茨系数不取决于 \(f(x)\) 或 \([a, b]\),而仅由 \(n, i\) 决定。因此我们可以从一张表中找出这些系数。上述公式称为牛顿 - 科茨公式(Newton-Cotes formula)
- \(n = 1\)
- \(C_0^{(1)} = C_1^{(1)} = \dfrac{1}{2}\)
- \(\int_a^b f(x) dx \approx \dfrac{b - a}{2}[f(a) + f(b)]\)(称为梯形法则(trapezoidal rule))
- \(R[f] = \int_a^b \dfrac{f''(\xi_x)}{2!}(x-a)(x-b) dx = -\dfrac{1}{12}h^3f''(\xi)\)
- \(\xi \in [a, b], h = \dfrac{b - a}{1}\)
- 精度 = 1
- \(n = 2\)
- \(C_0^{(2)} = \dfrac{1}{6}, C_1^{(2)} = \dfrac{2}{3}, C_2^{(2)} = \dfrac{1}{6}\)
- \(\int_a^b f(x) dx \approx \dfrac{b - a}{6}[f(a) + 4f(\dfrac{a+b}{2}) + f(b)]\)(称为辛普森法则(Simpson's rule))
- \(R[f] = -\dfrac{1}{90} h^5 f^{(4)}(\xi)\)
- \(\xi \in (a, b), h = \dfrac{b - a}{2}\)
- 精度 = 3
- \(n = 3\):辛普森 3/8 法则,精度 = 3,\(R[f] = -\dfrac{3}{80}h^5 f^{(5)}(\xi)\)
- \(n = 4\):科茨法则(Cotes' Rule),精度 = 5,3,\(R[f] = -\dfrac{8}{945}h^7 f^{(6)}(\xi)\)
定理
对于使用 \(n+1\) 个点的牛顿 - 科茨公式,\(\exists \xi \in (a, b)\),使得:
- 如果 \(n\) 为偶数,那么 \(f \in C^{n+2}[a, b]\) 且 \(\int_a^b f(x) dx = \sum\limits_{k=0}^n A_k f(x_k) + \dfrac{h^{n+2}f^{(n+1)}(\xi)}{(n+1)!} \int_0^n t(t - 1) \dots (t - n) dt\)
- 如果 \(n\) 为奇数,那么 \(f \in C^{n+1}[a, b]\)
Compotsite Numerical Integration⚓︎
由于高阶多项式的密切性质,我们用分段(piecewise) 插值的方式来近似 \(f(x)\)。而这个方式用到了低阶的牛顿 - 科茨公式。
Composite Trapezoidal Rule⚓︎
复合梯形公式(composite trapezoidal rule) 涉及到的变量有:\(h = \dfrac{b-a}{n}, x_k = a + kh\ (k=0, \dots, n)\)。
我们将梯形公式作用在每个区间 \([x_{k-1}, x_k]\) 上,即:
\(R[f]\) 的公式涉及到中值定理(MVT)。
Composite Simpson's Rule⚓︎
复合辛普森公式(composite Simpson rule) 涉及到的变量和复合梯形公式一致:\(h = \dfrac{b-a}{n}, x_k = a + kh\ (k=0, \dots, n)\)。
我们将辛普森公式作用在每个区间 \([x_{k-1}, x_k]\) 上,即:
注
为了简化记号,我们令 \(n' = 2n\),那么 \(h' = \dfrac{b-a}{n'} = \dfrac{h}{2}, x_k = a+kh'\),所以:
上述的复合集成技术都是稳定的。来看下面这个例子:
例子
考虑在 \([a, b]\) 上有 \(n\) 个子区间的辛普森法则。假设 \(f(x_i)\) 由 \(f^*(x_i)\) 近似,满足 \(f(x_i) = f^*(x_i) + \varepsilon_i\ (i = 0, \dots, n)\),那么累积误差为:
若 \(|\varepsilon_i| < \varepsilon\ (i = 0, \dots, n)\),那么:
可以看到,当我们修正分区,以确保准确性时,增加的计算量不会带来更多的舍入误差。
讨论
使用 \(n=8\) 梯形法则和辛普森法则来近似 \(\pi = \int_0^1 \dfrac{4}{1+x^2} dx\)。
在编程的时候,我们通常会将一个子区间划分为两个均等宽度的更小的子区间。也就是说,令 \(n = 2^k\ (k = 0, 1, \dots)\)
当 \(k=9\) 时,\(T_{512} = \textcolor{green}{3.141592}\textcolor{red}{02}\)
\(\dfrac{4}{3}T_8 - \dfrac{1}{3}T_4 = \textcolor{green}{3.141592}\textcolor{red}{502} = S_4\)
Romberg Integration⚓︎
回顾一下梯形法则的误差公式:\(R_n[f] = -\dfrac{h^2}{12}(b-a)f''(\xi)\)。当我们将每个子区间的长度缩减至原来的一半时,
从而得到:\(\dfrac{I - T_{2n}}{I - T_n} \approx \dfrac{1}{4}\),解得 \(I \approx \dfrac{4T_{2n} - T_n}{4 - 1} = \dfrac{4}{3}T_{2n} - \dfrac{1}{3}T_n = S_n\)
一般情况下:
- \(\dfrac{4T_{2n} - T_n}{4 - 1} = S_n\)
- \(\dfrac{4^2S_{2n} - S_n}{4^2 - 1} = C_n\)
- \(\dfrac{4^3C_{2n} - C_n}{4^3 - 1} = R_n\) -> Romberg 序列(Romberg sequence)
Rombert 法如下所示:

算法:Romberg
近似积分 \(I = \int_a^b f(x) dx\),选择整数 \(n > 0\)
- 输入:端点 \(a, b\);整数 \(n\)
- 输出:数组 \(R\)(按行计算 \(R\);只保留最后 2 行)
Step 1 Set h = b - a;
R[1][1] = h / 2(f(a) + f(b));
Step 2 Output(R[1][1]);
Step 3 for i = 2, ..., n do steps 4-8:
// approximation from Trapezoidal method
Step 4 Set R[2][1] = 1/2 * [R[1][1] + h * sum(k=1, pow(2, i-2), f(a + (k - 0.5) * h))];
Step 5 for j = 2, ..., i:
// extrapolation
set R[2][j] = R[2][j-1] + (R[2][j-1] - R[1][j-1]) / (pow(4, j-1) - 1);
Step 6 Output(R[2][j] for j = 1, 2, ..., i);
Step 7 Set h /= 2;
Step 8 for j = 1, 2, ..., i set R[1][j] = R[2][j]; // update row 1 of R
Step 9 STOP.
Richardson's Extrapolation⚓︎
目标:使用低阶公式获取高精度的结果。
假设对于某些 \(h \ne 0\),我们有公式 \(T_0(h)\),用于近似未知量 \(I\),并且其截断误差的形式为:
用 \(h\) 一半的值替代自身,我们有:
结合上述两个公式,我们就可以将精度从 \(O(h)\) 提升至 \(O(h^2)\):
令 \(T_1 = \dfrac{2T_0(\frac{h}{2}) - T_0(h)}{2 - 1} = I + \beta_1 h^2 + \beta_2 h^3 + \dots\)。类似地,我们可以将精度提升至 \(O(h^3)\):
实际上,我们可以将精度可以提升到任意阶数 \(m+1\):
Adapative Quadrature Methods⚓︎
目标:预测函数变化量,根据变化的需求调整步幅。
前面介绍的复合积分方法的缺点是:对所有区间递归划分子区间,这样计算量太大,而且还有产生了许多不必要的计算,这很浪费。因此,我们采用一种仅对具有较大误差(large error) 的区间进行划分的方法,避免额外的计算。我们称这样的方法为自适应求积方法(adapative quadrature mehtods)。
那么什么算“较大误差”呢?一种简单的确定策略是使用 \(\int_a^b f(x) dx\) 的总误差 \(\varepsilon\) 来确定边界:在长度为 \(h\) 的区间中,误差应该要小于 \(h \dfrac{\varepsilon}{b - a}\)。当误差超过这个值时,我们就认为是较大误差,需要继续划分该区间。
接下来的问题就是如何估计一个区间的误差。这里我们暂时仅考虑辛普森法则下的误差估计——即如何估计:
其中 \(h = \dfrac{b-a}{2}, \xi \in [a, b]\)。
这个问题的答案在例 2 中给出。
例子
动画演示

考虑基于复合辛普森法则的自适应方法:
其中 \(S(a, b) = \dfrac{h}{3}[f(a) + 4f(a + h) + f(b)], h = \dfrac{b-a}{2}\)。令:
那么:
可以看到,相比一般的辛普森法则,结合自适应方法后误差只有原来的 \(\dfrac{1}{15}\) 🎉
Gaussian Quadrature⚓︎
目标:构造一个公式 \(\int_a^b w(x) f(x) dx \approx \sum\limits_{k=0}^n A_k f(x_k)\),对于 \(n+1\) 个点而言精度为 \(2n+1\)。
思路:确定 \(2n+2\) 个未知量 \(x_0, \dots, x_n;\ A_0, \dots, A_n\),使得公式在 \(f(x) = 1, x, x^2, \dots, x^{2n+1}\) 上都是精确的。点 \(x_0, \dots, x_n\) 被称为高斯点(Gaussian points),这个方法被称为高斯求积(Gaussian quadrature)
讨论
使用 \(n = 1\) 的高斯求积近似表示 \(\int_0^1 \sqrt{x} f(x) dx\)。
假设 \(\int_0^1 \sqrt{x} f(x) dx \approx A_0 f(x_0) + A_1 f(x_1)\)。
公式必须在 \(f(x) = 1, x, x^2, x^3\) 上精确表示。计算 \(\begin{cases}\frac{2}{3} = A_0 + A_1 \\ \frac{2}{5} = A_0 x_0 + A_1 x_1 \\ \frac{2}{7} = A_0 x_0^2 + A_1 x_1^2 \\ \frac{2}{9} = A_0x_0^3 + A_1 x_1^3\end{cases}\),解得:\(\begin{cases}x_0 \approx 0.8212 \\ x_1 \approx 0.2899 \\ A_0 \approx 0.3891 \\ A_1 \approx 0.2776\end{cases}\)
定理
当且仅当 \(W(x) = \prod\limits_{k=0}^n(x - x_k)\) 与所有阶数不超过 \(n\) 的多项式正交时,\(x_0, \dots, x_n\) 是高斯点。
证明
-
若 \(x_0, \dots, x_n\) 是高斯点,则公式 \(\int_a^b w(x) f(x) dx \approx \sum\limits_{k=0}^nA_kf(x_k)\) 的精度至少为 \(2n+1\)。那么对于任意多项式 \(P_m(x)\ (m \le n)\),\(P_m(x) W(x)\) 的阶数不超过 \(2n+1\)。因此上述公式对于 \(P_m(x) W(x)\) 而言是精确的,也就是说:
\[ \int_a^b w(x) P_m(x) W(x) dx = \sum\limits_{k=0}^n A_k P_m(x_k) W(x_k) = 0 \] -
要证明 \(x_0, \dots, x_n\) 是高斯点,我们需要证明公式对任意多项式 \(P_m(x)\ (m \le 2n + 1)\) 是精确的。令 \(P_m(x) = W(x) q(x) + r(x)\),那么
\[ \begin{align} \int_a^n w(x) P_m(x) dx & = \int_a^n w(x) W(x) q(x) dx + \int_a^n w(x) r(x) dx = \sum\limits_{k=0}^n A_k r(x_k) \notag \\ & = \sum\limits_{k=0}^n A_k P_m(x_k) \notag \end{align} \]
正交多项式的集合 \(\{\varphi_0, \varphi_1, \dots, \varphi_n, \dots\}\) 是线性独立的,且 \(\varphi_{n+1}\) 和任何多项式 \(P_m(x)\ (m \le n)\) 正交。所以,如果我们拿 \(\varphi_{n+1}\) 作为 \(W(x)\),那么 \(\varphi_{n+1}\) 的根就是高斯点了。
例子
使用高斯求积来近似计算 \(\int_0^1 \sqrt{x} f(x) dx\),其中 \(n = 1\)
假设 \(\int_0^1 \sqrt{x} f(x) dx \approx A_0 f(x_0) + A_1 f(x_1)\)。
-
构造正交多项式 \(\varphi_2\)。令 \(\varphi_0(x) = 1, \varphi_1(x) = x + a, \varphi_2(x) = x^2 + bx + c\)
- \((\varphi_0, \varphi_1) = 0 \Rightarrow \int_0^1 \sqrt{x} (x + a) dx = 0 \Rightarrow a = - \dfrac{3}{5}\)
- \((\varphi_0, \varphi_2) = 0 \Rightarrow \int_0^1 \sqrt{x} (x^2 + bx + c) dx = 0 \Rightarrow a = - \dfrac{10}{9}\)
- \((\varphi_1, \varphi_2) = 0 \Rightarrow \int_0^1 \sqrt{x} (x - \dfrac{3}{5})(x + bx + c) dx = 0 \Rightarrow a = \dfrac{5}{21}\)
- \(\therefore \varphi_2(x) = x^2 - \dfrac{10}{9}x + \dfrac{5}{21}\)
-
找到 \(\varphi_2\) 的两个根,作为高斯点 \(x_0, x_1\):\(x_{0;1} = \dfrac{\frac{10}{9} \pm \sqrt{(\frac{10}{9})^2 - \frac{20}{21}}}{2}\)
-
因为这个公式必须在 \(f(x) = 1, x\) 上是精确的,所以我们能比较容易地求解 \(A_0, A_1\) 的线性方程组
最终结果为:\(x_0 \approx 0.8212, x_1 \approx 0.2899, A_0 \approx 0.3891, A_1 \approx 0.2776\)
现在使用上述结果来近似计算 \(\int_0^1 \sqrt{x} e^x dx\)
而 \(\int_0^1 \sqrt{x} (2x-1) dx = \dfrac{2}{15}\) 是精确的。
一些特殊的正交多项式:
-
勒让德多项式(Legendre polynomials):定义在 \([-1, 1]\) 上且 \(w(x) \equiv 1\)
\[ P_k(x) = \dfrac{1}{2^k k!} \dfrac{d^k}{dx^k}(x^2 - 1)^k \quad \quad (P_k, P_l) = \begin{cases}0 & k \ne l \\ \dfrac{2}{2k+1} & k = l\end{cases} \]\(P_0 = 1, P_1 = x, (k + 1)P_{k+1} = (2k + 1)xP_k - kP_{k-1}\)
使用 \(P_{n+1}\) 的根的公式称为高斯 - 勒让德求积公式。
-
切比雪夫多项式(Chebyshev polynomials):定义在 \([-1, 1]\) 上且 \(w(x) = \dfrac{1}{\sqrt{1 - x^2}}\)
\[ T_k(x) = \cos (k \times \arccos x) \]\(T_{n+1}\) 的根为 \(x_k = \cos \Big(\dfrac{2k + 1}{2n + 2} \pi \Big) \quad (k = 0, \dots, n)\)
公式 \(\int_{-1}^1 \dfrac{1}{\sqrt{1 - x^2}} f(x) dx = \sum\limits_{k=0}^n A_k f(x_k)\) 称为高斯 - 切比雪夫求积公式。
- 注意到积分端点 \(\pm 1\) 是积分上的奇点(singular points),此时在等间距的点上使用牛顿 - 科茨公式会出现问题;而高斯积分能够避免这个问题。
对应的作业练习📝
评论区