matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)

给定一些数据,生成函数的方式有两种:插值,回归。

插值而得到的函数通过数据点,回归得到的函数不一定通过数据点。

下面给出拉格朗日插值,牛顿插值Hermite插值的程序,

具体原理可参考课本,不再赘述。

拉格朗日插值法

线性插值 一次精度 需要2个节点

二次插值 二次精度 需要3个节点

n次插值 n次精度 需要n+1个节点

拉格朗日插值代码段(根据传入数据自动判断次数):

# 返回多项式

其中lu_solve(A,b)是自己写的轮子,可以用numpy的numpy.linalg.sovle(A,b)来代替

到后面会有一期讲矩阵方程直接法,会有讲到如何写lu_solve()

看一看插值的效果如何

import 

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第1张图片
拉格朗日插值

可以看到,插值之后的函数可以较好地反映原数据点的情况。


牛顿插值法

涉及到的两个表,差分表和差商表:

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第2张图片
差分表

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第3张图片
差商表

递归打印差分表

def 

打印差商表,并以列表的形式返回图中蓝色圈起来的部分

def 

牛顿插值代码段(调用了之前求差商表的代码)

def 

插值效果图

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第4张图片
牛顿插值

可以看到,相同的插值节点,使用拉格朗日插值和牛顿插值的结果是相同的。

Hermite 插值法

三次Hermite插值不但要求在插值节点上插值多项式与函数值相等,还要求插值多项式的导数与函数导数相等。

进行Hermite插值需要六个信息:

这个比较好理解,通过

两点的插值有无限种方式。比如:

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第5张图片

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第6张图片

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第7张图片

但是,通过限制住两个端点的导数值,就可以确定下来大致的插值形状。(对于Hermite插值,六个条件能确定出唯一的插值结果)

例如,可以编程求出

def 

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第8张图片

龙格现象(Runge phenomenon)

然而,并不是所有的函数都可以通过提高插值次数来提高插值准确度。

比如著名的龙格函数

,从[-1,1]取10个点,插值出来的函数是这样的:

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第9张图片

这就是龙格现象,主要原因是误差项里面的高阶导数导致的。

什么是龙格现象(Rungephenomenon)?如何避免龙格现象?_MachineLearningwithTuring'sCat-CSDN博客_龙格现象​www.baidu.com
e0cdb00e09e6d50310ac87cade84ae80.png
https://en.wikipedia.org/wiki/Runge%27s_phenomenon​en.wikipedia.org

其实不单单是

,很多偶函数都有这样的性质:

比如

matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序)_第10张图片

用于生成上图的代码:

# 龙格现象的产生

如何避免龙格现象,就需要用到分段插值了。

下一篇将讲解分段插值。

你可能感兴趣的:(matlab做三次拉格朗日插值多项式_计算方法(2)——插值法(附Python程序))