Add presentation slides for OU process and Mehler formula
Sync to site1 / sync (push) Has been cancelled
Sync to site1 / sync (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,612 @@
|
||||
---
|
||||
title: "Hermite 插值详解"
|
||||
date: 2026-06-02
|
||||
draft: false
|
||||
tags: ["数值分析", "插值", "Hermite插值", "多项式逼近"]
|
||||
categories: ["research", "math"]
|
||||
description: "从切触条件、构造方法到误差分析,系统讲解 Hermite 插值的理论与应用。"
|
||||
---
|
||||
|
||||
# Hermite 插值详解
|
||||
|
||||
> 本文系统讲解数值分析中的 **Hermite 插值(Hermite Interpolation,埃尔米特插值)**。它是 Lagrange 插值的自然推广:不仅要求插值多项式在节点处与被插函数取相同的**函数值**,还要求取相同的**导数值(一阶乃至更高阶)**。这使得插值曲线在节点处不仅"经过"数据点,还与原曲线"相切",从而得到更光滑、更逼真的逼近。
|
||||
|
||||
---
|
||||
|
||||
## 一、引入与动机
|
||||
|
||||
### 1.1 从 Lagrange 插值说起
|
||||
|
||||
给定 $n+1$ 个互异节点 $x_0, x_1, \dots, x_n$ 及对应函数值 $f(x_i)$,Lagrange 插值给出唯一的次数 $\le n$ 多项式 $L_n(x)$,使得
|
||||
|
||||
$$
|
||||
L_n(x_i) = f(x_i), \qquad i = 0, 1, \dots, n.
|
||||
$$
|
||||
|
||||
它只匹配**函数值**。然而在很多实际问题中,我们对曲线"形状"的要求更高,**仅匹配函数值是不够的**:
|
||||
|
||||
- **光滑性不足**:Lagrange 插值在节点处的切线方向完全由全局多项式自动决定,可能与真实曲线的斜率相去甚远,导致曲线在节点附近"扭动"。
|
||||
- **物理意义缺失**:若数据点代表某质点的位置,那么我们往往同时知道该点的**速度**(即一阶导数)。只匹配位置而丢弃速度信息,是对已知信息的浪费。
|
||||
- **拼接不连续**:在分段插值中,若相邻段只匹配端点函数值而不匹配导数,则拼接处会出现折角(导数不连续)。
|
||||
|
||||
### 1.2 Hermite 插值的核心思想
|
||||
|
||||
**Hermite 插值**的思想是:在节点处同时匹配函数值与若干阶导数值。最常见的是同时匹配函数值与一阶导数值:
|
||||
|
||||
$$
|
||||
H(x_i) = f(x_i), \qquad H'(x_i) = f'(x_i), \qquad i = 0, 1, \dots, n.
|
||||
$$
|
||||
|
||||
### 1.3 几何直观:节点处"相切"
|
||||
|
||||
考虑两条曲线 $y = f(x)$ 与 $y = H(x)$。如果它们在某点 $x_i$ 满足
|
||||
|
||||
$$
|
||||
H(x_i) = f(x_i) \quad (\text{过同一点}), \qquad H'(x_i) = f'(x_i) \quad (\text{斜率相同}),
|
||||
$$
|
||||
|
||||
那么这两条曲线在 $x_i$ 处**相切**(一阶切触,order-1 contact)。如果进一步匹配到二阶导数 $H''(x_i)=f''(x_i)$,则它们在该点的**曲率**也一致(更高阶的切触)。
|
||||
|
||||
> 一句话概括:**Lagrange 插值让曲线"穿过"数据点;Hermite 插值让曲线"贴着"数据点走。**
|
||||
|
||||
---
|
||||
|
||||
## 二、问题定义
|
||||
|
||||
### 2.1 一般 Hermite 插值问题
|
||||
|
||||
给定 $n+1$ 个互异节点 $x_0, x_1, \dots, x_n$。在每个节点 $x_i$ 处,给定函数值及从一阶到 $m_i$ 阶的导数值:
|
||||
|
||||
$$
|
||||
f(x_i),\ f'(x_i),\ f''(x_i),\ \dots,\ f^{(m_i)}(x_i).
|
||||
$$
|
||||
|
||||
也就是说,节点 $x_i$ 处提供了 $m_i + 1$ 个约束条件(称该节点的**重数(multiplicity)**为 $m_i + 1$)。我们称整数 $m_i$ 为节点 $x_i$ 的**切触阶(order of contact)**。
|
||||
|
||||
记总约束数(总自由度)为
|
||||
|
||||
$$
|
||||
N = \sum_{i=0}^{n} (m_i + 1).
|
||||
$$
|
||||
|
||||
**目标**:求一个次数 $\le N-1$ 的多项式 $H(x)$,满足全部切触条件
|
||||
|
||||
$$
|
||||
H^{(k)}(x_i) = f^{(k)}(x_i), \qquad k = 0, 1, \dots, m_i, \quad i = 0, 1, \dots, n.
|
||||
$$
|
||||
|
||||
### 2.2 存在唯一性定理
|
||||
|
||||
> **定理(Hermite 插值的存在唯一性)**
|
||||
> 设节点 $x_0, \dots, x_n$ 互异,切触阶分别为 $m_0, \dots, m_n$,记 $N = \sum_{i=0}^{n}(m_i+1)$。则在给定上述 $N$ 个切触条件下,**存在且唯一**一个次数 $\le N-1$ 的多项式 $H(x)$ 满足所有条件。
|
||||
|
||||
**证明(唯一性,反证法)**:
|
||||
次数 $\le N-1$ 的多项式构成一个 $N$ 维线性空间(基为 $1, x, \dots, x^{N-1}$),共有 $N$ 个待定系数。切触条件给出 $N$ 个线性方程,于是问题等价于一个 $N \times N$ 的线性方程组。要证明解存在且唯一,只需证明对应齐次问题只有零解。
|
||||
|
||||
设 $P(x)$ 是次数 $\le N-1$ 的多项式,且满足全部**齐次**条件
|
||||
|
||||
$$
|
||||
P^{(k)}(x_i) = 0, \qquad k = 0, 1, \dots, m_i, \quad i = 0, 1, \dots, n.
|
||||
$$
|
||||
|
||||
则在每个节点 $x_i$ 处,$P$ 及其直到 $m_i$ 阶导数都为零,意味着 $x_i$ 是 $P$ 的至少 $m_i + 1$ 重根。因此 $P$ 的根(计重数)总数至少为
|
||||
|
||||
$$
|
||||
\sum_{i=0}^{n}(m_i + 1) = N.
|
||||
$$
|
||||
|
||||
但 $P$ 的次数 $\le N-1$,一个非零的 $N-1$ 次多项式至多有 $N-1$ 个根(计重数)。矛盾。故 $P \equiv 0$。这证明齐次问题只有零解,从而线性方程组的系数矩阵非奇异,原问题存在唯一解。$\blacksquare$
|
||||
|
||||
**特例**:当所有 $m_i = 0$ 时,$N = n+1$,Hermite 插值退化为 **Lagrange 插值**;当 $n+1$ 个节点每个都匹配函数值与一阶导数($m_i = 1$)时,$N = 2(n+1) = 2n+2$,称为**标准 Hermite 插值**,其多项式次数 $\le 2n+1$。
|
||||
|
||||
---
|
||||
|
||||
## 三、两点三次 Hermite 插值(重点)
|
||||
|
||||
这是工程与图形学中**最常用**的 Hermite 插值形式,必须重点掌握。
|
||||
|
||||
### 3.1 问题设定
|
||||
|
||||
取两个节点 $x_0, x_1$,每个节点匹配函数值与一阶导数:
|
||||
|
||||
$$
|
||||
H(x_0) = f(x_0),\quad H'(x_0) = f'(x_0),\quad H(x_1) = f(x_1),\quad H'(x_1) = f'(x_1).
|
||||
$$
|
||||
|
||||
共 $N = 4$ 个条件,故 $H(x)$ 是唯一的次数 $\le 3$ 的多项式(**三次多项式**)。
|
||||
|
||||
### 3.2 标准区间 $[0,1]$ 上的四个基函数
|
||||
|
||||
为简化推导,先把区间映射到 $[0,1]$。令
|
||||
|
||||
$$
|
||||
t = \frac{x - x_0}{x_1 - x_0} \in [0, 1], \qquad h = x_1 - x_0.
|
||||
$$
|
||||
|
||||
我们寻找一组三次基函数 $H_{00}(t), H_{10}(t), H_{01}(t), H_{11}(t)$,使得
|
||||
|
||||
$$
|
||||
H(t) = H_{00}(t)\, p_0 + H_{10}(t)\, m_0 + H_{01}(t)\, p_1 + H_{11}(t)\, m_1,
|
||||
$$
|
||||
|
||||
其中 $p_0 = f(x_0)$,$p_1 = f(x_1)$ 是端点值,$m_0 = h f'(x_0)$,$m_1 = h f'(x_1)$ 是按区间长度缩放后的端点导数(因为对 $t$ 求导带来因子 $h$,详见 3.4 节)。
|
||||
|
||||
每个基函数在 $t=0,1$ 两端的"值/导数"特征如下表(这正是它们的**定义性质**):
|
||||
|
||||
| 基函数 | $值(0)$ | $导数(0)$ | $值(1)$ | $导数(1)$ | 作用 |
|
||||
|---|---|---|---|---|---|
|
||||
| $H_{00}$ | $1$ | $0$ | $0$ | $0$ | 携带左端点值 $p_0$ |
|
||||
| $H_{10}$ | $0$ | $1$ | $0$ | $0$ | 携带左端点切线 $m_0$ |
|
||||
| $H_{01}$ | $0$ | $0$ | $1$ | $0$ | 携带右端点值 $p_1$ |
|
||||
| $H_{11}$ | $0$ | $0$ | $0$ | $1$ | 携带右端点切线 $m_1$ |
|
||||
|
||||
### 3.3 基函数的推导
|
||||
|
||||
每个基函数是 $t$ 的三次多项式,写作 $H(t) = a t^3 + b t^2 + c t + d$,由上表的 4 个条件唯一确定。注意 $H'(t) = 3a t^2 + 2b t + c$。
|
||||
|
||||
**推导 $H_{00}$**:要求 $H_{00}(0)=1, H_{00}'(0)=0, H_{00}(1)=0, H_{00}'(1)=0$。
|
||||
- $H_{00}(0)=d=1$。
|
||||
- $H_{00}'(0)=c=0$。
|
||||
- $H_{00}(1)=a+b+c+d=a+b+1=0 \Rightarrow a+b=-1$。
|
||||
- $H_{00}'(1)=3a+2b+c=3a+2b=0 \Rightarrow b=-\tfrac{3}{2}a$。
|
||||
- 代入 $a+b=-1$:$a-\tfrac{3}{2}a=-1 \Rightarrow -\tfrac{1}{2}a=-1 \Rightarrow a=2$,于是 $b=-3$。
|
||||
|
||||
$$
|
||||
\boxed{H_{00}(t) = 2t^3 - 3t^2 + 1.}
|
||||
$$
|
||||
|
||||
**推导 $H_{10}$**:要求 $H_{10}(0)=0, H_{10}'(0)=1, H_{10}(1)=0, H_{10}'(1)=0$。
|
||||
- $d=0$;$c=1$。
|
||||
- $a+b+c+d=a+b+1=0 \Rightarrow a+b=-1$。
|
||||
- $3a+2b+c=3a+2b+1=0 \Rightarrow 3a+2b=-1$。
|
||||
- 由 $a+b=-1$ 得 $b=-1-a$,代入:$3a+2(-1-a)=-1 \Rightarrow a-2=-1 \Rightarrow a=1$,$b=-2$。
|
||||
|
||||
$$
|
||||
\boxed{H_{10}(t) = t^3 - 2t^2 + t.}
|
||||
$$
|
||||
|
||||
**推导 $H_{01}$**:要求 $H_{01}(0)=0, H_{01}'(0)=0, H_{01}(1)=1, H_{01}'(1)=0$。
|
||||
- $d=0$;$c=0$。
|
||||
- $a+b=1$;$3a+2b=0 \Rightarrow b=-\tfrac{3}{2}a$。
|
||||
- $a-\tfrac{3}{2}a=1 \Rightarrow -\tfrac12 a=1 \Rightarrow a=-2$,$b=3$。
|
||||
|
||||
$$
|
||||
\boxed{H_{01}(t) = -2t^3 + 3t^2.}
|
||||
$$
|
||||
|
||||
**推导 $H_{11}$**:要求 $H_{11}(0)=0, H_{11}'(0)=0, H_{11}(1)=0, H_{11}'(1)=1$。
|
||||
- $d=0$;$c=0$。
|
||||
- $a+b=0$;$3a+2b=1$。
|
||||
- 由 $b=-a$:$3a-2a=1 \Rightarrow a=1$,$b=-1$。
|
||||
|
||||
$$
|
||||
\boxed{H_{11}(t) = t^3 - t^2.}
|
||||
$$
|
||||
|
||||
**验证(单位分解性质)**:注意 $H_{00}(t) + H_{01}(t) = (2t^3-3t^2+1) + (-2t^3+3t^2) = 1$。这保证了对常值函数 $f\equiv c$(其导数为 $0$)的插值结果恒为 $c$,符合预期。
|
||||
|
||||
### 3.4 完整公式(一般区间 $[x_0, x_1]$)
|
||||
|
||||
把 $t = (x-x_0)/h$ 代回,并注意链式法则 $\frac{\mathrm d}{\mathrm dx} = \frac{1}{h}\frac{\mathrm d}{\mathrm dt}$,对 $x$ 的导数与对 $t$ 的导数相差因子 $1/h$。因此端点导数 $f'(x_i)$ 与对 $t$ 的导数关系为 $\frac{\mathrm dH}{\mathrm dt}\big|_{t=0} = h f'(x_0)$,这解释了 3.2 节中为何令 $m_0 = h f'(x_0)$、$m_1 = h f'(x_1)$。最终插值多项式为
|
||||
|
||||
$$
|
||||
\boxed{
|
||||
H(x) = H_{00}(t)\,f(x_0) + H_{10}(t)\,h\,f'(x_0) + H_{01}(t)\,f(x_1) + H_{11}(t)\,h\,f'(x_1),
|
||||
\qquad t=\frac{x-x_0}{h},\ h=x_1-x_0.
|
||||
}
|
||||
$$
|
||||
|
||||
展开为
|
||||
|
||||
$$
|
||||
\begin{aligned}
|
||||
H(x) ={}& (2t^3-3t^2+1)\,f(x_0) + (t^3-2t^2+t)\,h\,f'(x_0) \\
|
||||
&+ (-2t^3+3t^2)\,f(x_1) + (t^3-t^2)\,h\,f'(x_1).
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
### 3.5 数值算例
|
||||
|
||||
设 $f(x) = \sin x$,节点 $x_0 = 0$,$x_1 = \tfrac{\pi}{2}$。则
|
||||
|
||||
$$
|
||||
\begin{aligned}
|
||||
&f(x_0) = \sin 0 = 0, & &f'(x_0) = \cos 0 = 1, \\
|
||||
&f(x_1) = \sin\tfrac{\pi}{2} = 1, & &f'(x_1) = \cos\tfrac{\pi}{2} = 0,
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
且 $h = \tfrac{\pi}{2} \approx 1.5708$。代入完整公式(仅 $f(x_0)=0$、$f'(x_1)=0$ 两项消失):
|
||||
|
||||
$$
|
||||
H(x) = H_{10}(t)\,h\cdot 1 + H_{01}(t)\cdot 1
|
||||
= h(t^3 - 2t^2 + t) + (-2t^3 + 3t^2),
|
||||
$$
|
||||
|
||||
其中 $t = x / h = \dfrac{2x}{\pi}$。
|
||||
|
||||
**在区间中点 $x = \tfrac{\pi}{4}$ 处检验**(此时 $t = 0.5$):
|
||||
|
||||
$$
|
||||
\begin{aligned}
|
||||
H_{10}(0.5) &= 0.125 - 0.5 + 0.5 = 0.125, \\
|
||||
H_{01}(0.5) &= -0.25 + 0.75 = 0.5, \\
|
||||
H(\tfrac{\pi}{4}) &= 1.5708 \times 0.125 + 1 \times 0.5 = 0.19635 + 0.5 = 0.69635.
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
真实值 $\sin\tfrac{\pi}{4} = \tfrac{\sqrt2}{2} \approx 0.70711$。误差约为 $0.0108$,对仅用两个节点的三次插值而言已相当精确。作为对比,仅用相同两节点的线性 Lagrange 插值在中点给出 $0.5$,误差高达 $0.207$,可见匹配导数信息带来的显著改进。
|
||||
|
||||
---
|
||||
|
||||
## 四、一般 Hermite 插值的构造方法
|
||||
|
||||
### 4.1 方法一:基函数法(广义 Lagrange 基)
|
||||
|
||||
对**标准 Hermite 插值**(每个节点匹配 $f(x_i)$ 与 $f'(x_i)$,$i=0,\dots,n$),插值多项式次数 $\le 2n+1$,可写成
|
||||
|
||||
$$
|
||||
H_{2n+1}(x) = \sum_{i=0}^{n} f(x_i)\, h_i(x) + \sum_{i=0}^{n} f'(x_i)\, \hat h_i(x),
|
||||
$$
|
||||
|
||||
其中 $h_i(x)$ 与 $\hat h_i(x)$ 是满足下列"选择性"条件的基函数($\delta_{ij}$ 为 Kronecker 符号):
|
||||
|
||||
$$
|
||||
\begin{aligned}
|
||||
h_i(x_j) = \delta_{ij}, &\qquad h_i'(x_j) = 0, \\
|
||||
\hat h_i(x_j) = 0, &\qquad \hat h_i'(x_j) = \delta_{ij}.
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
**构造公式**:借助 Lagrange 基函数
|
||||
|
||||
$$
|
||||
\ell_i(x) = \prod_{\substack{j=0 \\ j\ne i}}^{n} \frac{x - x_j}{x_i - x_j},
|
||||
$$
|
||||
|
||||
可以证明
|
||||
|
||||
$$
|
||||
\boxed{
|
||||
\begin{aligned}
|
||||
h_i(x) &= \big[\,1 - 2(x - x_i)\,\ell_i'(x_i)\,\big]\,\ell_i^2(x), \\
|
||||
\hat h_i(x) &= (x - x_i)\,\ell_i^2(x).
|
||||
\end{aligned}
|
||||
}
|
||||
$$
|
||||
|
||||
**验证思路**:因 $\ell_i(x_j) = \delta_{ij}$,故 $\ell_i^2(x_j) = \delta_{ij}$,于是 $\hat h_i(x_j) = (x_j-x_i)\delta_{ij} = 0$ 对一切 $j$ 成立;又 $\hat h_i'(x) = \ell_i^2(x) + (x-x_i)\cdot 2\ell_i\ell_i'$,在 $x=x_j$ 处当 $j\ne i$ 时 $\ell_i(x_j)=0$ 使两项皆为 $0$,当 $j=i$ 时第一项 $\ell_i^2(x_i)=1$、第二项含因子 $(x_i-x_i)=0$,故 $\hat h_i'(x_j)=\delta_{ij}$。$h_i$ 中的线性因子 $[1 - 2(x-x_i)\ell_i'(x_i)]$ 正是为抵消 $\ell_i^2$ 在 $x_i$ 处的导数而精心设计的。
|
||||
|
||||
基函数法概念清晰、利于理论分析,但当节点数较多或含高阶切触时,公式变得繁琐,**实际计算更推荐下面的差商法**。
|
||||
|
||||
### 4.2 方法二:重节点的差商法(Newton 形式,推荐)
|
||||
|
||||
Newton 均差(divided differences,差商)插值可以**自然地推广**到 Hermite 情形:把每个节点按其重数 $m_i+1$ **重复列出**,对于重复的节点,差商表中无法用普通差商公式(会出现 $0/0$)的位置,**用导数值填充**。
|
||||
|
||||
#### 4.2.1 重节点差商的定义
|
||||
|
||||
普通差商递归定义为
|
||||
|
||||
$$
|
||||
f[x_i] = f(x_i), \qquad
|
||||
f[x_i, \dots, x_{i+k}] = \frac{f[x_{i+1},\dots,x_{i+k}] - f[x_i,\dots,x_{i+k-1}]}{x_{i+k} - x_i}.
|
||||
$$
|
||||
|
||||
当节点重合($x_{i+k} \to x_i$)时,分母为零。此时由微分中值定理的极限给出**重节点差商**:
|
||||
|
||||
$$
|
||||
\boxed{\,\underbrace{f[x_i, x_i, \dots, x_i]}_{k+1 \text{ 个}} = \frac{f^{(k)}(x_i)}{k!}.\,}
|
||||
$$
|
||||
|
||||
特别地:
|
||||
|
||||
$$
|
||||
f[x_i, x_i] = f'(x_i), \qquad f[x_i, x_i, x_i] = \frac{f''(x_i)}{2}.
|
||||
$$
|
||||
|
||||
#### 4.2.2 构造步骤
|
||||
|
||||
1. 建立**重复节点序列** $z_0, z_1, \dots, z_{N-1}$:把 $x_i$ 重复 $m_i+1$ 次依次排列。
|
||||
2. 建立差商表。**对角线(最高阶差商)**逐列计算:
|
||||
- 若相邻两个 $z$ 不相等,用普通差商公式;
|
||||
- 若相邻两个 $z$ 相等(对应同一节点),用上面的导数公式填充。
|
||||
3. 取**表的顶部对角线元素**作为 Newton 系数,写出多项式:
|
||||
|
||||
$$
|
||||
\boxed{
|
||||
H(x) = \sum_{k=0}^{N-1} f[z_0, z_1, \dots, z_k] \prod_{j=0}^{k-1}(x - z_j).
|
||||
}
|
||||
$$
|
||||
|
||||
#### 4.2.3 算例:带重节点的差商表
|
||||
|
||||
求满足下列条件的多项式(即两点三次 Hermite,与第三节呼应,便于互相验证):
|
||||
|
||||
$$
|
||||
f(0) = 1,\quad f'(0) = 0,\quad f(1) = 0,\quad f'(1) = -1.
|
||||
$$
|
||||
|
||||
重复节点序列:$z_0 = z_1 = 0$,$z_2 = z_3 = 1$。差商表如下(左列为 $z$ 与 $f$,向右逐阶):
|
||||
|
||||
$$
|
||||
\begin{array}{c|cccc}
|
||||
z & f[\cdot] & f[\cdot,\cdot] & f[\cdot,\cdot,\cdot] & f[\cdot,\cdot,\cdot,\cdot] \\ \hline
|
||||
0 & 1 & & & \\
|
||||
& & \mathbf{0} & & \\
|
||||
0 & 1 & & -1 & \\
|
||||
& & -1 & & \mathbf{1} \\
|
||||
1 & 0 & & 0 & \\
|
||||
& & -1 & & \\
|
||||
1 & 0 & & & \\
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
逐项说明:
|
||||
|
||||
- 一阶差商列:
|
||||
- $f[z_0,z_1] = f[0,0] = f'(0) = 0$(重节点,用导数)。
|
||||
- $f[z_1,z_2] = f[0,1] = \dfrac{0 - 1}{1 - 0} = -1$(普通差商)。
|
||||
- $f[z_2,z_3] = f[1,1] = f'(1) = -1$(重节点,用导数)。
|
||||
- 二阶差商列:
|
||||
- $f[z_0,z_1,z_2] = \dfrac{f[z_1,z_2] - f[z_0,z_1]}{z_2 - z_0} = \dfrac{-1 - 0}{1 - 0} = -1$。
|
||||
- $f[z_1,z_2,z_3] = \dfrac{f[z_2,z_3] - f[z_1,z_2]}{z_3 - z_1} = \dfrac{-1 - (-1)}{1 - 0} = 0$。
|
||||
- 三阶差商(顶部):
|
||||
- $f[z_0,z_1,z_2,z_3] = \dfrac{f[z_1,z_2,z_3] - f[z_0,z_1,z_2]}{z_3 - z_0} = \dfrac{0 - (-1)}{1 - 0} = 1$。
|
||||
|
||||
于是顶部对角线系数依次为 $1,\ 0,\ -1,\ 1$,Newton 形式为
|
||||
|
||||
$$
|
||||
\begin{aligned}
|
||||
H(x) &= 1 + 0\cdot(x-0) + (-1)(x-0)(x-0) + 1\cdot(x-0)(x-0)(x-1) \\
|
||||
&= 1 - x^2 + x^2(x-1) \\
|
||||
&= 1 - x^2 + x^3 - x^2 \\
|
||||
&= x^3 - 2x^2 + 1.
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
**验证**:$H(0)=1$ ✓;$H'(x)=3x^2-4x$,$H'(0)=0$ ✓;$H(1)=1-2+1=0$ ✓;$H'(1)=3-4=-1$ ✓。四个切触条件全部满足,构造正确。
|
||||
|
||||
> **说明**:差商法的最大优点是**统一处理任意阶切触**。无论某节点要匹配到几阶导数,只需把它重复相应次数、在重节点位置填入 $f^{(k)}(x_i)/k!$ 即可,无需为每种情形单独设计基函数。这也是教科书和数值库内部最常采用的实现思路。
|
||||
|
||||
---
|
||||
|
||||
## 五、误差分析
|
||||
|
||||
### 5.1 误差余项公式
|
||||
|
||||
> **定理(Hermite 插值余项)**
|
||||
> 设 $f \in C^{N}[a,b]$,节点 $x_0,\dots,x_n \in [a,b]$ 互异,切触阶为 $m_0,\dots,m_n$,$N=\sum(m_i+1)$,$H(x)$ 为满足全部切触条件、次数 $\le N-1$ 的 Hermite 插值多项式。则对任意 $x\in[a,b]$,存在依赖于 $x$ 的 $\xi=\xi(x)\in(a,b)$,使得
|
||||
> $$
|
||||
> \boxed{\,f(x) - H(x) = \frac{f^{(N)}(\xi)}{N!}\,\prod_{i=0}^{n}(x - x_i)^{m_i+1}.\,}
|
||||
> $$
|
||||
|
||||
**证明要点(Rolle 定理法)**:固定 $x\ne x_i$。令节点因子 $W(t)=\prod_i (t-x_i)^{m_i+1}$(次数为 $N$),并构造辅助函数
|
||||
|
||||
$$
|
||||
g(t) = f(t) - H(t) - \frac{f(x)-H(x)}{W(x)}\,W(t).
|
||||
$$
|
||||
|
||||
则 $g$ 在 $t=x$ 处为零,且在每个 $x_i$ 处有 $m_i+1$ 重零点(因 $f-H$ 与 $W$ 在 $x_i$ 处都有相应阶的零)。于是 $g$(计重数)至少有 $N+1$ 个零点。反复使用 Rolle 定理,$g^{(N)}$ 至少有一个零点 $\xi$。由于 $H$ 次数 $\le N-1$ 故 $H^{(N)}\equiv 0$,而 $W^{(N)}=N!$,代入 $g^{(N)}(\xi)=0$ 解得
|
||||
|
||||
$$
|
||||
f^{(N)}(\xi) - \frac{f(x)-H(x)}{W(x)}\,N! = 0
|
||||
\;\Longrightarrow\;
|
||||
f(x)-H(x) = \frac{f^{(N)}(\xi)}{N!}W(x). \qquad\blacksquare
|
||||
$$
|
||||
|
||||
### 5.2 标准 Hermite(每点匹配值与一阶导)的余项
|
||||
|
||||
此时每个 $m_i=1$,$N=2n+2$,余项为
|
||||
|
||||
$$
|
||||
f(x) - H(x) = \frac{f^{(2n+2)}(\xi)}{(2n+2)!}\prod_{i=0}^{n}(x-x_i)^2.
|
||||
$$
|
||||
|
||||
**两点三次情形**($n=1$,$N=4$):
|
||||
|
||||
$$
|
||||
f(x) - H_3(x) = \frac{f^{(4)}(\xi)}{4!}(x-x_0)^2(x-x_1)^2 = \frac{f^{(4)}(\xi)}{24}(x-x_0)^2(x-x_1)^2.
|
||||
$$
|
||||
|
||||
注意节点因子 $(x-x_i)^2 \ge 0$ 恒非负,这与 Lagrange 情形(节点因子可正可负)不同,反映了"相切"带来的更强约束。
|
||||
|
||||
### 5.3 与 Lagrange 插值误差的对比
|
||||
|
||||
| 对比项 | Lagrange 插值($n+1$ 点) | Hermite 插值(标准,$n+1$ 点) |
|
||||
|---|---|---|
|
||||
| 多项式次数 | $\le n$ | $\le 2n+1$ |
|
||||
| 余项导数阶 | $f^{(n+1)}$ | $f^{(2n+2)}$ |
|
||||
| 余项公式 | $\dfrac{f^{(n+1)}(\xi)}{(n+1)!}\prod (x-x_i)$ | $\dfrac{f^{(2n+2)}(\xi)}{(2n+2)!}\prod (x-x_i)^2$ |
|
||||
| 节点因子符号 | 可正可负 | 恒 $\ge 0$ |
|
||||
| 收敛阶(等距 $h$) | $O(h^{n+1})$ | $O(h^{2n+2})$ |
|
||||
|
||||
**关键结论**:在使用相同节点数的前提下,Hermite 插值由于额外利用了导数信息,余项中出现**更高阶的导数**与**更高次的节点因子幂**,因而通常具有**更高的逼近精度(更高的收敛阶)**。代价是需要已知导数值,且多项式次数翻倍——次数过高时同样可能出现 Runge 现象,故实际更常用**分段**形式(见第六节)。
|
||||
|
||||
---
|
||||
|
||||
## 六、与样条的联系
|
||||
|
||||
### 6.1 分段三次 Hermite 插值
|
||||
|
||||
当节点很多时,直接构造高次 Hermite 多项式会引发振荡(Runge 现象)。实用做法是**分段**:在每个相邻区间 $[x_i, x_{i+1}]$ 上用第三节的两点三次 Hermite 公式构造一段三次多项式,再拼接起来。
|
||||
|
||||
由于每段都在端点匹配函数值与一阶导数,拼接处天然满足
|
||||
|
||||
$$
|
||||
H(x_i^-) = H(x_i^+) = f(x_i), \qquad H'(x_i^-) = H'(x_i^+) = f'(x_i),
|
||||
$$
|
||||
|
||||
即整条曲线达到 **$C^1$ 连续**(函数与一阶导都连续)。这正是分段三次 Hermite 插值(Piecewise Cubic Hermite Interpolation)。其前提是**每个节点的导数 $f'(x_i)$ 已知或被估计出来**。
|
||||
|
||||
### 6.2 三次样条与 Hermite 形式的关系
|
||||
|
||||
**三次样条(cubic spline)**同样是分段三次、$C^1$ 连续,但它额外要求
|
||||
|
||||
$$
|
||||
H''(x_i^-) = H''(x_i^+), \qquad i=1,\dots,n-1,
|
||||
$$
|
||||
|
||||
即**二阶导数也连续**,从而整体达到 **$C^2$ 连续**,曲线更光滑(曲率不突变)。
|
||||
|
||||
两者的本质区别在于"导数从何而来":
|
||||
|
||||
- **分段 Hermite**:各节点的斜率 $f'(x_i)$ 是**给定或局部估计**的(局部方法,每段相互独立),只保证 $C^1$。
|
||||
- **三次样条**:斜率(或二阶导)是通过求解一个**全局三对角线性方程组**确定的,目的是让二阶导连续,因此是**全局方法**,达到 $C^2$,但任一数据点的改动会影响整条曲线。
|
||||
|
||||
事实上,任何三次样条都可以**改写成分段 Hermite 形式**:只要先解出样条在各节点的导数值 $s'(x_i)$,再把这些导数当作 Hermite 的输入即可。所以"三次样条"可视为"用全局光滑性条件自动确定斜率的分段三次 Hermite 插值"。
|
||||
|
||||
### 6.3 单调性保持(PCHIP)
|
||||
|
||||
分段三次 Hermite 的一个重要变体是 **PCHIP(Piecewise Cubic Hermite Interpolating Polynomial)**。它不直接使用真实导数,而是用一套特殊规则**估计每个节点的斜率 $d_i$**,使得:
|
||||
|
||||
- 在数据单调的区间内,插值曲线**保持单调**,不产生过冲(overshoot)/ 振荡;
|
||||
- 在局部极值点处令斜率为 $0$,避免越过数据点。
|
||||
|
||||
具体地,PCHIP 在内部节点用相邻区间斜率的**加权调和平均**来估计 $d_i$:若相邻两段割线斜率 $\delta_{i-1}, \delta_i$ 同号,则
|
||||
|
||||
$$
|
||||
\frac{w_1+w_2}{d_i} = \frac{w_1}{\delta_{i-1}} + \frac{w_2}{\delta_i},
|
||||
\qquad w_1 = 2h_i + h_{i-1},\ w_2 = h_i + 2h_{i-1},
|
||||
$$
|
||||
|
||||
否则(异号或某段为零,即遇到局部极值)令 $d_i = 0$。这保证了形状保持性。与三次样条相比,PCHIP 牺牲了 $C^2$ 光滑(只保 $C^1$),换来**无过冲**的视觉与物理可靠性,非常适合插值带有尖锐变化或单调段的数据。
|
||||
|
||||
---
|
||||
|
||||
## 七、应用场景
|
||||
|
||||
### 7.1 计算机图形学:三次 Hermite 曲线
|
||||
|
||||
第三节的四基函数 $H_{00},H_{10},H_{01},H_{11}$ 正是图形学中**三次 Hermite 曲线(Cubic Hermite Spline)**的数学基础。给定两端点 $\mathbf P_0,\mathbf P_1$ 与两端切向量 $\mathbf T_0,\mathbf T_1$(这里把标量推广为向量,对每个坐标分量分别插值):
|
||||
|
||||
$$
|
||||
\mathbf P(t) = H_{00}(t)\mathbf P_0 + H_{10}(t)\mathbf T_0 + H_{01}(t)\mathbf P_1 + H_{11}(t)\mathbf T_1,\quad t\in[0,1].
|
||||
$$
|
||||
|
||||
设计师通过拖动切向量即可直观地控制曲线的"出入方向"。
|
||||
|
||||
**Catmull-Rom 样条**是其著名特例:它自动地把每个控制点的切向量取为相邻两点连线方向
|
||||
|
||||
$$
|
||||
\mathbf T_i = \frac{1}{2}(\mathbf P_{i+1} - \mathbf P_{i-1}),
|
||||
$$
|
||||
|
||||
从而只需给一串点就能生成一条**经过所有控制点、$C^1$ 连续**的光滑曲线,广泛用于路径与曲线设计。
|
||||
|
||||
### 7.2 动画关键帧插值与相机路径
|
||||
|
||||
在动画中,美术师设置若干**关键帧(keyframe)**:在某些时刻指定物体的位置、旋转、缩放等属性。系统需要在关键帧之间"补间(in-between)"。使用 Hermite 插值(指定每个关键帧的属性值**及其变化速率/切线**)可以让运动平滑、避免在关键帧处出现速度突变(折角)。相机沿预定轨迹平移、推拉时同样依赖 Hermite/样条曲线得到流畅运镜。
|
||||
|
||||
### 7.3 数值微分方程与轨迹规划
|
||||
|
||||
- **常微分方程数值解**:一些方法(如 Hermite–Obreschkoff、含导数信息的密集输出/dense output)利用解在网格点的函数值与导数值(导数恰由 ODE 右端 $f(t,y)$ 直接给出)做 Hermite 插值,得到任意时刻的高精度连续解。
|
||||
- **机器人/无人机轨迹规划**:要求轨迹在路点(waypoint)处同时满足位置与速度(甚至加速度)约束,正是高阶 Hermite 插值的典型用武之地——它能保证速度连续,使运动平稳、可执行。
|
||||
|
||||
---
|
||||
|
||||
## 八、Python 代码示例
|
||||
|
||||
下面用 `numpy` 从零实现两点三次 Hermite 插值,并用 SciPy 的 `CubicHermiteSpline` 与 `BPoly.from_derivatives` 进行对照验证。代码可直接运行。
|
||||
|
||||
```python
|
||||
import numpy as np
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# 1) 基函数法:标准区间 [0,1] 上的四个三次 Hermite 基函数
|
||||
# ----------------------------------------------------------------------
|
||||
def hermite_basis(t):
|
||||
"""返回 (H00, H10, H01, H11) 在参数 t 处的值。t 可为标量或 numpy 数组。"""
|
||||
H00 = 2 * t**3 - 3 * t**2 + 1 # 携带左端点值
|
||||
H10 = t**3 - 2 * t**2 + t # 携带左端点切线
|
||||
H01 = -2 * t**3 + 3 * t**2 # 携带右端点值
|
||||
H11 = t**3 - t**2 # 携带右端点切线
|
||||
return H00, H10, H01, H11
|
||||
|
||||
|
||||
def cubic_hermite(x, x0, x1, p0, p1, m0, m1):
|
||||
"""
|
||||
两点三次 Hermite 插值。
|
||||
x0, x1 : 两个节点
|
||||
p0, p1 : 端点函数值 f(x0), f(x1)
|
||||
m0, m1 : 端点一阶导数 f'(x0), f'(x1)
|
||||
返回 H(x)。
|
||||
"""
|
||||
h = x1 - x0
|
||||
t = (x - x0) / h
|
||||
H00, H10, H01, H11 = hermite_basis(t)
|
||||
# 注意导数项需乘以区间长度 h(链式法则)
|
||||
return H00 * p0 + H10 * (h * m0) + H01 * p1 + H11 * (h * m1)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# 2) 算例:用 f(x)=sin(x) 在 [0, pi/2] 上做两点三次 Hermite 插值
|
||||
# ----------------------------------------------------------------------
|
||||
x0, x1 = 0.0, np.pi / 2
|
||||
p0, p1 = np.sin(x0), np.sin(x1) # 函数值: 0, 1
|
||||
m0, m1 = np.cos(x0), np.cos(x1) # 导数值: 1, 0
|
||||
|
||||
xs = np.linspace(x0, x1, 9)
|
||||
H_vals = cubic_hermite(xs, x0, x1, p0, p1, m0, m1)
|
||||
true_vals = np.sin(xs)
|
||||
|
||||
print("x Hermite sin(x) 误差")
|
||||
for x, h, s in zip(xs, H_vals, true_vals):
|
||||
print(f"{x:.4f} {h:.6f} {s:.6f} {abs(h - s):.2e}")
|
||||
|
||||
# 在中点 pi/4 处单独检验(对应正文 3.5 节)
|
||||
xm = np.pi / 4
|
||||
print(f"\n中点 H(pi/4) = {cubic_hermite(xm, x0, x1, p0, p1, m0, m1):.5f}, "
|
||||
f"真值 = {np.sin(xm):.5f}")
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# 3) 与 SciPy 对照(若已安装 scipy)
|
||||
# ----------------------------------------------------------------------
|
||||
try:
|
||||
from scipy.interpolate import CubicHermiteSpline, BPoly
|
||||
|
||||
# CubicHermiteSpline 直接接受节点、函数值、导数值
|
||||
nodes = np.array([x0, x1])
|
||||
vals = np.array([p0, p1])
|
||||
ders = np.array([m0, m1])
|
||||
chs = CubicHermiteSpline(nodes, vals, ders)
|
||||
|
||||
# BPoly.from_derivatives: 每个节点给 [值, 一阶导]
|
||||
bp = BPoly.from_derivatives(nodes, [[p0, m0], [p1, m1]])
|
||||
|
||||
max_err_chs = np.max(np.abs(chs(xs) - H_vals))
|
||||
max_err_bp = np.max(np.abs(bp(xs) - H_vals))
|
||||
print(f"\n与 CubicHermiteSpline 的最大偏差: {max_err_chs:.2e}")
|
||||
print(f"与 BPoly.from_derivatives 的最大偏差: {max_err_bp:.2e}")
|
||||
# 两者应与自实现完全一致(偏差约为机器精度 ~1e-16)
|
||||
except ImportError:
|
||||
print("\n未安装 scipy,跳过对照验证。")
|
||||
```
|
||||
|
||||
**预期输出**(节选):自实现结果与 SciPy 两种方法的偏差均在机器精度量级(约 $10^{-16}$),中点处 $H(\pi/4)\approx 0.69635$,与正文 3.5 节手算一致。
|
||||
|
||||
---
|
||||
|
||||
## 九、小结表格
|
||||
|
||||
下表对比三种最常用的插值方案,帮助快速选型:
|
||||
|
||||
| 对比维度 | Lagrange 插值 | Hermite 插值(标准) | 三次样条(cubic spline) |
|
||||
|---|---|---|---|
|
||||
| **匹配条件** | 仅节点函数值 $f(x_i)$ | 节点函数值 $f(x_i)$ **与导数值** $f'(x_i)$(可含更高阶) | 节点函数值;导数由全局光滑条件自动确定 |
|
||||
| **多项式形态** | 单个次数 $\le n$ 的多项式 | 单个次数 $\le 2n+1$ 的多项式(或分段三次) | 分段三次多项式 |
|
||||
| **连续性** | 自身光滑(单个多项式),分段拼接仅 $C^0$ | 节点处达 $C^1$(分段时);插值更"贴合" | $C^2$(二阶导连续,最光滑) |
|
||||
| **是否需导数** | 否 | **是**(须已知或估计 $f'$) | 否(自动求解) |
|
||||
| **误差余项** | $\dfrac{f^{(n+1)}(\xi)}{(n+1)!}\prod(x-x_i)$ | $\dfrac{f^{(2n+2)}(\xi)}{(2n+2)!}\prod(x-x_i)^2$ | 分段,$O(h^4)$ 量级 |
|
||||
| **局部/全局** | 全局(改一点影响整体) | 局部(分段 Hermite 每段独立) | 全局(解三对角方程组) |
|
||||
| **典型用途** | 理论分析、低阶插值、推导数值公式 | 图形学曲线、动画关键帧、轨迹规划、ODE 密集输出 | 数据光滑拟合、CAD 曲线、平滑插值 |
|
||||
| **代表实现** | — | `CubicHermiteSpline`、`BPoly.from_derivatives`、PCHIP | `CubicSpline` |
|
||||
|
||||
---
|
||||
|
||||
## 参考与延伸
|
||||
|
||||
- 经典数值分析教材(如 Burden & Faires《Numerical Analysis》、李庆扬《数值分析》)中关于 Hermite 插值与差商的章节。
|
||||
- SciPy 文档:[`CubicHermiteSpline`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.CubicHermiteSpline.html)、[`PchipInterpolator`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.html)、`BPoly.from_derivatives`。
|
||||
- 计算机图形学中关于 Hermite 曲线、Bézier 曲线与 Catmull-Rom 样条相互转化的资料。
|
||||
|
||||
> **一句话总结**:Hermite 插值通过同时匹配函数值与导数值,让插值曲线在节点处"相切",以更高的收敛阶和更好的光滑性逼近原函数;其两点三次形式与分段推广(含 PCHIP、Catmull-Rom)是图形学、动画与轨迹规划的基石,实际构造首选**重节点差商法**。
|
||||
Reference in New Issue
Block a user