我们能得到一个函数f在区间[a,b]上某些点的值或者这些点上的高阶导数

我们就能通过插值法去得到一个函数g,g与f是非常相近的

一般来说g分为三类,一类是n次多项式 an*xn + an-1*xn-1 + .......+a0,一类是三角多项式,最后一类是分段n次多项式

 

多项式插值

这个可以说是最简单的插值了

 对于an*xn + an-1*xn-1 + .......+a0,我们有n+1个未知数,我只需要知道n+1个点的函数值就可以解出这n+1个未知数

将解出的值带入即可

 

优点:简单粗暴

缺点:要解n+1个方程,时间复杂度较高,n不好确定,若n过大,容易过拟合,若n过小,容易欠拟合

 

拉格朗日插值

先说一阶多项式

我们有两点式

f(x) = yk*(xk+1 - x) / (xk-xk+1) + yk+1*(x-xk) / (xk+1 - xk

此两点式可以看做∂ * yk + (1-∂) * yk+1

那么自然的在x=xk的时候 ∂=0  在x=xk+1的时候∂=1

这里的∂其实是与x相关的一阶多项式

再说二阶多项式

对于一个二次函数,我们有三个点(xk-1,yk-1) ,(xk,yk) ,(xk+1,yk+1)

我们有lk-1,lk,lk+1

f(x) = lk-1*yk-1 + lk*yk  +  lk+1*yk+1

其中l是与x相关的二次多项式

我们可以把l当作基函数

这样的话就有

x = xk-1 时lk-1 = 1, lk=0, lk+1 = 0

x = xk时   lk-1 = 0, lk=1, lk+1 = 0

x = xk+1时lk-1 = 0, lk=0, lk+1 = 1

那么这个插值基函数是很好求的

因为每个插值函数都有两个零点

对于lk-1来说有零点xk,xk+1

那么lk-1就可以表示为lk-1 = A*(x-xk)*(x-xk+1)

因为x=xk-1时lk-1 = 1

所以A = 1 / ((xk-1 - xk)* (xk-1 - xk+1) )

那么同理lk和lk+1也能求出来了

那我们得到二阶的拉格朗日插值多项式

插值 Python 插值法举例说明_插值 Python

 

现在将二阶推广到n阶

得到n接的拉格朗日插值多项式

插值 Python 插值法举例说明_样条_02

插值 Python 插值法举例说明_插值_03

 

余项:

Rn(x) = f(x) - Ln(x)  Rn(x)表示n次拉格朗日多项式的插值余项

Rn(x) = fn+1(e)/(n+1)!  * wn+1(x)    e属于[a,b]且依赖与x  wn+1(x) = (x-x0)(x-x1).......(x-xn)

 

 

优点:算法较为简单

缺点:无法处理动态增加节点的情况

 

牛顿插值

还是先从一阶到二阶进行说明

我先得到了一阶差值多项式P1(x),P1(x) 满足过点(x1, f(x1)), (x2,f(x2))

假设现在有第三个点(x3,f(x3))我们要通过这个点去得到二阶差值多项式P2(x) 使得P2(x)过这三个点

可以设P2(x) = P1(x) + a2*(x-x0)*(x-x1)

通过第三个点解出a2就行了

推广到多阶

那么可以得到Pn(x) = a0 + a1(x-x0) + a2(x-x0)(x-x1) + a3(x-x0)(x-x1)(x-x2) + ......

求这个插值多项式的值可以通过递推一步一步的求

这样就实现了动态增删

可以看到计算ak需要计算(k-1)2次,那么牛顿插值法就是一个快速的计算方法   

 

均差

一阶均差  f[x0, xk] = ( f(xk) - f(x0)  ) / (xk - x0)

二阶均差  f[x0, x1, x2] = (f[x0, x2] -f[x0, x1]  ) / (x2 - x1)

可以看到一阶均差就是简单的求斜率

二阶均差就是对一阶均差求斜率

那么k阶均差就是

f[x0, x1,,,,,,xk] = (f[x0,,,,,xk-2, xk] -f[x0, ,,,,,,,xk-2,xk-1]  ) / (xk - xk-1)

f[x0, x1,,,,,,xk] = fn(ε) / n!

 

均差的性质

k阶均差可表示为f(x0),f(x1), f(x2),,,,,,,,, f(xk)的线性组合

插值 Python 插值法举例说明_样条_04

 

 

牛顿插值中的a就是均差,可以从一阶开始推,然后使用数学归纳法证明

那么牛顿插值多项式就是:

插值 Python 插值法举例说明_插值 Python_05

在计算f[x0,x1,,,,,,,,,,xn]时,一般使用均差表

插值 Python 插值法举例说明_插值_06

 

均差表的计算方式为

a[i,j] = (  a[i-1][j] - a[i-1][j-1]  )  / (末尾的x - 最开始的x)

 

 

误差:

误差为最后一阶的均差 * w(x)

  

优点:可动态增删节点

缺点:无法处理要求导数相同的情况

 

埃尔米特插值法实验报告

一个点,多个导数:

牛顿插值中的均差在xi->x0时其实分别是i阶导数,这样就是我们熟悉的泰勒多项式

此时的插值函数就是泰勒多项式

插值 Python 插值法举例说明_样条_07

 

两个点,一个导数

我们有三个条件,也就是说我们能求出三次插值多项式

这时我们先写出过这两个点的牛顿插值多项式

插值 Python 插值法举例说明_插值 Python_08

在这个多项式的基础上我们再加上一个三次项

插值 Python 插值法举例说明_插值_09

 

搞定,可以观察到,这三个项数其实可以算是正交的,因为当x=x1或者x=x2时最后一项是0满足条件的

两个点,两个导数

这也是题目所要求的情况

因为有两个导数,所以牛顿插值法无法解决,这里只能使用基函数方法

设插值函数为H(x), 点与导数分别为(x1,y1,m1),(x2,y2,m2)

H(x)满足:H(x1) =y1, H(x2) = y2, H(x1)’ = m1,H(x2)=m2

H(x) = a1*x1 + a2*x2 + b1*m1 + b2*m2

其中 a1,  a2,  b1,  b2均为三层插值多项式

X=x1时 a1(x1) = 1,a2(x1) = 0, b1(x1) = 0,b2(x1) = 0,a1’(x1) = 1,a2’(x1) = 0

X=x2时 a1(x2) = 0,a2(x2) = 1, b1(x2) = 0,b2(x2) = 0,a1’(x2) = 1,a2’(x2) = 0

X=x1时 b1’(x1) = 1,b2’(x1) = 0

X=x2时b1’(x1) = 0,b2’(x1) = 1

 

然后用了一个很巧妙的方法设基函数,解出来值和就是这样子的

 

插值 Python 插值法举例说明_多项式_10

R3(x) = 1/4! * (x-xk)2(x-xk+1)2*f4(ε)

 

 

两个点,两个导数2

直接使用泰勒多项式,并把将余项改为未知数,使用多余的一个条件去求余项的值

例如:

求次数小于等于3的多项式P(x),使满足条件

  P(x0)=f(x0),P'(x0)=f'(x0),P"(x0)=f"(x0),P(x1)=f(x1)。

 

插值 Python 插值法举例说明_多项式_11

 

 

 

多个点,多个一阶导数,三次

两个点作为一个区间每个区间分别求就好啦

这样子还保证了导数的连续性

 

优点:可保证一阶导数连续

 

三次样条插值

三次样条插值就是使用 ax3+bx2+cx + d = 0去做拟合

一共有4个未知数,也就是说 对于每个小区间,我需要至少4个方程

假设我有n个点, 那么就一共有n-1个小区间,一共就是4n - 4个方程

 

因为n个点中,我们有n个点的函数值  n个方程

每个区间相邻点函数值相等                 n-2个方程

每个区间相邻点一阶导相等      n-2个方程

每个区间相邻点二阶导相等      n-2个方程

 

 

还差两个条件 

剩下的两个条件一般为     

  区间两端点的一阶导已知

  区间两端点的二阶导为0

 

那么一共是4n - 2个方程,搞定

 

具体解法:

这里放一个例题

插值 Python 插值法举例说明_插值_12

 

插值 Python 插值法举例说明_插值_13

 

插值 Python 插值法举例说明_多项式_14

 

 

插值 Python 插值法举例说明_插值_15

插值 Python 插值法举例说明_插值 Python_16

插值 Python 插值法举例说明_多项式_17

 

优点:三次样条插值得到的插值函数二阶导,一阶导均连续,此为三次样条插值的