跳转至

怎样把 Taylor 多项式变成可信的近似工具?

先备知识

你需要掌握 Lagrange 余项上界、升幂多项式系数、Python 函数调用和浮点数的有限精度。 本页的可信性分为两层:

  • Taylor 近似可在给定导数界后获得数学误差上限;
  • 数值差分只提供经验步长下的近似,不自动获得同类证书。

学习目标

完成本单元后,你应当能够:

  1. 从误差预算反推 Taylor 多项式阶数;
  2. 把导数数据转换为已经除过阶乘的升幂系数;
  3. 用 Horner 法减少多项式求值的乘法和幂运算;
  4. 说明前向差分与中心差分的截断误差阶;
  5. 解释步长过大与过小时不同误差来源的竞争。

牵引问题

理论给出一个多项式和一个误差上界,但计算机仍要真正算出多项式的值。另一方面,若 导数本身未知,我们常用很短的割线近似切线。为什么减小步长一开始会改善结果,继续 减小却可能变坏?可信计算要求同时回答“数学模型误差”和“浮点实现误差”。

探索与猜想

本页采用一条固定工作流:

\[ \text{给定误差预算} \longrightarrow \text{选择阶数} \longrightarrow \text{形成 Taylor 系数} \longrightarrow \text{Horner 求值} \longrightarrow \text{解释实际误差}. \]

对数值微分,再把步长 \(h\) 加入误差账本:

  • \(h\) 较大时,有限 Taylor 截断留下的误差明显;
  • \(h\) 很小时,两个接近的浮点数相减会损失有效数字,随后再除以 \(h\) 会放大舍入 影响。

概念与理论

从误差预算到系数

先用 16.2 的上界

\[ |R_n(x)|\le\frac{M}{(n+1)!}|x-a|^{n+1} \]

寻找满足预算的最低阶数。选定 \(n\) 后,交给算法的系数必须按升幂排列:

\[ \texttt{coefficients[k]}=\frac{f^{(k)}(a)}{k!}. \]

算法不再除阶乘,也不自动寻找导数界 \(M\)

算法:逆序 Horner 求值

\(z=x-a\)。与其分别计算 \(z,z^2,\ldots,z^n\),把

\[ c_0+c_1z+\cdots+c_nz^n \]

改写为

\[ c_0+z\bigl(c_1+z(c_2+\cdots+z c_n)\bigr). \]

伪代码为:

value ← coefficients[n]
for k from n - 1 down to 0:
    value ← value * (point - center) + coefficients[k]
return value

正式实现位于 src/mathbook_examples/differentiation.py,公开函数为 evaluate_taylor。正文不维护第二份 Python 实现,以免系数顺序或输入检查发生漂移。 该函数只返回有限数值;余项上界由调用者根据函数、区间和导数界另行证明。

前向差分:一阶截断误差

若相应邻域内二阶导数存在并有界,Taylor 公式给出

\[ f(x+h)=f(x)+f'(x)h+O(h^2). \]

\(h\ne0\) 时,

\[ \frac{f(x+h)-f(x)}h=f'(x)+O(h). \]

所以前向差分在这些光滑条件下具有一阶截断误差。没有二阶导数条件时,不能照搬 \(O(h)\) 结论。

算法:中心差分

若相应邻域内三阶导数存在并有界,分别在 \(x+h\)\(x-h\) 展开:

\[ f(x+h)=f(x)+f'(x)h+\frac{f''(x)}2h^2+O(h^3), \]
\[ f(x-h)=f(x)-f'(x)h+\frac{f''(x)}2h^2+O(h^3). \]

两式相减,常数项和二次项抵消,因此

\[ \frac{f(x+h)-f(x-h)}{2h}=f'(x)+O(h^2). \]

中心差分在相应条件下比前向差分多一阶,但要计算两个采样点。正式接口 forward_differencecentered_difference 都返回不可变的 DifferenceEstimate,其中只有:

  • value:导数近似;
  • step:实际使用的正步长;
  • method"forward""centered"

自动经验步长的边界

若调用者没有给 step,模块令

\[ \varepsilon=\texttt{sys.float\_info.epsilon},\qquad s=\max(1,|x|), \]

并取

\[ h_{\rm forward}=\sqrt{\varepsilon}\,s,\qquad h_{\rm centered}=\varepsilon^{1/3}s. \]

这些量级来自典型截断误差与舍入误差的平衡,只是教材级经验规则。 经验步长不提供误差证书,也不保证对每个函数、每个尺度最优;调用者可传入正且有限的 显式步长覆盖默认值。

例题与迁移

例题1:误差预算—Horner 完整流程

近似 \(e^{0.5}\),并要求理论误差小于 \(10^{-4}\)

问题来源。 16.2 已证明,在 \([0,0.5]\) 上取 \(M=e^{0.5}<1.649\) 时,五阶 多项式是这条上界能够保证预算的最低阶。

数学转化。 系数为

\[ \left[1,1,\frac1{2!},\frac1{3!},\frac1{4!},\frac1{5!}\right]. \]

算法思想。 使用 evaluate_taylor(coefficients, 0.0, 0.5) 逆序嵌套求值。

误差与适用条件。 Lagrange 上界约为 \(3.58\times10^{-5}\),它依赖 \([0,0.5]\) 上的六阶导数界。

结果解释。 Horner 得到

\[ P_5(0.5)=1.6486979167\ldots, \]

\(e^{0.5}=1.6487212707\ldots\),真实误差约 \(2.34\times10^{-5}\),确实小于理论上界。上界通常不等于实际误差;它的任务是保证, 不是预测每一位误差。

例题2:步长递减实验

用正式接口近似 \(f(x)=e^x\)\(x=0\) 的导数,真值为 1。下表记录“近似值减真值”:

\(h\) 前向误差 中心误差
\(10^{-1}\) \(5.17\times10^{-2}\) \(1.67\times10^{-3}\)
\(10^{-3}\) \(5.00\times10^{-4}\) \(1.67\times10^{-7}\)
\(10^{-5}\) \(5.00\times10^{-6}\) \(1.21\times10^{-11}\)
\(10^{-7}\) \(4.94\times10^{-8}\) \(-5.26\times10^{-10}\)
\(10^{-9}\) \(8.27\times10^{-8}\) \(2.72\times10^{-8}\)
\(10^{-11}\) \(8.27\times10^{-8}\) \(8.27\times10^{-8}\)

\(10^{-1}\) 降到 \(10^{-5}\) 时,截断误差下降;继续减小时,中心差分先开始受相消 影响,最终两种方法都不再改善。自动步长约为:

  • 前向:\(1.49\times10^{-8}\)
  • 中心:\(6.06\times10^{-6}\)

实验同时比较了自动值与多个显式步长,但没有把一次实验升格为普遍最优性证明。 数值收敛不能倒过来证明函数可导,也不能证明它具有所需高阶光滑性。

即时检验与回望

即时检验1

若系数列表为 [1, 2, 3]、中心为 1、求值点为 2,Horner 计算哪个多项式?

答案

\(z=2-1=1\),列表按升幂表示

\[ 1+2z+3z^2. \]

逆序 Horner 为 \((3z+2)z+1=6\)。算法不会再把系数除以阶乘。

即时检验2

中心差分误差写成 \(O(h^2)\) 时,必须同时说明什么条件?

答案

必须说明在两侧采样点覆盖的相应邻域内三阶导数存在并有界。没有这个条件,形式上的 对称并不足以保证二阶截断误差。

回看牵引问题:可信近似不是“步长越小越好”,而是把数学截断、区间条件、浮点相消和 实际使用的步长都放在同一份误差说明里。

习题与答案

习题1:Horner 手算

用 Horner 法计算 \(2-3z+4z^2-z^3\)\(z=2\) 的值。

答案

从最高次系数 \(-1\) 开始:

\[ (-1\cdot2+4)\cdot2-3=1,\qquad 1\cdot2+2=4. \]

所以多项式值为 4。

习题2:阶乘合同

要计算 \(\sin x\) 的五阶 Maclaurin 多项式,传给 evaluate_taylor 的列表是什么?

答案
\[ \sin x\approx x-\frac{x^3}{3!}+\frac{x^5}{5!}, \]

所以列表是 [0, 1, 0, -1/6, 0, 1/120]。零系数也要保留,才能维持幂次位置。

习题3:前向误差条件

只有 \(f\)\(x\) 可导,能否保证前向差分误差为 \(O(h)\)

答案

不能。可导只保证差商趋于 \(f'(x)\),没有给出线性的收敛速度。本页的 \(O(h)\) 结论使用了相应邻域内二阶导数存在并有界。

习题4:读取结果对象

为什么 DifferenceEstimate 返回实际 step,却不含 error_bound

答案

自动规则确实选择了一个具体步长,所以应把它暴露给读者复现实验。但仅凭有限次函数 采样不能证明所需高阶导数界,也不能形成严格误差证书;加入 error_bound 会制造 过度承诺。

习题5:选择显式步长

若函数在某个采样点无定义,自动步长触碰了该点,应怎样处理?

答案

先根据定义域选择合法的正有限显式步长,必要时改用单侧的前向差分。正式函数不会 吞掉原函数抛出的定义域异常,因此调用者能看到问题并重新选择方法;不能把异常当成 数值零。

常见误区与后续

  • 传入未除阶乘的导数值,却按 Taylor 系数解释;
  • 把理论上界误说成实际误差;
  • 把经验步长称为对任意函数的最优步长;
  • 只看差分表的收敛现象,反推未经证明的光滑性;
  • 认为 \(h\) 越小,浮点结果必然越准确。

本章到此完成有限阶 Taylor 近似。下一章另行研究导数符号、几何形状与求解方法之间的 关系。