插值算法
插值算法
摘要
插值算法用于在实际数据量较少而模型需要的数据量很多时,通过在实际数据中“插值”来增加数据量。假设若干个数据隐含地满足了某个函数,我们通过插值算法获得这个函数在插值位置的近似解来插入值,如果数据满足一维函数,称为一维插值问题。插值算法主要有拉格朗日插值、牛顿插值和埃尔米特插值,数学建模竞赛常用埃尔米特插值和三次样条插值,这两个插值函数都是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)\) :
经过这 \(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)\) ,我们可以由拉格朗日插值函数构造上述的多项式函数。
拉格朗日插值函数为:
龙格现象 (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\) 的一阶差商:
那么,\(k\) 阶差商为:
牛顿插值函数
如果在\(n\)个 \(x\)互异的数据点中插入 \(x= x_m\),那么,牛顿插值函数为:
牛顿插值仍然具有龙格现象
满足导数的插值算法
如果我们不仅要求插值函数满足数据点,我们还要要求插值函数在数据点处是可导的。上述插值算法均不能满足要求。
在数学建模竞赛中也常使用满足导数的插值算法
埃尔米特插值原理
假设我们有 \(n+1\) 个 \(x\) 互不相同的数据点 \((x_i, y_i)\),\(\min {x} = a,\max x = b\),定义在 \([a,b]\) 上的函数 \(f(x)\) 满足:
那么可以得到一个次数不超过 \(2n+1\) 的多项式函数 \(H(x)\) 满足:
余项 \(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 最邻近插值法
本文来自博客园,作者:Sarfish,转载请注明原文链接:https://www.cnblogs.com/sarfish/articles/15935586.html

浙公网安备 33010602011771号