插值算法

插值算法

摘要

插值算法用于在实际数据量较少而模型需要的数据量很多时,通过在实际数据中“插值”来增加数据量。假设若干个数据隐含地满足了某个函数,我们通过插值算法获得这个函数在插值位置的近似解来插入值,如果数据满足一维函数,称为一维插值问题。插值算法主要有拉格朗日插值、牛顿插值和埃尔米特插值,数学建模竞赛常用埃尔米特插值和三次样条插值,这两个插值函数都是MatLab的内置函数。

一维插值问题

我们现在有 \(n\) 个数据点 \((x_i,y_i)\),其中的 \(x\) 两两不同,需要在 \(x = x_{m}\) 处插入数据点 \((x_m,y_m)\),称为一维插值问题。

我们需要得到一个一维函数 \(y = f{(x)}\),该函数经过这 \(n\) 个数据点,\(y_i = f (x_i)\)。于是 \(x = x_{m}\) 处插入数据点为 \((x_m,f(x_m))\)

下面我们仅讨论一维插值问题。

数据点的插值算法

多项式函数存在定理

对于 \(n+1\)\(x\) 互不相同的数据点 \((x_i,y_i)\),一定存在唯一的 \(n\) 阶多项式函数 \(f(x)\)

\[f(x) = \\ a_0 + a_1 x + a_2x^2...+a_nx^n \]

经过这 \(n+1\) 个数据点。

证明:

我们将这 \(n+1\) 个数据点代入多项式函数,得到方程组:

\[\begin{cases} a_0 + a_1 {x_0} + a_2{x_0}^2...+a_n{x_0}^n && = y_0 \\ a_0 + a_1 {x_1} + a_2{x_1}^2...+a_n{x_1}^n && = y_1 \\ ...\\ a_0 + a_1 {x_n} + a_2{x_n}^2...+a_n{x_n}^n && = y_0 \\ \end{cases} \]

表达为矩阵形式:

\[\begin{bmatrix} 1 & x_0 & \cdots & {x_0}^n\\ 1 & x_1 & \cdots & {x_1}^n\\ \vdots & \vdots && \vdots \\ 1 & x_n & \cdots & {x_n}^n \\ \end{bmatrix} \begin{bmatrix} a_0 \\ a_1 \\ \vdots \\ a_n \end{bmatrix} = \begin{bmatrix} y_0 \\ y_1 \\ \vdots \\ y_n \\ \end{bmatrix} \]

记为 \(XA = Y\) ,解 \(A\) 存在且唯一当且仅当 \(X\) 可逆

注意到 \(X\) 为范德蒙矩阵,

\[\mid X \mid = \prod_{i = 1}^n \prod_{j = 0}^{i-1}{(x_i - x_j)} \]

由于 \(x\) 互不相同,不存在 \((i,j)\) \((i \neq j)\)使得 \(x_i = x_j\) ,故 \(\mid X \mid \neq 0\) ,故 \(X\) 可逆,故 \(A\) 唯一存在,即多项式函数唯一

注意:如果不指定为 \(n\) 阶多项式,则多项式函数不唯一

拉格朗日插值法

假设有 \(n+1\)\(x\) 互不相同的数据点 \((x_i,y_i)\) ,我们可以由拉格朗日插值函数构造上述的多项式函数。

拉格朗日插值函数为:

\[f(x) = \sum_{i=0}^{n} \frac{\prod_{j = 0}^{n 且 j \neq i}{(x - x_j)}}{\prod_{j = 0}^{n 且 j \neq i}{(x_i - x_j)}} y_i \]

龙格现象 (Runge)

假设原始数据按照 \(y = f(x),x \in[a,b]\) 给出,我们取 \(k\) 个数据点进行拉格朗日插值,得到插值函数 \(l_k(x)\)\(k\) 越大,插值函数 \(l_k(x)\)\(x = a,x = b\)附近与 \(y = f(x)\) 的误差就越大,这叫做龙格现象。

龙格现象提示我们不要轻易使用多次插值,插值次数高,精度不一定越高。

分段插值法

由于对数据进行多次插值会导致龙格现象,我们可以在每次插值时使用尽可能少的数据点进行插值。

分段线性插值

\(x = x_m\) 中 进行插值,我们首先找到数据点中与 \(x_m\) 最接近的两个数据点 \((x_a,y_a)\)\((x_b,y_b)\) ,然后构造一次线性函数 \(y = ax+b\) 来对 \(x_m\) 进行插值

分段 \(n\) 次插值

\(x = x_m\) 中 进行插值,我们首先找到数据点中与 \(x_m\) 最接近的 \(n+1\) 个数据点 \((x_i,y_i)\) ,然后利用拉格朗日插值法构造 \(n\) 次多项式函数 来对 \(x_m\) 进行插值。不难发现,分段线性插值法是分段 \(n\) 次插值法的一种情形,一次线性函数仍可以由拉格朗日插值函数获得。

牛顿插值法

差商

\(f |x_0,x_k|\) 为函数 \(f(x)\) 关于点 \(x_0,x_k\) 的一阶差商:

\[f[x_0,x_k] = \frac{f(x_0)-f(x_k)}{x_0 - x_k} \]

那么,\(k\) 阶差商为:

\[f[x_0,x_1,...,x_k] = \frac{f[x_1,x_2,...,x_k]-f[x_0,x_1,...,x_{k-1}]}{x_k - x_0} \]

牛顿插值函数

如果在\(n\)\(x\)互异的数据点中插入 \(x= x_m\),那么,牛顿插值函数为:

\[f(x) = f(x_0)+\sum_{i=1}^n ({{f[x_0,...,x_n]}\prod_{j=1}^{i} (x-x_{j-1})}) \]

牛顿插值仍然具有龙格现象

满足导数的插值算法

如果我们不仅要求插值函数满足数据点,我们还要要求插值函数在数据点处是可导的。上述插值算法均不能满足要求。

在数学建模竞赛中也常使用满足导数的插值算法

埃尔米特插值原理

假设我们有 \(n+1\)\(x\) 互不相同的数据点 \((x_i, y_i)\)\(\min {x} = a,\max x = b\),定义在 \([a,b]\) 上的函数 \(f(x)\) 满足:

\[f(x_i) = y_i,f^{'}(x_i) = y_i^{'} \]

那么可以得到一个次数不超过 \(2n+1\) 的多项式函数 \(H(x)\) 满足:

\[H(x_i) = y_i, H^{'}(x_i) = m_i \]

余项 \(R(x) = f(x) - H(x) = \frac{f^{(2n+2)}(\xi)}{(2n+2)!}\omega_{2n+2}(x)\)

MatLab插值函数

MatLab中有内置的插值函数可以直接调用

  • 三次埃尔米特插值 pchip(x,y,new_x)
  • 三次样条插值 spline(x,y,new_x)

MatLab多维插值(了解)

对于多维数据点 \((x_1,x_2,...,x_n,y_i)\) ,MatLab中也有对应的插值函数

interpn(x1,x2,...,xn, y, new_x1,new_x2,...,new_xn, method)
%method 插值方法
% linear (默认)线性插值法
% cubic   三次插值法
% spline  三次样条插值法(精确度最高)
% nearest 最邻近插值法
posted @ 2022-02-25 13:00  Sarfish  阅读(530)  评论(0)    收藏  举报