怎样把 Taylor 多项式变成可信的近似工具?¶
先备知识¶
你需要掌握 Lagrange 余项上界、升幂多项式系数、Python 函数调用和浮点数的有限精度。 本页的可信性分为两层:
- Taylor 近似可在给定导数界后获得数学误差上限;
- 数值差分只提供经验步长下的近似,不自动获得同类证书。
学习目标¶
完成本单元后,你应当能够:
- 从误差预算反推 Taylor 多项式阶数;
- 把导数数据转换为已经除过阶乘的升幂系数;
- 用 Horner 法减少多项式求值的乘法和幂运算;
- 说明前向差分与中心差分的截断误差阶;
- 解释步长过大与过小时不同误差来源的竞争。
牵引问题¶
理论给出一个多项式和一个误差上界,但计算机仍要真正算出多项式的值。另一方面,若 导数本身未知,我们常用很短的割线近似切线。为什么减小步长一开始会改善结果,继续 减小却可能变坏?可信计算要求同时回答“数学模型误差”和“浮点实现误差”。
探索与猜想¶
本页采用一条固定工作流:
对数值微分,再把步长 \(h\) 加入误差账本:
- \(h\) 较大时,有限 Taylor 截断留下的误差明显;
- \(h\) 很小时,两个接近的浮点数相减会损失有效数字,随后再除以 \(h\) 会放大舍入 影响。
概念与理论¶
从误差预算到系数¶
先用 16.2 的上界
寻找满足预算的最低阶数。选定 \(n\) 后,交给算法的系数必须按升幂排列:
算法不再除阶乘,也不自动寻找导数界 \(M\)。
算法:逆序 Horner 求值¶
令 \(z=x-a\)。与其分别计算 \(z,z^2,\ldots,z^n\),把
改写为
伪代码为:
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 公式给出
当 \(h\ne0\) 时,
所以前向差分在这些光滑条件下具有一阶截断误差。没有二阶导数条件时,不能照搬 \(O(h)\) 结论。
算法:中心差分¶
若相应邻域内三阶导数存在并有界,分别在 \(x+h\) 与 \(x-h\) 展开:
两式相减,常数项和二次项抵消,因此
中心差分在相应条件下比前向差分多一阶,但要计算两个采样点。正式接口
forward_difference 与 centered_difference 都返回不可变的
DifferenceEstimate,其中只有:
value:导数近似;step:实际使用的正步长;method:"forward"或"centered"。
自动经验步长的边界¶
若调用者没有给 step,模块令
并取
这些量级来自典型截断误差与舍入误差的平衡,只是教材级经验规则。 经验步长不提供误差证书,也不保证对每个函数、每个尺度最优;调用者可传入正且有限的 显式步长覆盖默认值。
例题与迁移¶
例题1:误差预算—Horner 完整流程¶
近似 \(e^{0.5}\),并要求理论误差小于 \(10^{-4}\)。
问题来源。 16.2 已证明,在 \([0,0.5]\) 上取 \(M=e^{0.5}<1.649\) 时,五阶 多项式是这条上界能够保证预算的最低阶。
数学转化。 系数为
算法思想。 使用 evaluate_taylor(coefficients, 0.0, 0.5) 逆序嵌套求值。
误差与适用条件。 Lagrange 上界约为 \(3.58\times10^{-5}\),它依赖 \([0,0.5]\) 上的六阶导数界。
结果解释。 Horner 得到
而 \(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\),列表按升幂表示
逆序 Horner 为 \((3z+2)z+1=6\)。算法不会再把系数除以阶乘。
即时检验2¶
中心差分误差写成 \(O(h^2)\) 时,必须同时说明什么条件?
答案
必须说明在两侧采样点覆盖的相应邻域内三阶导数存在并有界。没有这个条件,形式上的 对称并不足以保证二阶截断误差。
回看牵引问题:可信近似不是“步长越小越好”,而是把数学截断、区间条件、浮点相消和 实际使用的步长都放在同一份误差说明里。
习题与答案¶
习题1:Horner 手算¶
用 Horner 法计算 \(2-3z+4z^2-z^3\) 在 \(z=2\) 的值。
答案
从最高次系数 \(-1\) 开始:
所以多项式值为 4。
习题2:阶乘合同¶
要计算 \(\sin x\) 的五阶 Maclaurin 多项式,传给 evaluate_taylor 的列表是什么?
答案
所以列表是
[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 近似。下一章另行研究导数符号、几何形状与求解方法之间的 关系。