三种插值方法及实现
插值方法
插值属于数值分析领域中的一种方法,是一种通过已知的离散的数据点,来拟合原函数根据给定的自变量估算因变量的方法。
常用的插值方法有很多,本文章给出三种常见的插值方法的实现。
使用语言: Python
使用下面的数据,预测函数在x=1处的值
|
|
线性插值
线性插值及求一次多项式$p(x)$,满足$p(x_0), p(x_1) = y_1$ 可以根据点斜式方程求解 即
$p(x) =y_0 \frac{y_{1}-y_{0}}{x_1-x_0}(x-x_0)$ 还可以将公式整理成如下形式
$p(x) = y_0 \frac{x - x_1}{x_0 - x_1} + y_1 \frac{x- x_0}{x_1 - x_0}$
我们令这里的$l_0(x)=\frac{x-x_1}{x_0 - x_1}, l_1(x)=\frac{x-x_0}{x_1-x_0}$
将其线性组合之后即为
$p(x)=y_0 l_0(x)+y_1 l_1(x)$
是Lagrange插值的特殊形式
此处给出线性插值的代码实现:
|
|
Largrange插值
根据Lagrange插值基函数$l_k(x)$,其满足如下性质 当$i=k,l_k(x_i)=1$
当$i\not ={k}, l_k(x_i) = 0$
其中$l_k(x) = \prod_{i=0,i \not ={k}}^{n} \frac{x-x_i}{x_k-x_i}$
可以得到$p(x)=y_0 l_0(x) + y_1 l_1(x) + … + y_n l_n(x)$
$p(x)$满足$p(x_i)=y_i, i = 0,1,…,n$
即根据插值结点确定的方程,可以使得$p(x_i)=y_i$,是一种可行的插值方法,极大的提高了插值精度。
并且当只有两个插值结点时,Lagrange插值就退化成了线性插值,当有三个结点时,退化成抛物线插值。
|
|
运行结果: 0.0634
Newton插值
我们引入差商的概念, 设有函数$f(x), x_0,…,x_n$
$f[x_i, x_j] = \frac{f(x_j)-f(x_i)}{x_j - x_i}$
称为$f(x)$关于点$x_i, x_j$的一阶差商
$f[x_i, x_j, x_k] = \frac{f[x_j, x_k] - f[x_i, x_j]}{x_k - x_i}$
称为$f(x)$关于点$x_i, x_j, x_k$二阶差商
我们可以得到差商的一般定义,对于k阶差商
$f[x_0, x_1, …, x_k] = \frac{f[x_1, …, x_k] - f[x_0, …, x_{k-1}]}{x_k - x_0}$ 计算差商可以通过差商表来计算
$x_i$ | $f(x_i)$ | 一阶差商 | 二阶差商 | 三阶差商 | … | n阶差商 |
---|---|---|---|---|---|---|
$x_0$ | $f(x_0)$ | |||||
$x_1$ | $f(x_1)$ | $f[x_0, x_1]$ | ||||
$x_2$ | $f(x_2)$ | $f[x_1, x_2]$ | $f[x_0, x_1, x_2]$ | |||
$x_3$ | $f(x_3)$ | $f[x_2, x_3]$ | $f[x_1, x_2, x_3]$ | $f[x_0, x_1, x_2, x_3]$ | ||
… | … | … | … | … | … | |
$x_n$ | $f(x_n)$ | $f[x_{n-1}, x_{n}]$ | $f[x_{n-2}, x_{n-1}, x_{n}]$ | $f[x_{n-3}, x_{n-2}, x_{n-1}, x_{n}]$ | $f[x_0, x_1, …, x_n]$ |
将对角线上的差商值用来构造插值函数
$f(x) = f(x_0) + f[x_0, x_1](x- x_0) + f[x_0, x_1, x_2](x - x_0)(x - x_1) + … + f[x_0, …, x_n](x - x_0)…(x - x_{n-1}) + f[x,x_0,x_1,x_2,…,x_n](x - x_0)…(x - x_{n})$
其中$R(x) = f[x,x_0,x_1,x_2,…,x_n](x - x_0)…(x - x_{n})$为插值余项
综上,牛顿插值的最终表达式为
$R(x) = N(x)+R(x)$
牛顿插值的插值基函数有可继承的特点,可以优化计算方法
直接利用上一次的计算结果增量更新
|
|
运行结果:
差商表
[ 0.5 -0.6931 0. 0. 0. ]
[ 0.6 -0.5108 1.823 0. 0. ]
[ 0.4 -0.9163 2.0275 -2.045 0. ]
[ 0.7 -0.3567 1.86533333 -1.62166667 2.11666667]
运行结果 0.0634