https://www.cs.cornell.edu/~bindel/class/cs3220-s12/notes/lec22.pdf
下面我给你一个完全从零开始、逐行展开泰勒公式的解释,让你真正理解:
⭐ 1. 为什么中心差分的截断误差是 (O(h^2))?
我们从泰勒展开开始(你可以当作“在数学上对函数展开成多项式”)。
对 (),泰勒展开:
对 (f(x-h)),注意要换成 ((-h)):
📌 现在把两式相减
你会发现:
- (f(x)) 项抵消
- (f''(x)) 项也抵消
- (f^{(4)}(x)) 项也抵消
唯一剩下的低阶项是:
整理一下:
📌 然后除以 (2h)(中心差分公式)
中心差分公式定义:
代入上面结果:
你看到了吗?
误差的第一个非零项是 (h^2),不是 (h)
所以:
⭐ 2. 那前向差分为什么只有 (O(h))?
前向差分定义:
用泰勒展开 (f(x+h))(只要记住一个公式就行):
代进去:
误差从 (h) 开始,所以:
⭐ 3. 后向差分为什么一样是 (O(h))?
后向差分定义:
展开 (f(x-h)):
代进去:
误差依然从 (h) 开始:
⭐ 4. 前向差分 vs 后向差分 vs 中心差分 — 直觉区别
类型 | 公式 | 截断误差 | 精度 |
前向差分 | (O(h)) | 一阶 | |
后向差分 | (O(h)) | 一阶 | |
中心差分 | (O(h^2)) | 二阶(更准) |
为什么中心差分更准?
因为它利用了两侧信息,并且巧妙地让 h 的线性误差((h^1) 项)互相抵消了。
这就是中心差分公式用起来更好的根本原因。
⭐ 5. 最简单的直觉(面试也很好用)
- 前向差分:用 (x) 和 (x+h) 两点 → 不对称 → 多出 (h) 级误差
- 后向差分:用 (x) 和 (x-h) 两点 → 不对称 → 多出 (h) 级误差
- 中心差分:用 (x-h)、(x+h) 两点 → 对称 → 有 (h^2) 级别的误差抵消效果
所以中心差分是二阶精度、更准确。
如果你愿意,我可以给你:
- 用 Python 画误差 vs h 的曲线,展示中心差分为什么更强;
- 推广到二阶导数、三阶导数的差分;
- 进一步解释为什么差分公式可以用泰勒展开来推。
~要选最优 (h),核心是权衡两种误差:
- 截断误差(泰勒展开):
- 舍入误差(浮点相减放大误差):(更精细会有常数因子,但量级是 ())
舍入误差来源于计算机存储浮点数的有限精度(Finite Precision)。计算机无法精确存储所有实数,只能保留一定的有效位数(通常双精度浮点数约为 15-16 位十进制数字)。
机制(巨量抵消):
当 非常小时, 和 是两个极其接近的数值。
在计算机中,计算 两个非常接近的数相减()会导致有效位数的大量丢失,这种现象称为巨量抵消(Catastrophic Cancellation)。
推导:
假设计算机的机器精度(Machine Epsilon)为 (双精度下 )。
计算机计算出的函数值 与真实值 之间存在误差:
那么在计算差分公式时,分子的误差最大约为 。
因此,导数计算中的舍入误差为:
所以总误差可写成
对 (h>0) 最小化:令导数为 0:
这就是 forward difference 的“最优步长”(在该误差模型下)。
实用写法(不知道 (f''(x)) 时)
通常用一个尺度化的经验选取:
因为很多光滑函数下 (|f(x)|) 和 (|f''(x)|) 在同一量级(或者至少不会差太离谱),而 (x) 的量纲决定步长尺度。
代入
所以经验上:
补充:如果用中心差分 ,截断误差是 (),最优 (h) 会变成 ()(双精度约 ()),通常更准。
