Finite Difference Optimal Delta
🎗️

Finite Difference Optimal Delta

 
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) 会变成 ()(双精度约 ()),通常更准。