在生产实践中,由于给出的通常是一批离散的样点,为了满足设计和理论分析的需要,我们需要寻求函数的分析表达式。解决这类问题主要有两类方法:一类是要求近似函数严格通过给定的已知样点,这称为插值法;另一类则不要求严格通过已知点,只要求总偏差最小,称为曲线拟合法。本文详细梳理插值法(特别是多项式插值)的理论、公式推导及误差分析。
一、拉格朗日 (Lagrange) 插值
1、多项式插值原理
代数插值的基本问题是:已知函数 $f(x)$ 在区间 $[a,b]$ 上的 $n+1$ 个互异点 $x_0, x_1, \dots, x_n$ 处的函数值为 $y_i = f(x_i)$ $(i=0, 1, \dots, n)$,需要寻求一个至多为 $n$ 次的多项式:
$$ \varphi_n(x) = a_0 + a_1 x + \dots + a_n x^n $$
使其满足插值条件:
$$ \varphi_n(x_i) = f(x_i) = y_i \quad (i=0, 1, \dots, n) $$
将这 $n+1$ 个条件代入,得到关于待定系数的线性方程组:
$$ \begin{cases} a_0 + a_1 x_0 + a_2 x_0^2 + \dots + a_n x_0^n = y_0 \\ a_0 + a_1 x_1 + a_2 x_1^2 + \dots + a_n x_1^n = y_1 \\ \dots \\ a_0 + a_1 x_n + a_2 x_n^2 + \dots + a_n x_n^n = y_n \end{cases} $$
该方程组的系数矩阵 $\boldsymbol{A}$ 的行列式为范德蒙德 (Vandermonde) 行列式:
$$ \det \boldsymbol{A} = \begin{vmatrix} 1 & x_0 & x_0^2 & \dots & x_0^n \\ 1 & x_1 & x_1^2 & \dots & x_1^n \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \dots & x_n^n \end{vmatrix} = \prod_{0 \le j < i \le n} (x_i - x_j) $$
由于 $x_i$ 互不相同,该行列式的值不为零,从而保证了方程组存在唯一解。这证明了满足插值条件的 $n$ 次多项式是存在且唯一的。
但是,求解行列式的时间复杂度是阶乘级别的,实际情况下难以适用。
2、插值多项式的误差估计
设插值多项式与被插函数的截断误差(插值余项)为 $R_n(x) = f(x) - \varphi_n(x)$。下面有如下定理:若 $f(x)$ 在 $[a,b]$ 上 $n+1$ 次连续可导,则对于 $[a,b]$ 内任意点 $x$,插值余项为:
$$ R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} \omega_{n+1}(x), \quad \xi \in (a,b) $$
其中 $\omega_{n+1}(x) = \prod_{j=0}^n (x - x_j)$。
证明:
构造辅助函数:对固定点 $x \neq x_i$,构造关于变量 $t$ 的辅助函数:
$$ \psi(t) = f(t) - \varphi_n(t) - \frac{R_n(x)}{\omega_{n+1}(x)} \omega_{n+1}(t) $$
显然 $\psi(x) = 0$。又因为插值条件使得 $R_n(x_i) = 0$,所以 $\psi(x_i) = 0$。因此 $\psi(t)$ 在 $[a,b]$ 内至少有 $n+2$ 个零点(即 $x, x_0, \dots, x_n$)。反复应用罗尔中值定理,由于 $\psi(t)$ 有 $n+2$ 个零点,其一阶导数 $\psi'(t)$ 至少有 $n+1$ 个零点。反复求导 $n+1$ 次,$\psi^{(n+1)}(t)$ 在区间内至少有一个零点,设为 $\xi$。
$$·
\psi^{(n+1)}(\xi) = 0$$ 由于 $\varphi_n(t)$ 是至多 $n$ 次多项式,$\varphi_n^{(n+1)}(t) \equiv 0$。同时,$\omega_{n+1}(t)$ 是最高次系数为 1 的 $n+1$ 次多项式,故 $\omega_{n+1}^{(n+1)}(t) = (n+1)!$。代入并化简: $$
\psi^{(n+1)}(\xi) = f^{(n+1)}(\xi) - 0 - \frac{R_n(x)}{\omega_{n+1}(x)} (n+1)! = 0
$$ 解得 $R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} \omega_{n+1}(x)$。该式对于节点 $x=x_i$ 同样成立。
3、拉格朗日 (Lagrange) 插值基函数
为了避免直接求解线性方程组的高昂计算量,我们采用基函数线性组合的思路。定义 Lagrange 插值基函数 $l_i(x)$,要求它满足:在节点 $x_i$ 处值为$1$,在其他节点处值为$0$:
$$ l_i(x_j) = \begin{cases} 0, & j \neq i \\ 1, & j = i \end{cases} $$
由此推导出 $l_i(x)$ 的表达式:
$$ l_i(x) = \prod_{\substack{j=0 \\ j \neq i}}^n \frac{x - x_j}{x_i - x_j} $$
由此得到 $n$ 次 Lagrange 插值多项式 $L_n(x)$:
$$ L_n(x) = \sum_{i=0}^n y_i l_i(x) = \sum_{i=0}^n y_i \left( \prod_{\substack{j=0 \\ j \neq i}}^n \frac{x - x_j}{x_i - x_j} \right) $$
由于 $L_n(x_k) = \sum y_i l_i(x_k) = y_k$,这严格满足插值条件。
二、牛顿 (Newton) 插值
Lagrange 插值虽然结构对称,但在增加新节点时,所有的基函数都要重新计算,很难受。Newton 插值通过引入“差商”的概念解决了这个问题。
1、差商
一阶差商定义为 $f[x_i, x_j] = \frac{f(x_i) - f(x_j)}{x_i - x_j}$。$k$ 阶差商是两个 $k-1$ 阶差商的差商:
$$ f[x_0, x_1, \dots, x_k] = \frac{f[x_0, \dots, x_{k-1}] - f[x_1, \dots, x_k]}{x_0 - x_k} $$
差商存在以下性质:
- 线性性:$f[x_0, \dots, x_k] = a\varphi[x_0, \dots, x_k] + b\psi[x_0, \dots, x_k]$。
- 函数值线性组合表示:$f[x_0, \dots, x_k] = \sum_{i=0}^k \frac{f(x_i)}{\omega'_{k+1}(x_i)}$。
- 对称性:改变节点顺序不改变差商的值,如 $f[x_i, x_j, x_k] = f[x_j, x_k, x_i]$。
与导数的关系:差商等于对应区间内某一点的高阶导数除以阶乘:
$$ f[x_0, x_1, \dots, x_n] = \frac{f^{(n)}(\xi)}{n!} $$
2、Newton 插值公式与推导
利用差商定义,我们可以不断展开函数值:
$$ f(x) = f(x_0) + (x - x_0)f[x, x_0] $$
$$ f[x, x_0] = f[x_0, x_1] + (x - x_1)f[x, x_0, x_1] $$
将后续展开式层层代入并消去相等部分,得到 Newton 插值公式:
$$ N_n(x) = f(x_0) + (x - x_0)f[x_0, x_1] + \dots + \prod_{i=0}^{n-1}(x - x_i) f[x_0, x_1, \dots, x_n] $$
其插值余项为 $R_n(x) = \omega_{n+1}(x) f[x, x_0, x_1, \dots, x_n]$ cite: 275。由于满足多项式插值唯一性,$N_n(x) \equiv L_n(x)$,其次余项与拉格朗日余项完全等价。这样优化后,每增加一个节点 $x_{n+1}$,只需增加一项:
$$ N_{n+1}(x) = N_n(x) + \prod_{i=0}^n(x - x_i) f[x_0, x_1, \dots, x_{n+1}] $$
这极大减少了计算量。
3、差分
当插值节点是等距的(即 $x_k = x_0 + kh$)时,计算可进一步简化,使用差分表示差商。
- 向前差分:$\Delta f_k = f_{k+1} - f_k$,高阶为 $\Delta^m f_k = \Delta^{m-1} f_{k+1} - \Delta^{m-1} f_k$。
- 向后差分:$\nabla f_k = f_k - f_{k-1}$。
- 中心差分:$\delta f_k = f(x_k + \frac{h}{2}) - f(x_k - \frac{h}{2})$。
差分可直接表示为函数值的线性组合:
$$ \Delta^m f_k = \sum_{j=0}^m (-1)^j \binom{m}{j} f_{k+m-j} $$
差商与差分的关系为:
$$ f[x_k, x_{k+1}, \dots, x_{k+m}] = \frac{\Delta^m f_k}{m! h^m} = \frac{\nabla^m f_{k+m}}{m! h^m} $$
4、等距节点插值公式
引入变换参数 $t$,有:
Newton 向前插值公式(适用于插值点靠近区间起点的计算):设 $x = x_0 + th$,代入前述 Newton 公式得:
$$ N_n(x_0 + th) = f_0 + t\Delta f_0 + \frac{t(t-1)}{2!} \Delta^2 f_0 + \dots + \frac{t(t-1)\dots(t-n+1)}{n!} \Delta^n f_0 $$
其余项为 $R_n(x) = \frac{t(t-1)\dots(t-n)}{(n+1)!} h^{n+1} f^{(n+1)}(\xi)$。
Newton 向后插值公式(适用于插值点靠近区间终点的计算):设 $x = x_n + th$,利用向后差分可得:
$$ N_n(x_n + th) = f_n + t\nabla f_n + \frac{t(t+1)}{2!} \nabla^2 f_n + \dots + \frac{t(t+1)\dots(t+n-1)}{n!} \nabla^n f_n $$
其余项为 $R_n(x) = \frac{t(t+1)\dots(t+n)}{(n+1)!} h^{n+1} f^{(n+1)}(\xi)$,这种通过差分表计算的方法进一步优化了等距点集上的插值效率。
三、分段线性插值
1、引入及其原理
在代数插值过程中,常常通过增加插值多项式的次数来提高对函数的逼近程度,但是往往不能得到有效的结果,例如对于函数$f(x)=\frac{1}{1+x^2}$,利用$10$阶拉格朗日插值,会得到下面的结果:

可见在$x$绝对值比较小的时候,其你和效果较好,但是在靠外的插值节点的部分,拟合效果极差,这就是龙格(Runge)现象,直观上容易想象,如果不用多项曲线,而是将曲线 $y=f(x)$ 的两个相邻的点用线段连接,这样得到的折线必定能较好地近似曲线。而且只要$f(x)$ 连续,节点越密,近似程度越好。由此得到启发,为提高精度,在加密节点时,可以把节点分成若干段,分段用低次多项式近似函数,这就是分段插值的思想。用折线近似曲线,相当于分段用线性插值,称为分段线性插值:

根据分段线性插值的理论直接写出 $l_i(x)$ 的表达式如下:
$$ l_0(x) = \begin{cases} \dfrac{x - x_1}{x_0 - x_1}, & x \in [x_0, x_1] \\ 0, & x \in (x_1, x_n] \end{cases} $$
$$ l_i(x) = \begin{cases} \dfrac{x - x_{i-1}}{x_i - x_{i-1}}, & x \in [x_{i-1}, x_i] \\ \dfrac{x - x_{i+1}}{x_i - x_{i+1}}, & x \in (x_i, x_{i+1}] \\ 0, & x \in [x_0, x_{i-1}) \cup (x_{i+1}, x_n] \end{cases} \quad (i=1, 2, \cdots, n-1) $$
$$ l_n(x) = \begin{cases} \dfrac{x - x_{n-1}}{x_n - x_{n-1}}, & x \in [x_{n-1}, x_n] \\ 0, & x \in [x_0, x_{n-1}) \end{cases} $$
类似于 Lagrange 插值多项式的构造,函数:
$$ \varphi(x) = \sum_{i=0}^n y_i l_i(x) $$
就是所求的分段线性插值函数。
2、代码
下面是生成图片“分段线性插值与原函数对比”图像的MATLAB代码:
% 1. 定义原函数 (Runge 函数)
f = @(x) 1 ./ (1 + x.^2);
% 2. 在 [-5, 5] 之间均匀取11个点,以进行分段线性插值
n = 10;
x_nodes = linspace(-5, 5, n + 1);
y_nodes = f(x_nodes);
% 3. 定义绘图区间 [-10, 10] 用于观察外推和龙格现象
x_plot = linspace(-10, 10, 500);
y_true = f(x_plot);
% 4. 计算分段线性插值结果
% 使用 interp1 函数进行分段线性插值,并启用 'extrap' 进行范围外推
y_interp = interp1(x_nodes, y_nodes, x_plot, 'linear', 'extrap');
% 5. 绘图对比
figure;
plot(x_plot, y_true, 'b-', 'LineWidth', 2); hold on;
plot(x_plot, y_interp, 'r--', 'LineWidth', 1.5);
plot(x_nodes, y_nodes, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'g');
% 图形修饰
title('分段线性插值与原函数对比');
xlabel('x');
ylabel('y');
legend('原函数 f(x) = 1/(1+x^2)', '分段线性插值', '插值节点', 'Location', 'Best');
grid on;
xlim([-10, 10]);
ylim([-2, 2]);
四、埃尔米特(Hermite)插值
1、问题引入与基本插值方法
对于插值函数,有时候不仅需要使其在节点处的函数值相同,还需要其实在节点处的导数与原函数导数相同,乃至是二阶或更高阶导数,这就是埃尔米特插值问题。
已知函数 $y=f(x)$ 在 $n+1$ 个互不相同的节点 $x_0, x_1, \cdots, x_n$ 处的函数值为 $y_i = f(x_i)$ $(i=0,1,\cdots,n)$,以及导数值 $y_i' = f'(x_i)$ $(i=0,1,\cdots,n)$,希望构造一个至多 $2n+1$ 次的多项式 $H(x)$,使得:
$$ H(x_i) = y_i,\quad H'(x_i) = y_i'\quad (i=0,1,\cdots,n) $$
满足上述条件的多项式 $H(x)$ 即为 Hermite 插值多项式。我们同样用插值基函数的方法求 Hermite 插值多项式。假设有两组函数 $h_i(x), H_i(x)\ (i=0,1,\cdots,n)$,满足以下条件:$h_i(x), H_i(x)\ (i=0,1,\cdots,n)$ 均为至多 $2n+1$ 次多项式;以及:
$$ h_i(x_j) = \begin{cases} 0, & j\neq i \\ 1, & j=i \end{cases},\quad h_i'(x_j) = 0\quad (j=0,1,\cdots,n) $$
$$ H_i(x_j) = 0,\quad H'_i(x_j) = \begin{cases} 0, & j\neq i \\ 1, & j=i \end{cases} $$
于是,Hermite 插值多项式为
$$ H(x) = \sum_{i=0}^n \left[y_i h_i(x) + y_i' H_i(x)\right] $$
该多项式满足条件,且次数不超过 $2n+1$。根据条件,$h_i(x)$ 在 $x_j(j\neq i)$ 处的函数值与导数值都为零,因此必须有因子 $(x-x_j)^2(j\neq i)$,所以可以设:
$$ h_i(x) = [a + b(x-x_i)]l_i^2(x) $$
其中 $l_i(x) = \omega_{n+1}(x)/(x-x_i)\omega_{n+1}'(x_i)$ 为 Lagrange 插值基函数。由条件,$h_i(x)$ 需满足:
$$ h_i(x_i)=1,\quad h_i'(x_i)=0 $$
代入得:
$$ h_i(x_i) = a l_i^2(x_i) = a = 1 $$
$$ h_i'(x_i) = b l_i^2(x_i) + 2 [a + b(x_i-x_i)] l_i(x_i) l_i'(x_i) = b + 2 a l_i'(x_i) = 0 $$
解得 $b = -2 l_i'(x_i)$,因此:
$$ h_i(x) = [1-2(x-x_i)l_i'(x_i)]l_i^2(x)\qquad(i=0,1,\cdots,n) $$
同理,由于 $H_i(x)$ 在 $x_j(j \neq i)$ 处的函数值与导数值均为 $0$,而 $H_i(x_i) = 0$,故可设:
$$ H_i(x) = c(x-x_i)l_i^2(x) $$
代入条件式得
$$ H_i'(x_i) = cl_i^2(x_i) = 1 $$
于是 $c=1$,因此
$$ H_i(x) = (x-x_i)l_i^2(x) \quad (i = 0,1,\cdots,n) $$
所以 Hermite 插值多项式为
$$ H(x) = \sum_{i=0}^{n} \left[ y_i h_i(x) + y_i' H_i(x) \right] $$
$$ \quad = \sum_{i=0}^{n} \left\{ [1-2(x-x_i)l_i'(x_i)]l_i^2(x) y_i + (x-x_i)l_i^2(x)y_i' \right\} $$
2、分段三次 Hermite 插值
根据 Hermite 插值多项式,特别地,当 $n=1$ 时,有:
$$ h_0(x) = \left( 1 + 2 \frac{x - x_0}{x_1 - x_0} \right) \left( \frac{x - x_1}{x_0 - x_1} \right)^2 $$
$$ h_1(x) = \left( 1 + 2 \frac{x - x_1}{x_0 - x_1} \right) \left( \frac{x - x_0}{x_1 - x_0} \right)^2 $$
$$ H_0(x) = (x - x_0) \left( \frac{x - x_1}{x_0 - x_1} \right)^2 $$
$$ H_1(x) = (x - x_1) \left( \frac{x - x_0}{x_1 - x_0} \right)^2 $$
所以,两个节点的三次 Hermite 插值多项式为:
$$ H(x) = \left( 1 + 2 \frac{x-x_0}{x_1-x_0} \right) \left( \frac{x-x_1}{x_0-x_1} \right)^2 y_0 + \left( 1 + 2 \frac{x-x_1}{x_0-x_1} \right) \left( \frac{x-x_0}{x_1-x_0} \right)^2 y_1 + (x-x_0)\left( \frac{x-x_1}{x_0-x_1} \right)^2 y_0' + (x-x_1)\left( \frac{x-x_0}{x_1-x_0} \right)^2 y_1' $$
当节点较多时,为避免多项式次数过高而引起非节点处的偏离过大,仍采用分段插值的方法。若把节点两两分段,在每一小段上作三次 Hermite 插值,就得到一个分段三次 Hermite 插值函数 $H(x)$,它满足:
- $H(x_i) = y_i, \; H'(x_i) = y_i' \quad (i=0,1,\cdots,n)$;
- 在每个小区间 $[x_i, x_{i+1}]$($i=0,1,\cdots, n-1$)上,$H(x)$ 是三次多项式。
也可以通过构造基函数给出分段三次 Hermite 插值函数的表达式。参照分段线性插值与 Hermite 插值基函数公式(5-47)和式(5-48),可得出分段三次 Hermite 插值的基函数为
$$ h_0(x) = \begin{cases} \left( 1+2\dfrac{x-x_0}{x_1-x_0} \right) \left( \dfrac{x-x_1}{x_0-x_1} \right)^2, & x \in [x_0,x_1] \\ 0, & x \in [x_1, x_n] \end{cases} $$
$$ h_i(x) = \begin{cases} \left( 1+2\dfrac{x-x_i}{x_{i-1}-x_i} \right) \left( \dfrac{x-x_{i-1}}{x_i-x_{i-1}} \right)^2, & x \in [x_{i-1},x_i] \\ \left( 1+2\dfrac{x-x_i}{x_{i+1}-x_i} \right) \left( \dfrac{x-x_{i+1}}{x_i-x_{i+1}} \right)^2, & x \in (x_i, x_{i+1}] \\ 0, & x \in [x_0, x_{i-1}) \cup (x_{i+1}, x_n] \end{cases} \qquad (i=1, \cdots, n-1) $$
$$ h_n(x) = \begin{cases} \left( 1+2\dfrac{x-x_n}{x_{n-1}-x_n} \right) \left( \dfrac{x-x_{n-1}}{x_n-x_{n-1}} \right)^2, & x \in [x_{n-1},x_n] \\ 0, & x \in [x_0, x_{n-1}) \end{cases} $$
$$ H_0(x) = \begin{cases} (x-x_0) \left( \dfrac{x-x_1}{x_0-x_1} \right)^2, & x\in [x_0, x_1] \\ 0, & x\in (x_1, x_n] \end{cases} $$
$$ H_i(x) = \begin{cases} (x-x_i) \left( \dfrac{x-x_{i-1}}{x_i-x_{i-1}} \right)^2, & x \in [x_{i-1}, x_i] \\ (x-x_i) \left( \dfrac{x-x_{i+1}}{x_i-x_{i+1}} \right)^2, & x \in (x_i, x_{i+1}] \\ 0, & x \in [x_0, x_{i-1}) \cup (x_{i+1}, x_n] \end{cases} \quad (i=1,\ldots,n-1) $$
$$ H_n(x) = \begin{cases} (x-x_n) \left( \dfrac{x-x_{n-1}}{x_n-x_{n-1}} \right)^2, & x\in [x_{n-1},x_n] \\ 0, & x\in [x_0,x_{n-1}) \end{cases} $$
分段三次 Hermite 插值函数为:
$$ H(x) = \sum_{i=0}^n \left[ y_i h_i(x) + y_i' H_i(x) \right] $$
五、样条插值
前述分段线性插值和分段三次 Hermite 插值虽然在一定程度上克服了高次多项式插值的龙格现象,但分段线性插值仅保证函数连续,导数不连续;分段三次 Hermite 插值虽能保证一阶导数连续,却无法保证二阶导数连续。然而在许多工程技术问题中,如飞机机翼外形设计、内燃机凸轮曲线等,不仅要求曲线连续,还要求曲率连续,即二阶导数连续。这就引出了样条插值。
1、样条函数的概念
所谓样条(Spline),原本是工程设计中使用的一种绘图工具,它是一根富有弹性的细木条或细金属条。绘图员用压铁固定样条在若干已知点上,迫使其通过这些点,样条自然弯曲形成一条光滑曲线,称为样条曲线,且在连接点处具有连续的曲率。三次样条插值正是由此抽象而来的数学模型。数学上将具有一定光滑性的分段多项式称为样条函数。具体地说,给定区间 $[a,b]$ 的一个分划:
$$ \Delta:\ a = x_0 < x_1 < \cdots < x_{n-1} < x_n = b $$
如果函数 $S(x)$ 满足:
- 在每个小区间 $[x_i, x_{i+1}]\ (i=0,1,\cdots,n-1)$ 上,$S(x)$ 是 $m$ 次多项式。
- $S(x)$ 在 $[a,b]$ 上具有 $m-1$ 阶连续导数。
则称 $S(x)$ 为关于分划 $\Delta$ 的 $m$ 次样条函数,其图形称为 $m$ 次样条曲线。显然,折线就是一次样条曲线。实际中最常用的是三次样条曲线,因为三次样条既能保证二阶导数连续,又不会因次数过高而产生剧烈振荡。
2、三次样条插值
利用样条函数进行插值,即取插值函数为样条函数,称为样条插值。分段线性插值便是一次样条插值。本节重点讨论三次样条插值。已知函数 $y=f(x)$ 在区间 $[a,b]$ 上的 $n+1$ 个互异节点:
$$ a = x_0 < x_1 < \cdots < x_n = b $$
处的函数值 $y_i = f(x_i)\ (i=0,1,\cdots,n)$,求插值函数 $S(x)$,使其满足:
- 插值条件:$S(x_i) = y_i \quad (i=0,1,\cdots,n)$。
- 在每个小区间 $[x_i, x_{i+1}]\ (i=0,1,\cdots,n-1)$ 上,$S(x)$ 是三次多项式,记为 $S_i(x)$。
- 在整个区间 $[a,b]$ 上,$S(x)$ 具有二阶连续导数,即 $S(x) \in C^2[a,b]$。
则称 $S(x)$ 为 $f(x)$ 的三次样条插值函数。三次样条插值函数 $S(x)$ 在每个小区间上是一个三次多项式,因此共有 $4n$ 个待定系数。而插值条件给出了 $n+1$ 个方程,内部节点处的一阶、二阶导数连续各给出 $n-1$ 个方程,总计 $4n-2$ 个方程,还差 $2$ 个条件。因此需要在区间端点处补充两个边界条件方可唯一确定 $S(x)$。下面介绍两种常用的求解三次样条插值函数的方法:一种以节点处的二阶导数值为参,另一种以节点处的一阶导数值为参数。
3、以节点处的二阶导数值为参数的三次样条插值函数
设 $S''(x_i) = M_i \ (i=0,1,\cdots,n)$。由于 $S(x)$ 在每个小区间 $[x_j, x_{j+1}]$ 上是三次多项式,故其二阶导数 $S''(x)$ 在该区间上是一次多项式(线性函数)。记 $h_j = x_{j+1} - x_j$,由线性插值公式可得:
$$ S_j''(x) = M_j \frac{x_{j+1} - x}{h_j} + M_{j+1} \frac{x - x_j}{h_j} = M_{j+1} \frac{x - x_j}{h_j} - M_j \frac{x - x_{j+1}}{h_j} $$
将上式对 $x$ 积分两次,得:
$$ S_j(x) = \frac{M_j}{6h_j}(x_{j+1} - x)^3 + \frac{M_{j+1}}{6h_j}(x - x_j)^3 + C_1 x + C_2 $$
利用插值条件 $S_j(x_j) = y_j$,$S_j(x_{j+1}) = y_{j+1}$ 确定积分常数 $C_1, C_2$,整理后得到:
$$ \begin{aligned} S_j(x) =&\, M_j \frac{(x_{j+1} - x)^3}{6h_j} + M_{j+1} \frac{(x - x_j)^3}{6h_j} \\ &+ \left( y_j - \frac{M_j h_j^2}{6} \right) \frac{x_{j+1} - x}{h_j} + \left( y_{j+1} - \frac{M_{j+1} h_j^2}{6} \right) \frac{x - x_j}{h_j} \end{aligned} $$
或者等价地写作:
$$ \begin{aligned} S_j(x) =&\, M_{j+1} \frac{(x - x_j)^3}{6h_j} - M_j \frac{(x - x_{j+1})^3}{6h_j} \\ &+ \left( y_{j+1} - \frac{M_{j+1}h_j^2}{6} \right) \frac{x - x_j}{h_j} - \left( y_j - \frac{M_j h_j^2}{6} \right) \frac{x - x_{j+1}}{h_j} \end{aligned} \quad (j=0,1,\cdots,n-1) $$
对 $S_j(x)$ 求导,得到:
$$ \begin{aligned} S_j'(x) =&\, -M_j \frac{(x_{j+1} - x)^2}{2h_j} + M_{j+1} \frac{(x - x_j)^2}{2h_j} \\ &+ \frac{y_{j+1} - y_j}{h_j} - \frac{h_j}{6}(M_{j+1} - M_j) \end{aligned} $$
或等价地:
$$ S_j'(x) = \frac{M_{j+1}}{2h_j}(x - x_j)^2 - \frac{M_j}{2h_j}(x - x_{j+1})^2 + \frac{y_{j+1} - y_j}{h_j} - \frac{h_j}{6}(M_{j+1} - M_j) $$
由于 $S(x)$ 在内部节点 $x_j\ (j=1,2,\cdots,n-1)$ 处一阶导数连续,故有:
$$ S'(x_j + 0) = S_j'(x_j + 0) = S'(x_j - 0) = S_{j-1}'(x_j - 0) $$
分别计算右导数和左导数。由式(5-64),在 $x=x_j$ 处取右极限(此时 $x-x_j \to 0^+$,$x_{j+1}-x \to h_j$):
$$ S_j'(x_j + 0) = -\frac{M_j h_j}{2} + \frac{y_{j+1} - y_j}{h_j} - \frac{h_j}{6}(M_{j+1} - M_j) = -\frac{h_j}{2}M_j + \frac{y_{j+1} - y_j}{h_j} - \frac{h_j}{6}(M_{j+1} - M_j) $$
在 $x=x_j$ 处取左极限(由 $S_{j-1}(x)$ 计算,此时 $x-x_{j-1} \to h_{j-1}$,$x_j - x \to 0^+$):
$$ S_{j-1}'(x_j - 0) = \frac{M_j h_{j-1}}{2} + \frac{y_j - y_{j-1}}{h_{j-1}} - \frac{h_{j-1}}{6}(M_j - M_{j-1}) $$
由连续性 $S_j'(x_j + 0) = S_{j-1}'(x_j - 0)$,得:
$$ -\frac{h_j}{2}M_j + \frac{y_{j+1} - y_j}{h_j} - \frac{h_j}{6}(M_{j+1} - M_j) = \frac{h_{j-1}}{2}M_j + \frac{y_j - y_{j-1}}{h_{j-1}} - \frac{h_{j-1}}{6}(M_j - M_{j-1}) $$
移项整理,将所有含 $M$ 的项移到左端,得:
$$ \frac{h_{j-1}}{6}M_{j-1} + \frac{h_{j-1}+h_j}{3}M_j + \frac{h_j}{6}M_{j+1} = \frac{y_{j+1} - y_j}{h_j} - \frac{y_j - y_{j-1}}{h_{j-1}} \quad (j=1,2,\cdots,n-1) $$
令:
$$ \alpha_j = \frac{h_{j-1}}{h_{j-1} + h_j}, \qquad \beta_j = 1 - \alpha_j = \frac{h_j}{h_{j-1} + h_j} $$
$$ c_j = \frac{6}{h_{j-1} + h_j} \left( \frac{y_{j+1} - y_j}{h_j} - \frac{y_j - y_{j-1}}{h_{j-1}} \right) \quad (j=1,2,\cdots,n-1) $$
两边同乘以 $\frac{6}{h_{j-1}+h_j}$,即可化为:
$$ \alpha_j M_{j-1} + 2M_j + \beta_j M_{j+1} = c_j \quad (j=1,2,\cdots,n-1) $$
上式称为三次样条插值的 $M$ 关系式,或按其力学意义称为三弯矩方程(因为 $M_i$ 在力学上代表弯矩)。该方程组含有 $n+1$ 个未知参数 $M_0, M_1, \cdots, M_n$,但只有 $n-1$ 个方程,尚需补充两个边界条件。
(1) 第一类边界条件(给定端点处的一阶导数值)
若已知 $S'(a) = y_0'$,$S'(b) = y_n'$,可得在左端点 $x=x_0$ 处:
$$ y_0' = S'(x_0) = -\frac{h_0}{2}M_0 + \frac{y_1 - y_0}{h_0} - \frac{h_0}{6}(M_1 - M_0) = \frac{h_0}{3}M_0 + \frac{h_0}{6}M_1 + \frac{y_1 - y_0}{h_0} $$
移项得:
$$ 2M_0 + M_1 = \frac{6}{h_0} \left( \frac{y_1 - y_0}{h_0} - y_0' \right) $$
在右端点 $x=x_n$ 处:
$$ y_n' = S'(x_n) = \frac{h_{n-1}}{2}M_n + \frac{y_n - y_{n-1}}{h_{n-1}} - \frac{h_{n-1}}{6}(M_n - M_{n-1}) = \frac{h_{n-1}}{6}M_{n-1} + \frac{h_{n-1}}{3}M_n + \frac{y_n - y_{n-1}}{h_{n-1}} $$
移项得:
$$ M_{n-1} + 2M_n = \frac{6}{h_{n-1}} \left( y_n' - \frac{y_n - y_{n-1}}{h_{n-1}} \right) $$
联立,得到关于 $M_0, M_1, \cdots, M_n$ 的 $n+1$ 阶线性方程组,其矩阵形式为:
$$ \begin{bmatrix} 2 & 1 & & & & \\ \alpha_1 & 2 & \beta_1 & & & \\ & \alpha_2 & 2 & \beta_2 & & \\ & & \ddots & \ddots & \ddots & \\ & & & \alpha_{n-1} & 2 & \beta_{n-1} \\ & & & & 1 & 2 \end{bmatrix} \begin{bmatrix} M_0 \\ M_1 \\ M_2 \\ \vdots \\ M_{n-1} \\ M_n \end{bmatrix} = \begin{bmatrix} c_0 \\ c_1 \\ c_2 \\ \vdots \\ c_{n-1} \\ c_n \end{bmatrix} $$
其中:
$$ c_0 = \frac{6}{h_0} \left( \frac{y_1 - y_0}{h_0} - y_0' \right), \qquad c_n = \frac{6}{h_{n-1}} \left( y_n' - \frac{y_n - y_{n-1}}{h_{n-1}} \right) $$
该方程组的系数矩阵为严格对角占优的三对角矩阵,因此存在唯一解,可用追赶法高效求解。
(2) 第二类边界条件(给定端点处的二阶导数值)
若已知 $S''(a) = y_0''$,$S''(b) = y_n''$,由于 $S''(x_i) = M_i$,直接得到:
$$ M_0 = y_0'', \qquad M_n = y_n'' $$
此时 $M_0$ 和 $M_n$ 已知,方程组中实际上只有 $n-1$ 个未知数 $M_1, M_2, \cdots, M_{n-1}$,其矩阵形式为:
$$ \begin{bmatrix} 2 & \beta_1 & & & \\ \alpha_2 & 2 & \beta_2 & & \\ & \ddots & \ddots & \ddots & \\ & & \alpha_{n-2} & 2 & \beta_{n-2} \\ & & & \alpha_{n-1} & 2 \end{bmatrix} \begin{bmatrix} M_1 \\ M_2 \\ \vdots \\ M_{n-2} \\ M_{n-1} \end{bmatrix} = \begin{bmatrix} c_1 - \alpha_1 y_0'' \\ c_2 \\ \vdots \\ c_{n-2} \\ c_{n-1} - \beta_{n-1} y_n'' \end{bmatrix} $$
特别地,当 $y_0'' = y_n'' = 0$ 时,称为自然边界条件,此时样条曲线在端点处呈自由状态(即端点的弯矩为零),对应的样条称为自然样条。
(3) 第三类边界条件(周期边界条件)
若 $f(x)$ 是以 $b-a$ 为周期的周期函数,则要求 $S(x)$ 也具有相同周期,即在端点处满足:
$$ S'(a+0) = S'(b-0), \qquad S''(a+0) = S''(b-0) $$
由 $S''(a+0) = S''(b-0)$ 可得 $M_0 = M_n$。结合 $M$ 关系式与周期边界条件,可得到 $n$ 阶方程组:
$$ \begin{bmatrix} 2 & \beta_1 & & & \alpha_1 \\ \alpha_2 & 2 & \beta_2 & & \\ & \ddots & \ddots & \ddots & \\ & & \alpha_{n-2} & 2 & \beta_{n-2} \\ \beta_n & & & \alpha_{n-1} & 2 \end{bmatrix} \begin{bmatrix} M_1 \\ M_2 \\ \vdots \\ M_{n-1} \\ M_n \end{bmatrix} = \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_{n-1} \\ c_n \end{bmatrix} $$
其中:
$$ \alpha_n = \frac{h_{n-1}}{h_0 + h_{n-1}}, \qquad \beta_n = \frac{h_0}{h_0 + h_{n-1}}, \qquad c_n = \frac{6}{h_0 + h_{n-1}} \left( \frac{y_1 - y_0}{h_0} - \frac{y_n - y_{n-1}}{h_{n-1}} \right) $$
上述三种情形下,方程组的系数矩阵均为严格对角占优矩阵,因此方程组有唯一解。将求得的 $M_i$ 代入,即得到三次样条插值函数 $S(x)$。
4、以节点处的导数值为参数的三次样条插值函数
除了以二阶导数 $M_i$ 为参数外,也可以节点处的一阶导数值为参数来构造三次样条插值函数。
设 $S'(x_i) = m_i \ (i=0,1,\cdots,n)$。在每个小区间 $[x_j, x_{j+1}]$ 上,由分段三次 Hermite 插值公式,$S(x)$ 可表示为:
$$ \begin{aligned} S_j(x) =&\, \left( 1 + 2\frac{x - x_j}{h_j} \right) \left( \frac{x_{j+1} - x}{h_j} \right)^2 y_j + \left( 1 - 2\frac{x - x_{j+1}}{h_j} \right) \left( \frac{x - x_j}{h_j} \right)^2 y_{j+1} \\ &+ (x - x_j) \left( \frac{x_{j+1} - x}{h_j} \right)^2 m_j + (x - x_{j+1}) \left( \frac{x - x_j}{h_j} \right)^2 m_{j+1} \end{aligned} $$
其中 $x \in [x_j, x_{j+1}]$,$h_j = x_{j+1} - x_j$。
由 $S(x)$ 在内部节点 $x_j$ 处二阶导数连续,即:
$$ S_j''(x_j + 0) = S_{j-1}''(x_j - 0) \qquad (j=1,2,\cdots,n-1) $$
对式(5-71)求二阶导数并代入连续性条件,可导出关于参数 $m_j$ 的方程组:
$$ \beta_j m_{j-1} + 2m_j + \alpha_j m_{j+1} = d_j \qquad (j=1,2,\cdots,n-1) $$
其中:
$$ \alpha_j = \frac{h_{j-1}}{h_{j-1} + h_j}, \qquad \beta_j = 1 - \alpha_j = \frac{h_j}{h_{j-1} + h_j} $$
$$ d_j = 3 \left[ \frac{\beta_j}{h_{j-1}}(y_j - y_{j-1}) + \frac{\alpha_j}{h_j}(y_{j+1} - y_j) \right] $$
上称为三次样条插值的 $m$ 关系式,或按其几何意义称为三转角方程(因为 $m_i$ 代表曲线在节点处的斜率/转角)。
方程组含有 $n+1$ 个未知数 $m_0, m_1, \cdots, m_n$,仅有 $n-1$ 个方程,同样需要补充两个边界条件:
- 第一类边界条件:直接给定 $m_0 = y_0'$,$m_n = y_n'$,此时未知数减少为 $n-1$ 个,得到三对角方程组。
- 第二类边界条件:给定 $S''(a)=y_0''$,$S''(b)=y_n''$,可由式(5-71)的二阶导数在端点处的表达式导出关于 $m_0, m_1$ 和 $m_{n-1}, m_n$ 的方程,与式(5-72)联立得到三对角方程组。
- 第三类边界条件(周期边界条件):$m_0 = m_n$,可得到 $n$ 阶方程组。
这些方程组的系数矩阵均非奇异,故方程组有唯一解。解出参数 $m_j\ (j=0,1,\cdots,n)$ 后代入式(5-71),即得三次样条插值函数 $S(x)$。
$M$ 关系式(三弯矩方程)和 $m$ 关系式(三转角方程)是求解三次样条插值函数的两种等价方法。前者以二阶导数为参数,边界条件表达直观;后者以一阶导数为参数,在已知导数信息的场景下更为直接。实际应用中,$M$ 关系式更为常见,因其三对角矩阵具有良好的数值稳定性,可用追赶法高效求解。三次样条插值在保证函数值精确通过所有节点的同时,实现了 $C^2$ 阶光滑性,有效克服了高次多项式插值的龙格现象,是工程实践中应用最广泛的插值方法之一。