插值

green-pi

给定\(y=f(x)\)的一系列数据点\((x_{i},y_{i})(i=0,1,...,n)\),我们希望通过这些数据点得到函数的解析表达式,插值就是方法之一。 找到一个函数\(P(x)\)使得\(P(x_{i}=y_{i})\)成立,将此函数作为\(f(x)\)的近似函数,这就是基本的插值问题。 其中,\(P(x)\)称为插值函数类,\(P(x_{i}=y_{i})\)为插值条件,要求的函数\(P(x)\)称为插值函数,\(f(x)\)称为被插值函数
插值-wiki

插值方法

Lagrange 拉格朗日插值

假设任意两个不同的\(x_{j}\)都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为\(P(x)=\sum_{i=0}^{n}l_{i}(x)y_{i}\), 其中\(l_{i}=\prod_{\frac{x-x_{j}}{j=0,j\neq i}}^{n}\)为拉格朗日基本多项式(或称插值基函数

from scipy.interpolate  import lagrange
# x y长度要相等
x = [1, 2, 3,4]
y = [4, 15, 40, 85]
ret = lagrange(x,y)
print(ret)

拉格朗日插值-wiki

分段线性插值

分段多项式插值(Piecewise polynomial interpolation)就是求n段多项式\(P(x)\),使其满足插值条件,也成为折线插值或分段线性插值.
\(P_{1}(x)=\frac{x-x_{i}}{x_{i+1}-x{i}}y_{i+1}+\frac{x-x_{i+1}}{x_{i}-x_{i+1}},x\in [x_{i},x{i+1}] i=0,1,...,n-1\)
分段多项式插值是用一个多项式去将一族点逼近,有的时候这唯一的多项式不能很好地将数据聚拢,预测其他点也未必准确,规避此缺点可以考虑将这一族点集合分成若干组,对每一组点集用一个多项式逼近(插值),这样有多少组变有多少个多项式,那么整个逼近局部光滑。分段多项式逼近的每一段(每组点集)都有一个多项式,可以是一次、二次…等n次多项式,如果针对一族点集每段都是一次多项式,那么可称之分段一次多项式插值或逼近,依次类推。

分段二次插值

这里的插值函数\(P_{2}(x)\)为一个二次多项式,在几何上为分段抛物线代替曲线\(y=f(x)\),也称为抛物线插值, 其插值公式为 \(P_{2}(x)=\frac{(x-x_{2i+1})(x-x_{2i+2})}{(x_{2i}-x{2i+1})(x_{2i}-x{2i+2})}y_{2i}+\frac{(x-x_{2i})(x-x_{2i+2})}{(x_{2i+1}-x{2i})(x_{2i+1}-x{2i+2})}y_{2i+1}+\frac{(x-x_{2i})(x-x_{2i+1})}{(x_{2i+2}-x{2i})(x_{2i+2}-x{2i+1})}y_{2i+2}\)
其中
\(x\in [x_{2i},x_{2i+2}], i=0,1,2,...,n-1\)

newtown牛顿插值

  • 1)函数的差分

    设有函数\(f(x)\)以及等距节点\(x_{i}=x_{0}+ih(i=0,1,...,n)\),步长\(h\)为常数,\(f_{i}=f(x_{i})\).称相邻两个节点$x_{i},x{i+1}$的函数增量 \(f_{i+1}-f_{i}(i=0,1,...,n-1)\)为函数\(f(x)\)在点\(x_{i}\)处以\(h\)为步长的一阶向前差分,极为\(\Delta f_{i}\),即 \(\Delta f_{i}=f_{i+1}-f_{i}, i=0,1,...,n-1\)
    类似的,定义差分的差分为高阶差分.如二阶差分
    \(\Delta^{2}f_{i}=\Delta f_{i+1}-\Delta f_{i}, i=0,1,...,n-2\)
    归纳定义如下
    \(\Delta^{0}f(x)=f(x)\)
    \(\Delta^{m}f(x)=\Delta^{m-1}f(x+h)-\Delta^{m-1}f(x)\)

  • 2)函数的差商

    设有函数\(f(x)\)以及一系列相异节点\(x_{0}<x_{1}<...<x_{n}\),则称\(\frac{f(x_{i})-f(x_{j})}{x_{i}-x_{j}}(i\neq j)\)为函数\(f(x)\)关于节点 \(x_{i},x_{j}\)的一阶差商,极为\(f[x_{i},x_{j}]\),即
    \(f[x_{i},x_{j}]=\frac{f(x_{i})-f(x_{j})}{x_{i}-x_{j}}\)
    称一阶插商的差商
    \(\frac{f[x_i,x_j]-f[x_j,x_k]}{x_{i}-x{k}}\)
    为\(f(x)\)关于\(x_i,x_j,x_k\)的二阶差商,记为\(f[x_i,x_j,x_k]\).一般地,称
    \(\frac{f[x_0,x_1,...,x_{k-1}]-f[x_1,x_2,...,x_k]}{x_{0}-x{k}}\)
    为\(f(x)\)关于点\(x_0,x_1...,x_k\)的k阶差商,记为
    \(f[x_0,x_1,...,x_k]=\frac{f[x_0,x_1,...,x_{k-1}]-f[x_1,x_2,...,x_k]}{x_{0}-x{k}}\)

    # 使用递归求差商
    def diff_quo(xi=[], yi=[]):
        if len(xi) > 2 and len(fi) > 2:
            return (diff_quo(xi[:len(xi)-1], fi[:len(fi)-1]) - diff_quo(xi[1:len(xi)], fi[1:len(fi)])) / float(xi[0]-xi[-1]))
        return (fi[0]-fi[1]) / float(xi[0]-xi[1])
    
  • 3)牛顿公式插值公式

    由于\(y=f(x)\)关于两点\(x_0,x_1\)的线性插值多项式为 \(N_1(x) = f(x_0) + \frac{f(x_1)-f(x_0)}{x_1-x_0}(x-x_0)\) 可将其表示成\(N_1(x) = f(x_0) + (x-x_0)f[x_0-x_1]\),称为一次牛顿插值多项式。

    一般地,由各阶差商的定义,依次可得

    \(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]\),

    \(f[x,x_0,x_1] = f[x_0,x_1,x_2] + (x-x_2)f[x,x_0,x_1,x_2]\),

    \[\cdots\] \[f[x,x_0,\cdots,x_{n-1}] = f[x_0,x_1,\cdots,x_n] + (x-x_n)f[x,x_0,\cdots,x_n]\]

    将以上个式分别乘以\(1,(x-x_0),(x-x_0)(x-x_1),\cdots,(x-x_0)(x-x_1)\cdots(x-x_{n-1})\),然后相加消去两边相等的部分,即得

    \[\quad f(x)\] \[= f(x_0) + (x-x_0)f[x_0,x_1]+\cdots+(x-x_0)(x-x_1)\cdots(x-x_{n-1})f[x_0,x-1,\cdots,x_n]\]

    \(\quad + (x-x_0)(x-x_1)\cdots(x-x_n)f[x,x_0,x_1,\cdots,x_n]\),

    \[\quad \quad N_n(x) = f(x_0) + (x-x_0)f[x_0,x_1]\]

    \(\quad \quad\quad \quad +\cdots+(x-x_0)(x-x_1)\cdots(x-x_n)f[x,x_0,x_1,\cdots,x_n]\),

    \[\quad \quad R_n(x) =(x-x_0)(x-x_1)\cdots(x-x_n)f[x,x_0,x_1,\cdots,x_n]\]

    显然,\(N_n(x)\)是至多\(n\)次的多项式,称为牛顿插值多项式。\(R_n(x)\)称为牛顿插值余项

    \(\quad\) 牛顿插值的优点是:每增加一个节点,插值多项式只增加一项,即

    \[N_{n+1}(x) = N_n(x) + (x-x_0)\cdots(x-x_n)f[x_0,x_1,\cdots,x_{n+1}]\]

    因而便于递推运算,而且牛顿插值的计算量小与Lagrange插值.

spline 样条插值

数学上将具有一定光滑性的曲线称为样条函数,即给区间$[a,b]$的一个划分
\(\Delta: a=x_0<x_1<...<x_n=b\)
若$ S(x) $满足:

  1. 在每个小区间\([x_i,x_{i+1}], i=0,1,...,n-1\)上为m多项式
  2. 在区间\([a,b]\)上具有$m-1$阶连续导数
    则称\(S(x)\)为关于划分\(\Delta\)的\(m\)次样条函数,其中图形为$m$次样条函数曲线。
    这里介绍三次样条差值,在区间\([a,b]\)上二阶连续可导,且\(S(x_1)=y_i(i=0,1,...,n)\),不妨记
    \(S(x)=S_i(x)=a_ix^3+b_ix^2+c_ix+d_i, x\in [x_i, x_{i+1}], i=0,1,...,n-1\)
    其中\(a_i, b_i, c_i, d_i\)为待定系数,一共4n个,得到4n-2个方程
\[S(x_i)=y_i, & i=0,1,...,n, \\ S_i(x_{i+1})=S_{i+1}(X_{i+1}), & i=0,1,...,n-2, \\ S_i^'(x_{i+1})=S_{i+1}^'(x_{i+1}), & i=0,1,...,n-2, \\ S_i^{''}(x_{i+1})=S_{i+1}^{''}(x_{i+1}), & i=0,1,...,n-2,\]

二维数据的双三次样条插值

例题求解

interp1d 一元插

scipy.interpolate.interp1d(x, y, kind='linear', axis=- 1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)

参数:

  • x, y: ndarray数组
  • kind: 插值方法{linear: 线性, nearest: 最近邻, nearest-up, previous, next; zero, slinear, quadratic, cubic: 一次到四次函数}
  • axis: 插值的轴(默认y轴)
from scipy.interpolate import interp1d