MINIBLOG

Blog Note Tags Links About
Home Search
May 9, 2026
miniyuan

插值法(Lagrange 插值,Newton 插值)


插值法概述

核心思想

插值(Interpolation)就是在给定有限个点的函数值的情况下,寻找一个解析形式的插值函数 φ(x)\varphi(x)φ(x),近似地代替原函数 f(x)f(x)f(x)。 其中插值函数一般是(分段)多项式函数。

代数插值问题的形式化定义

给定 n+1n+1n+1 个点上的函数表:

xx0x1⋯xnyy0y1⋯yn\begin{array}{c|ccccc} x & x_0 & x_1 & \cdots & x_n \\ \hline y & y_0 & y_1 & \cdots & y_n \end{array}xy​x0​y0​​x1​y1​​⋯⋯​xn​yn​​​

要构造插值多项式 φn(x)\varphi_n(x)φn​(x),满足:

  1. φn(x)\varphi_n(x)φn​(x) 是次数不超过 nnn 的多项式;
  2. φn(xj)=f(xj)=yj\varphi_n(x_j) = f(x_j) = y_jφn​(xj​)=f(xj​)=yj​,j=0,1,⋯ ,nj = 0, 1, \cdots, nj=0,1,⋯,n。

插值多项式的存在唯一性

将 φn(x)=a0+a1x+⋯+anxn\varphi_n(x) = a_0 + a_1 x + \cdots + a_n x^nφn​(x)=a0​+a1​x+⋯+an​xn 代入插值条件,得线性方程组,其系数行列式为 Vandermonde 行列式:

∣1x0x02⋯x0n1x1x12⋯x1n⋮⋮⋮⋱⋮1xnxn2⋯xnn∣=∏0≤j<i≤n(xi−xj)\begin{vmatrix} 1 & x_0 & x_0^2 & \cdots & x_0^n \\ 1 & x_1 & x_1^2 & \cdots & x_1^n \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \cdots & x_n^n \end{vmatrix} = \prod_{0 \le j < i \le n}(x_i - x_j)​11⋮1​x0​x1​⋮xn​​x02​x12​⋮xn2​​⋯⋯⋱⋯​x0n​x1n​⋮xnn​​​=0≤j<i≤n∏​(xi​−xj​)

故当 x0,x1,⋯ ,xnx_0, x_1, \cdots, x_nx0​,x1​,⋯,xn​ 两两不相等时,Vandermonde 行列式不为零,方程组有唯一解,即插值多项式存在且唯一。

Taylor 展开 vs 插值展开

插值余项与 Taylor 余项在结构上高度相似,区别仅在于单点展开还是多点展开:

对比维度Taylor 展开插值展开
展开基点单点 x0x_0x0​多点 x0,x1,…,xnx_0, x_1, \dots, x_nx0​,x1​,…,xn​
余项/误差Rn(x)=f(n+1)(ξ)(n+1)!(x−x0)n+1R_n(x) = \dfrac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_0)^{n+1}Rn​(x)=(n+1)!f(n+1)(ξ)​(x−x0​)n+1Rn(x)=f(n+1)(ξ)(n+1)!∏i=0n(x−xi)R_n(x) = \dfrac{f^{(n+1)}(\xi)}{(n+1)!}\displaystyle\prod_{i=0}^{n}(x-x_i)Rn​(x)=(n+1)!f(n+1)(ξ)​i=0∏n​(x−xi​)
核心区别(x−x0)n+1(x-x_0)^{n+1}(x−x0​)n+1ωn+1(x)=∏i=0n(x−xi)\omega_{n+1}(x) = \displaystyle\prod_{i=0}^{n}(x-x_i)ωn+1​(x)=i=0∏n​(x−xi​)
所需信息需要 fff 在 x0x_0x0​ 处的各阶导数值只需要 fff 在各节点处的函数值
近似性质局部近似:在 x0x_0x0​ 邻域内精度高,远离则发散全局近似:在节点处精确相等,在区间内整体拟合

插值余项

定义

插值多项式 φn(x)\varphi_n(x)φn​(x) 与被插函数 f(x)f(x)f(x) 之间的差:

Rn(x)=f(x)−φn(x)R_n(x) = f(x) - \varphi_n(x)Rn​(x)=f(x)−φn​(x)

称为截断误差,又称插值余项。

两种表示形式

对同一插值问题,余项有两种等价写法,分别对应 Lagrange 与 Newton 视角:

形式表达式所需条件特点
Lagrange 型(导数形式)Rn(x)=f(n+1)(ξ)(n+1)! ωn+1(x)R_n(x)=\dfrac{f^{(n+1)}(\xi)}{(n+1)!}\,\omega_{n+1}(x)Rn​(x)=(n+1)!f(n+1)(ξ)​ωn+1​(x)f∈Cn+1[a,b]f\in C^{n+1}[a,b]f∈Cn+1[a,b]依赖光滑性,便于误差估计
Newton 型(差商形式)Rn(x)=f[x0,…,xn,x] ωn+1(x)R_n(x)=f[x_0,\dots,x_n,x]\,\omega_{n+1}(x)Rn​(x)=f[x0​,…,xn​,x]ωn+1​(x)仅需函数值存在无需可导假设

其中 ωn+1(x)=∏i=0n(x−xi)\omega_{n+1}(x)=\displaystyle\prod_{i=0}^{n}(x-x_i)ωn+1​(x)=i=0∏n​(x−xi​)。

两种余项的等价性

将 差商与导数的关系 定理应用于 Newton 余项中的 n+1n+1n+1 阶差商 f[x0,…,xn,x]f[x_0,\dots,x_n,x]f[x0​,…,xn​,x],得:

f[x0,…,xn,x]=f(n+1)(ξ)(n+1)!f[x_0,\dots,x_n,x]=\frac{f^{(n+1)}(\xi)}{(n+1)!}f[x0​,…,xn​,x]=(n+1)!f(n+1)(ξ)​

代回 Newton 余项,即恢复 Lagrange 型余项:

Rn(x)=f(n+1)(ξ)(n+1)!⋅ωn+1(x)R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\cdot\omega_{n+1}(x)Rn​(x)=(n+1)!f(n+1)(ξ)​⋅ωn+1​(x)

Lagrange 插值

一般形式

对 n+1n+1n+1 个点,第 iii 个 Lagrange 插值基函数为:

li(x)=∏j=0j≠inx−xjxi−xjl_i(x) = \prod_{\substack{j=0 \\ j \ne i}}^{n} \frac{x - x_j}{x_i - x_j}li​(x)=j=0j=i​∏n​xi​−xj​x−xj​​

插值基函数次数恰好为 nnn,且满足:

li(xj)=δij={1,i=j0,i≠jl_i(x_j) = \delta_{ij} = \begin{cases} 1, & i = j \\ 0, & i \ne j \end{cases}li​(xj​)=δij​={1,0,​i=ji=j​

nnn 次 Lagrange 插值公式:

φn(x)=∑i=0nyi li(x)\varphi_n(x) = \sum_{i=0}^{n} y_i\, l_i(x)φn​(x)=i=0∑n​yi​li​(x)

显然 φn(xj)=∑i=0nyi δij=yj\varphi_n(x_j) = \sum_{i=0}^{n} y_i\, \delta_{ij} = y_jφn​(xj​)=∑i=0n​yi​δij​=yj​。

Lagrange 插值余项

设 x0,x1,⋯ ,xnx_0, x_1, \cdots, x_nx0​,x1​,⋯,xn​ 是区间 [a,b][a,b][a,b] 上的互异节点,φn(x)\varphi_n(x)φn​(x) 是过这组节点的 nnn 次 Lagrange 插值多项式。 若 f(x)∈Cn+1[a,b]f(x) \in C^{n+1}[a,b]f(x)∈Cn+1[a,b],则对 [a,b][a,b][a,b] 内任意点 xxx,插值余项为:

Rn(x)=f(n+1)(ξ)(n+1)! ωn+1(x),ξ∈(min⁡{xi,x},max⁡{xi,x})R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!}\,\omega_{n+1}(x), \quad \xi \in \bigl(\min\{x_i,x\},\max\{x_i,x\}\bigr)Rn​(x)=(n+1)!f(n+1)(ξ)​ωn+1​(x),ξ∈(min{xi​,x},max{xi​,x})

其中 ωn+1(x)=∏i=0n(x−xi)\omega_{n+1}(x) = \displaystyle\prod_{i=0}^{n}(x - x_i)ωn+1​(x)=i=0∏n​(x−xi​),且不同的 xxx 对应不同的 ξ\xiξ。

证明:

选取一个非节点的求值点 xxx,构造辅助函数:

ψ(t)=f(t)−φn(t)−K ωn+1(t)\psi(t) = f(t) - \varphi_n(t) - K\,\omega_{n+1}(t)ψ(t)=f(t)−φn​(t)−Kωn+1​(t)

其中常数 KKK 选取为

K=Rn(x)ωn+1(x)=f(x)−φn(x)ωn+1(x)K=\frac{R_n(x)}{\omega_{n+1}(x)}=\frac{f(x)-\varphi_n(x)}{\omega_{n+1}(x)}K=ωn+1​(x)Rn​(x)​=ωn+1​(x)f(x)−φn​(x)​

使得 ψ(x)=0\psi(x)=0ψ(x)=0。

步骤 1:由插值条件 φn(xi)=f(xi)\varphi_n(x_i)=f(x_i)φn​(xi​)=f(xi​) 及 ωn+1(xi)=0\omega_{n+1}(x_i)=0ωn+1​(xi​)=0,知

ψ(xi)=0,i=0,1,…,n\psi(x_i)=0,\qquad i=0,1,\dots,nψ(xi​)=0,i=0,1,…,n

又 ψ(x)=0\psi(x)=0ψ(x)=0,故 ψ(t)\psi(t)ψ(t) 在 [min⁡{x0,…,xn,x},max⁡{x0,…,xn,x}]\bigl[\min\{x_0,\dots,x_n,x\},\max\{x_0,\dots,x_n,x\}\bigr][min{x0​,…,xn​,x},max{x0​,…,xn​,x}] 上至少有 n+2n+2n+2 个互异零点。

步骤 2:反复应用 Rolle 中值定理:

  • ψ(t)\psi(t)ψ(t) 有 n+2n+2n+2 个零点 ⇒\Rightarrow⇒ ψ′(t)\psi'(t)ψ′(t) 至少有 n+1n+1n+1 个零点
  • ⋯\cdots⋯
  • ψ(n+1)(t)\psi^{(n+1)}(t)ψ(n+1)(t) 在区间内至少有 111 个零点,记为 ξ\xiξ,即 ψ(n+1)(ξ)=0\psi^{(n+1)}(\xi)=0ψ(n+1)(ξ)=0。

步骤 3:计算 (n+1)(n+1)(n+1) 阶导数:

  • φn(n+1)(t)≡0\varphi_n^{(n+1)}(t)\equiv 0φn(n+1)​(t)≡0
  • ωn+1(n+1)(t)≡(n+1)!\omega_{n+1}^{(n+1)}(t)\equiv (n+1)!ωn+1(n+1)​(t)≡(n+1)!

代入 ψ(n+1)(ξ)=0\psi^{(n+1)}(\xi)=0ψ(n+1)(ξ)=0:

0=f(n+1)(ξ)−K⋅(n+1)!⟹K=f(n+1)(ξ)(n+1)!0 = f^{(n+1)}(\xi) - K\cdot(n+1)! \quad\Longrightarrow\quad K=\frac{f^{(n+1)}(\xi)}{(n+1)!}0=f(n+1)(ξ)−K⋅(n+1)!⟹K=(n+1)!f(n+1)(ξ)​

因此

Rn(x)=K⋅ωn+1(x)=f(n+1)(ξ)(n+1)! ωn+1(x)R_n(x)=K\cdot\omega_{n+1}(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\,\omega_{n+1}(x)Rn​(x)=K⋅ωn+1​(x)=(n+1)!f(n+1)(ξ)​ωn+1​(x)

注:对比 Taylor 余项 Rn(x)=f(n+1)(ξ)(n+1)!(x−x0)n+1R_n(x)=\dfrac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_0)^{n+1}Rn​(x)=(n+1)!f(n+1)(ξ)​(x−x0​)n+1,Lagrange 余项只是把单点展开的 (x−x0)n+1(x-x_0)^{n+1}(x−x0​)n+1 替换为多点展开的 ωn+1(x)\omega_{n+1}(x)ωn+1​(x)。

Lagrange 插值算法实现

Lagrange 插值单插值点

def lagrange_single(x, y, xt):
    n = len(x) - 1
    phi = 0.0
    for i in range(n + 1):
        # 计算第 i 个基函数值
        li = 1.0  
        for j in range(n + 1):
            if j != i:
                li *= (xt - x[j]) / (x[i] - x[j])
        # 累加插值结果
        phi += y[i] * li
    return phi

复杂度为 O(n2)\mathcal{O}(n^2)O(n2)。

Lagrange 插值多插值点

利用 ωn+1′(xi)=∏j≠i(xi−xj)\omega_{n+1}'(x_i) = \displaystyle\prod_{j \ne i}(x_i - x_j)ωn+1′​(xi​)=j=i∏​(xi​−xj​),将基函数改写为:

li(x)=ωn+1(x)/(x−xi)ωn+1′(xi)φn(x)=ωn+1(x)∑i=0nyi(x−xi) ωn+1′(xi)\begin{aligned} l_i(x) &= \frac{\omega_{n+1}(x)/(x - x_i)}{\omega_{n+1}'(x_i)} \\ \varphi_n(x) &= \omega_{n+1}(x) \sum_{i=0}^{n} \frac{y_i}{(x-x_i)\,\omega_{n+1}'(x_i)} \end{aligned}li​(x)φn​(x)​=ωn+1′​(xi​)ωn+1​(x)/(x−xi​)​=ωn+1​(x)i=0∑n​(x−xi​)ωn+1′​(xi​)yi​​​
def lagrange_multi(x, y, xt_list):
    n = len(x) - 1
    # 预计算权重 1/omega'(x_i),复杂度 O(n^2)
    wt = [1.0] * (n + 1)
    for i in range(n + 1):
        for j in range(n + 1):
            if j != i:
                wt[i] *= (x[i] - x[j])  # 先求积
    for i in range(n + 1):
        wt[i] = 1.0 / wt[i]

    results = []
    for xt in xt_list:
        # 若 xt 恰好等于某个 x_i,直接返回 y_i 避免出现 0/0
        flag = False
        for i in range(n + 1):
            if abs(xt - x[i]) < EPS:
                results.append(y[i])
                flag = True
                break
        if flag:
            continue
        # 计算 omega_{n+1}(xt),复杂度 O(n)
        omega = 1.0
        for i in range(n + 1):
            omega *= (xt - x[i])
        # 累加,复杂度 O(n)
        phi = 0.0
        for i in range(n + 1):
            phi += y[i] * omega / (xt - x[i]) * wt[i]
        results.append(phi)
    return results

复杂度为 O(n2+mn)\mathcal{O}(n^2 + mn)O(n2+mn),其中 mmm 为插值点数。

Lagrange 插值向量化版

import numpy as np

def lagrange_vectorized(x, y, xt_list):
    # 计算权重 wt[i] = 1 / prod_{j!=i}(x_i - x_j)
    diff = x[:, None] - x[None, :]          # (n+1, n+1) 差矩阵
    np.fill_diagonal(diff, 1.0)             # 对角线置 1 避免除零
    wt = 1.0 / np.prod(diff, axis=1)        # 每行连乘

    phi = np.zeros(len(xt))

    # 解决 0/0 问题
    hits = np.abs(xt[:, None] - x[None, :]) < EPS   # (m, n+1)
    hit_mask = np.any(hits, axis=1)                   # (m,)

    if np.any(hit_mask):
        hit_idx = np.argmax(hits, axis=1)               # 命中的节点下标
        phi[hit_mask] = y[hit_idx[hit_mask]]            # 直接返回对应 y 值

    # 计算其余位置
    xt_valid = xt[~hit_mask]
    if len(xt_valid) > 0:
        denom = xt_valid[:, None] - x[None, :]          # (m', n+1)
        omega = np.prod(denom, axis=1)                  # (m',)
        phi[~hit_mask] = omega * np.sum(y * wt / denom, axis=1)

    return phi

复杂度分析

指标单插值点mmm 插值点
时间复杂度O(n2)O(n^2)O(n2)O(n2+mn)O(n^2 + mn)O(n2+mn)
空间复杂度O(1)O(1)O(1)O(n)O(n)O(n)
新增一点时全部基函数重算 O(n2)O(n^2)O(n2)全部权重重算 O(n2)O(n^2)O(n2)

注:Lagrange 插值的主要缺点是:每新增一个插值节点,所有基函数均需重新计算,无法复用之前的结果。Newton 插值解决了这一问题。


Newton 插值

均差(差商)的定义

零阶均差:

f[xi]=f(xi)f[x_i] = f(x_i)f[xi​]=f(xi​)

一阶均差:

f[xi,xj]=f(xj)−f(xi)xj−xif[x_i, x_j] = \frac{f(x_j) - f(x_i)}{x_j - x_i}f[xi​,xj​]=xj​−xi​f(xj​)−f(xi​)​

nnn 阶均差:

f[x0,x1,⋯ ,xn]=f[x1,x2,⋯ ,xn]−f[x0,x1,⋯ ,xn−1]xn−x0=∑k=0nf(xk)∏j=0j≠kn(xk−xj)=∑k=0nf(xk)ωn+1′(xk)\begin{aligned} f[x_0, x_1, \cdots, x_n] &= \frac{f[x_1, x_2, \cdots, x_n] - f[x_0, x_1, \cdots, x_{n-1}]}{x_n - x_0} \\ &= \sum_{k=0}^n \frac{f(x_k)}{\prod\limits_{\substack{j=0 \\ j \ne k}}^n (x_k - x_j)} \\ &= \sum_{k=0}^n \frac{f(x_k)}{\omega_{n+1}'(x_k)} \\ \end{aligned}f[x0​,x1​,⋯,xn​]​=xn​−x0​f[x1​,x2​,⋯,xn​]−f[x0​,x1​,⋯,xn−1​]​=k=0∑n​j=0j=k​∏n​(xk​−xj​)f(xk​)​=k=0∑n​ωn+1′​(xk​)f(xk​)​​

均差的性质

  1. 线性性:

    若 f(x)=αφ(x)+βψ(x)f(x) = \alpha\varphi(x) + \beta\psi(x)f(x)=αφ(x)+βψ(x),则

    f[x0,⋯ ,xn]=αφ[x0,⋯ ,xn]+βψ[x0,⋯ ,xn]f[x_0,\cdots,x_n] = \alpha\varphi[x_0,\cdots,x_n] + \beta\psi[x_0,\cdots,x_n]f[x0​,⋯,xn​]=αφ[x0​,⋯,xn​]+βψ[x0​,⋯,xn​]
  2. 线性组合,系数和为 0:

    f[x0,x1,⋯ ,xn]=∑i=0nf(xi)ωn+1′(xi)f[x_0, x_1, \cdots, x_n] = \sum_{i=0}^{n} \frac{f(x_i)}{\omega_{n+1}'(x_i)}f[x0​,x1​,⋯,xn​]=i=0∑n​ωn+1′​(xi​)f(xi​)​

    显然 f[x0,x1,⋯ ,xn]f[x_0, x_1, \cdots, x_n]f[x0​,x1​,⋯,xn​] 为 f(x0),⋯f(xn)f(x_0), \cdots f(x_n)f(x0​),⋯f(xn​) 的线性组合,且系数和 ∑i=0n1/ωn+1′(xi)=0\sum_{i=0}^{n} 1/\omega_{n+1}'(x_i) = 0∑i=0n​1/ωn+1′​(xi​)=0。

    证明:

    Lagrange 基函数之和为:

    ∑i=0nli(x)=∑i=0nωn+1(x)ωn+1′(xi)(x−xi)=∑i=0n∏j≠i(x−xj)ωn+1′(xi)\sum_{i=0}^{n}l_i(x) =\sum_{i=0}^{n}\frac{\omega_{n+1}(x)}{\omega_{n+1}'(x_i)(x-x_i)}=\sum_{i=0}^{n}\frac{\prod_{j\ne i}(x-x_j)}{\omega_{n+1}'(x_i)}i=0∑n​li​(x)=i=0∑n​ωn+1′​(xi​)(x−xi​)ωn+1​(x)​=i=0∑n​ωn+1′​(xi​)∏j=i​(x−xj​)​

    这是次数 ≤n\le n≤n 的多项式,且在 n+1n+1n+1 个点 xkx_kxk​ 上取值均为 111,故恒等于 111。比较两边 xnx^nxn 的系数即得。

  3. 对称性:

    f[xi,xj]=f[xj,xi],f[xi,xj,xk]=f[xj,xi,xk]f[x_i, x_j] = f[x_j, x_i], \quad f[x_i, x_j, x_k] = f[x_j, x_i, x_k]f[xi​,xj​]=f[xj​,xi​],f[xi​,xj​,xk​]=f[xj​,xi​,xk​]
  4. 多项式求导关系:

    若 f(x)f(x)f(x) 为 nnn 次多项式,则 f[x0,⋯ ,xk,x]f[x_0, \cdots, x_k, x]f[x0​,⋯,xk​,x] 为 n−k−1n-k-1n−k−1 次多项式。

  5. 差商与导数的关系:

    若 f∈Cn[a,b]f\in C^{n}[a,b]f∈Cn[a,b],且 x0,x1,…,xnx_0,x_1,\dots,x_nx0​,x1​,…,xn​ 互异,则存在 ξ\xiξ 落在这些点的凸包(即最小闭区间)内,使得

    f[x0,x1,…,xn]=f(n)(ξ)n!f[x_0,x_1,\dots,x_n]=\frac{f^{(n)}(\xi)}{n!}f[x0​,x1​,…,xn​]=n!f(n)(ξ)​

    证明:

    设 Pn−1(t)P_{n-1}(t)Pn−1​(t) 是 f(t)f(t)f(t) 在节点 x0,…,xn−1x_0,\dots,x_{n-1}x0​,…,xn−1​ 上的 n−1n-1n−1 次插值多项式。对固定的 xnx_nxn​,构造

    φ(t)=f(t)−Pn−1(t)−K⋅ωn(t),ωn(t)=(t−x0)⋯(t−xn−1)\varphi(t)=f(t)-P_{n-1}(t)-K\cdot\omega_n(t),\qquad \omega_n(t)=(t-x_0)\cdots(t-x_{n-1})φ(t)=f(t)−Pn−1​(t)−K⋅ωn​(t),ωn​(t)=(t−x0​)⋯(t−xn−1​)

    取 K=f(xn)−Pn−1(xn)ωn(xn)K=\dfrac{f(x_n)-P_{n-1}(x_n)}{\omega_n(x_n)}K=ωn​(xn​)f(xn​)−Pn−1​(xn​)​,使 φ(xn)=0\varphi(x_n)=0φ(xn​)=0。

    由插值条件,φ(xi)=0 (i=0,…,n−1)\varphi(x_i)=0\ (i=0,\dots,n-1)φ(xi​)=0 (i=0,…,n−1),故 φ\varphiφ 共有 n+1n+1n+1 个零点。反复应用 Rolle 定理,φ(n)\varphi^{(n)}φ(n) 至少有一个零点 ξ\xiξ。

    计算得 φ(n)(t)=f(n)(t)−K⋅n!\varphi^{(n)}(t)=f^{(n)}(t)-K\cdot n!φ(n)(t)=f(n)(t)−K⋅n!,代入 ξ\xiξ:

    0=f(n)(ξ)−K⋅n!⟹K=f(n)(ξ)n!0=f^{(n)}(\xi)-K\cdot n! \quad\Longrightarrow\quad K=\frac{f^{(n)}(\xi)}{n!}0=f(n)(ξ)−K⋅n!⟹K=n!f(n)(ξ)​

    又因为 K=f(xn)−Pn−1(xn)ωn(xn)=f[x0,…,xn−1,xn]K=\dfrac{f(x_n)-P_{n-1}(x_n)}{\omega_n(x_n)}=f[x_0,\dots,x_{n-1},x_n]K=ωn​(xn​)f(xn​)−Pn−1​(xn​)​=f[x0​,…,xn−1​,xn​],故

    f[x0,…,xn]=f(n)(ξ)n!f[x_0,\dots,x_n]=\frac{f^{(n)}(\xi)}{n!}f[x0​,…,xn​]=n!f(n)(ξ)​

    推论:

    当节点全部重合时,差商退化为导数:

    f[x0,…,x0⏟n+1个]=f(n)(x0)n!f[\underbrace{x_0,\dots,x_0}_{n+1\text{个}}]=\frac{f^{(n)}(x_0)}{n!}f[n+1个x0​,…,x0​​​]=n!f(n)(x0​)​
  6. 差商对活跃节点的求导:

    若 f∈Cn+2[a,b]f\in C^{n+2}[a,b]f∈Cn+2[a,b],x0,…,xnx_0,\dots,x_nx0​,…,xn​ 为固定互异节点,则对活跃节点 xxx 有:

    ddxf[x0,…,xn,x]=f[x0,…,xn,x,x]\frac{\mathrm{d}}{\mathrm{d}x}f[x_0,\dots,x_n,x]=f[x_0,\dots,x_n,x,x]dxd​f[x0​,…,xn​,x]=f[x0​,…,xn​,x,x]

    证明:

    记 g(x)=f[x0,…,xn,x]g(x)=f[x_0,\dots,x_n,x]g(x)=f[x0​,…,xn​,x]。对任意 y≠xy\neq xy=x,由差商递推定义:

    f[x0,…,xn,x,y]=f[x0,…,xn,y]−f[x0,…,xn,x]y−x=g(y)−g(x)y−xf[x_0,\dots,x_n,x,y]=\frac{f[x_0,\dots,x_n,y]-f[x_0,\dots,x_n,x]}{y-x}=\frac{g(y)-g(x)}{y-x}f[x0​,…,xn​,x,y]=y−xf[x0​,…,xn​,y]−f[x0​,…,xn​,x]​=y−xg(y)−g(x)​

    令 y→xy\to xy→x。由于 f∈Cn+2f\in C^{n+2}f∈Cn+2,n+2n+2n+2 阶差商关于节点连续,左边趋于重合节点差商 f[x0,…,xn,x,x]f[x_0,\dots,x_n,x,x]f[x0​,…,xn​,x,x];右边正是 g(x)g(x)g(x) 的导数定义。故:

    ddxf[x0,…,xn,x]=f[x0,…,xn,x,x]\frac{\mathrm{d}}{\mathrm{d}x}f[x_0,\dots,x_n,x]=f[x_0,\dots,x_n,x,x]dxd​f[x0​,…,xn​,x]=f[x0​,…,xn​,x,x]

    注:

    结合性质 5,进一步可得:

    f[x0,…,xn,x,x]=f(n+2)(ξ)(n+2)!f[x_0,\dots,x_n,x,x]=\frac{f^{(n+2)}(\xi)}{(n+2)!}f[x0​,…,xn​,x,x]=(n+2)!f(n+2)(ξ)​

    其中 ξ\xiξ 落在 x0,…,xn,xx_0,\dots,x_n,xx0​,…,xn​,x 所张成的最小闭区间内。

Newton 插值公式

定义Newton 基函数:

N0(x)≡1,Nk(x)=∏j=0k−1(x−xj)  (k≥1)N_0(x)\equiv 1,\qquad N_k(x)=\prod_{j=0}^{k-1}(x-x_j)\;(k\ge 1)N0​(x)≡1,Nk​(x)=j=0∏k−1​(x−xj​)(k≥1)

显然任意小于等于 nnn 次的多项式 φn(x)\varphi_n(x)φn​(x) 都可以展为 N0,⋯NnN_0, \cdots N_nN0​,⋯Nn​ 的线性组合:

φn(x)=∑k=0nakNk(x)\varphi_n(x)=\displaystyle\sum_{k=0}^{n}a_k N_k(x)φn​(x)=k=0∑n​ak​Nk​(x)

则在插值条件 φn(xi)=f(xi)  (i=0,1,…,n)\varphi_n(x_i)=f(x_i)\;(i=0,1,\dots,n)φn​(xi​)=f(xi​)(i=0,1,…,n) 下,我们有:

ak=f[x0,⋯ ,xk],k=0,1,…,na_k = f[x_0, \cdots, x_k], \quad k=0,1,\dots,nak​=f[x0​,⋯,xk​],k=0,1,…,n

递推关系:

φn(x)=φn−1(x)+Nn(x)⋅f[x0,x1,⋯ ,xn]\varphi_n(x) = \varphi_{n-1}(x) + N_n(x) \cdot f[x_0,x_1,\cdots,x_n]φn​(x)=φn−1​(x)+Nn​(x)⋅f[x0​,x1​,⋯,xn​]

证明思路:

设命题对 k≤n−1k \le n-1k≤n−1 个节点成立,验证 n+1n+1n+1 个节点时 φn(xn)=f(xn)\varphi_n(x_n) = f(x_n)φn​(xn​)=f(xn​):

φn(xn)=φn−1(xn)+∏j=0n−1(xn−xj)⋅f[x0,⋯ ,xn−2,xn]−f[x0,⋯ ,xn−2,xn−1]xn−xn−1=φn−1(xn)+∏j=0n−2(xn−xj)⋅(f[x0,⋯ ,xn−2,xn]−f[x0,⋯ ,xn−2,xn−1])=φn−1(xn)+[φ~n−1(xn)−φn−2(xn)]−[φn−1(xn)−φn−2(xn)]=φ~n−1(xn)=f(xn)\begin{aligned} \varphi_n(x_n) &= \varphi_{n-1}(x_n) + \prod_{j=0}^{n-1}(x_n-x_j) \cdot\frac{f[x_0,\cdots,x_{n-2},x_n]-f[x_0,\cdots,x_{n-2},x_{n-1}]}{x_n-x_{n-1}} \\ &= \varphi_{n-1}(x_n) + \prod_{j=0}^{n-2}(x_n-x_j) \cdot(f[x_0,\cdots,x_{n-2},x_n]-f[x_0,\cdots,x_{n-2},x_{n-1}]) \\ &= \varphi_{n-1}(x_n) + [\tilde\varphi_{n-1}(x_n) - \varphi_{n-2}(x_n)] - [\varphi_{n-1}(x_n) - \varphi_{n-2}(x_n)] \\ &= \tilde\varphi_{n-1}(x_n) \\ &= f(x_n) \end{aligned}φn​(xn​)​=φn−1​(xn​)+j=0∏n−1​(xn​−xj​)⋅xn​−xn−1​f[x0​,⋯,xn−2​,xn​]−f[x0​,⋯,xn−2​,xn−1​]​=φn−1​(xn​)+j=0∏n−2​(xn​−xj​)⋅(f[x0​,⋯,xn−2​,xn​]−f[x0​,⋯,xn−2​,xn−1​])=φn−1​(xn​)+[φ~​n−1​(xn​)−φn−2​(xn​)]−[φn−1​(xn​)−φn−2​(xn​)]=φ~​n−1​(xn​)=f(xn​)​

其中 φ~n−1(x)\tilde\varphi_{n-1}(x)φ~​n−1​(x) 为根据 x0,⋯ ,xn−2,xnx_0, \cdots, x_{n-2}, x_nx0​,⋯,xn−2​,xn​ 拟合的多项式。

再由插值多项式的唯一性即证。当然直接由待定的系数猛猛求解也是可以的。

注:对比 Taylor 展开

对比项Taylor 展开Newton 插值
基函数(x−x0)k(x-x_0)^k(x−x0​)k∏j=0k−1(x−xj)\prod_{j=0}^{k-1}(x-x_j)∏j=0k−1​(x−xj​)
系数f(k)(x0)k!\frac{f^{(k)}(x_0)}{k!}k!f(k)(x0​)​f[x0,…,xk]f[x_0,\dots,x_k]f[x0​,…,xk​]
信息来源单点 x0x_0x0​ 的各阶导数多点 x0,…,xkx_0,\dots,x_kx0​,…,xk​ 的函数值

当 x1,…,xk→x0x_1,\dots,x_k\to x_0x1​,…,xk​→x0​ 时,差商 →\to→ 导数,Newton 基 →\to→ 幂基。

Newton 插值余项

Newton 插值多项式 Pn(t)P_n(t)Pn​(t) 在节点 x0,…,xnx_0,\dots,x_nx0​,…,xn​ 上插值 f(t)f(t)f(t)。 现在增加一个点 xxx(不是原插值节点),考虑在 n+2n+2n+2 个节点 x0,…,xn,xx_0,\dots,x_n,xx0​,…,xn​,x 上的 n+1n+1n+1 次 Newton 插值多项式 Pn+1(t)P_{n+1}(t)Pn+1​(t)。

根据 Newton 插值的逐次生成性质,增加一个节点只需在末尾追加一项:

Pn+1(t)=Pn(t)+f[x0,…,xn,x]⋅(t−x0)(t−x1)⋯(t−xn)P_{n+1}(t)=P_n(t)+f[x_0,\dots,x_n,x]\cdot(t-x_0)(t-x_1)\cdots(t-x_n)Pn+1​(t)=Pn​(t)+f[x0​,…,xn​,x]⋅(t−x0​)(t−x1​)⋯(t−xn​)

记 ωn+1(t)=(t−x0)⋯(t−xn)\omega_{n+1}(t)=(t-x_0)\cdots(t-x_n)ωn+1​(t)=(t−x0​)⋯(t−xn​),则

Pn+1(t)=Pn(t)+f[x0,…,xn,x]⋅ωn+1(t)P_{n+1}(t)=P_n(t)+f[x_0,\dots,x_n,x]\cdot\omega_{n+1}(t)Pn+1​(t)=Pn​(t)+f[x0​,…,xn​,x]⋅ωn+1​(t)

因为 xxx 是 Pn+1(t)P_{n+1}(t)Pn+1​(t) 的插值节点之一,所以 Pn+1(x)=f(x)P_{n+1}(x)=f(x)Pn+1​(x)=f(x)。代入 t=xt=xt=x:

f(x)=Pn(x)+f[x0,…,xn,x]⋅ωn+1(x)f(x)=P_n(x)+f[x_0,\dots,x_n,x]\cdot\omega_{n+1}(x)f(x)=Pn​(x)+f[x0​,…,xn​,x]⋅ωn+1​(x)

移项即得 Newton 型余项:

Rn(x)=f(x)−Pn(x)=f[x0,x1,…,xn,x]⋅ωn+1(x)R_n(x)=f(x)-P_n(x)=f[x_0,x_1,\dots,x_n,x]\cdot\omega_{n+1}(x)Rn​(x)=f(x)−Pn​(x)=f[x0​,x1​,…,xn​,x]⋅ωn+1​(x)

特点:此推导不需要 fff 可导,仅依赖函数值与差商定义,本质上是恒等式。

均差表的建立

根据函数表逐列填写:

xix_ixi​f[xi]f[x_i]f[xi​]一阶差商二阶差商三阶差商四阶差商
x0x_0x0​f[x0]f[x_0]f[x0​]
f[x0,x1]f[x_0,x_1]f[x0​,x1​]
x1x_1x1​f[x1]f[x_1]f[x1​]f[x0,x1,x2]f[x_0,x_1,x_2]f[x0​,x1​,x2​]
f[x1,x2]f[x_1,x_2]f[x1​,x2​]f[x0,x1,x2,x3]f[x_0,x_1,x_2,x_3]f[x0​,x1​,x2​,x3​]
x2x_2x2​f[x2]f[x_2]f[x2​]f[x1,x2,x3]f[x_1,x_2,x_3]f[x1​,x2​,x3​]f[x0,⋯ ,x4]f[x_0,\cdots,x_4]f[x0​,⋯,x4​]
f[x2,x3]f[x_2,x_3]f[x2​,x3​]f[x1,x2,x3,x4]f[x_1,x_2,x_3,x_4]f[x1​,x2​,x3​,x4​]
x3x_3x3​f[x3]f[x_3]f[x3​]f[x2,x3,x4]f[x_2,x_3,x_4]f[x2​,x3​,x4​]
f[x3,x4]f[x_3,x_4]f[x3​,x4​]
x4x_4x4​f[x4]f[x_4]f[x4​]

Newton 插值算法实现

Newton 插值标准算法

采用原位存储。

def newton_interp(x, y, xt):
    n = len(x) - 1
    f = list(y)  # 原位存储差商

    phi = f[0]  # 初始化 xt 处值
    omega = 1.0  # 初始化 N_0(xt)

    for i in range(1, n + 1):
        omega *= (xt - x[i - 1])  # 求 N_i(xt)
        # 从后往前更新差商,避免覆盖还未用到的值
        for k in range(n, i - 1, -1):
            f[k] = (f[k-1] - f[k]) / (x[k-i] - x[k])  # 求 f[x_{k-i}, \cdots, x_k]
        phi += f[i] * omega  # 累加当前阶贡献
    return phi

复杂度为 O(n2)\mathcal{O}(n^2)O(n2)。

Newton 插值向量化版

import numpy as np

def newton_vectorized(x, y, xt_list):
    x = np.array(x, dtype=float)
    f = np.array(y, dtype=float)
    n = len(x) - 1

    phi = np.full(len(xt_list), f[0])
    omega = np.ones(len(xt_list))

    for i in range(1, n + 1):
        omega *= (xt_list - x[i - 1])
        for k in range(n, i - 1, -1):
            f[k] = (f[k-1] - f[k]) / (x[k-i] - x[k])
        phi += f[i] * omega
    return phi

Lagrange 与 Newton 插值对比

对比维度Lagrange 插值Newton 插值
公式结构基函数线性组合均差递推展开
新增节点全部基函数重算只增加一项,保留已有结果
时间复杂度(单点)O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)
适用场景节点固定,一次性计算节点逐步增加,在线插值
数值稳定性可能因大 nnn 出现数值问题同等条件下相同

Runge 现象

现象描述

对于 nnn 次多项式插值,节点数量越多,插值结果不一定越接近原函数。

以 Runge 函数为例:

f(x)=11+25x2,−1≤x≤1f(x) = \frac{1}{1 + 25x^2}, \quad -1 \le x \le 1f(x)=1+25x21​,−1≤x≤1

在 [−1,1][-1,1][−1,1] 上取等距节点做高次多项式插值,区间端点附近会出现剧烈振荡。

图 1:Runge 现象
图 1:Runge 现象

原因分析

根据插值余项公式:

Rn(x)=f(n+1)(ξ)(n+1)! ωn+1(x)R_n(x) = \dfrac{f^{(n+1)}(\xi)}{(n+1)!}\,\omega_{n+1}(x)Rn​(x)=(n+1)!f(n+1)(ξ)​ωn+1​(x)

等距节点时,∣ωn+1(x)∣|\omega_{n+1}(x)|∣ωn+1​(x)∣ 在区间端点处增长远快于 (n+1)!(n+1)!(n+1)!,且 f(x)f(x)f(x) 的高阶导数在端点附近较大,两者共同导致误差在端点处爆炸性增大。

改进方法

方法思路
Chebyshev 节点使 ∥ωn+1∥∞\|\omega_{n+1}\|_\infty∥ωn+1​∥∞​ 最小,抑制端点振荡
分段插值用低次多项式分段拟合,下一讲介绍
样条插值分段三次多项式,额外要求导数连续

综合复杂度对比

指标Lagrange(单点)Lagrange(mmm 点)Newton(单点)Newton(mmm 点)
时间复杂度O(n2)O(n^2)O(n2)O(n2+mn)O(n^2 + mn)O(n2+mn)O(n2)O(n^2)O(n2)O(n2+mn)O(n^2 + mn)O(n2+mn)
空间复杂度O(1)O(1)O(1)O(n)O(n)O(n)O(n)O(n)O(n)O(n)O(n)O(n)
新增节点代价O(n2)O(n^2)O(n2) 重算O(n2)O(n^2)O(n2) 重算O(n)O(n)O(n) 递推O(n+m)O(n + m)O(n+m) 递推
目录
  • 插值法概述
    • 核心思想
    • 代数插值问题的形式化定义
    • 插值多项式的存在唯一性
    • Taylor 展开 vs 插值展开
  • 插值余项
    • 定义
    • 两种表示形式
    • 两种余项的等价性
  • Lagrange 插值
    • 一般形式
    • Lagrange 插值余项
    • Lagrange 插值算法实现
      • Lagrange 插值单插值点
      • Lagrange 插值多插值点
      • Lagrange 插值向量化版
    • 复杂度分析
  • Newton 插值
    • 均差(差商)的定义
    • 均差的性质
    • Newton 插值公式
    • Newton 插值余项
    • 均差表的建立
    • Newton 插值算法实现
      • Newton 插值标准算法
      • Newton 插值向量化版
    • Lagrange 与 Newton 插值对比
  • Runge 现象
    • 现象描述
    • 原因分析
    • 改进方法
  • 综合复杂度对比
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo