各种插值法的python实现

各种插值法的python实现

2023年6月29日发(作者:)

各种插值法的python实现⼀维插值  插值不同于拟合。插值函数经过样本点,拟合函数⼀般基于最⼩⼆乘法尽量靠近所有样本点穿过。常见插值⽅法有拉格朗⽇插值法、分段插值法、样条插值法。1. 拉格朗⽇插值多项式:当节点数n较⼤时,拉格朗⽇插值多项式的次数较⾼,可能出现不⼀致的收敛情况,⽽且计算复杂。随着样点增加,⾼次插值会带来误差的震动现象称为龙格现象。2. 分段插值:虽然收敛,但光滑性较差。3. 样条插值:样条插值是使⽤⼀种名为样条的特殊分段多项式进⾏插值的形式。由于样条插值可以使⽤低阶多项式样条实现较⼩的插值误差,这样就避免了使⽤⾼阶多项式所出现的龙格现象,所以样条插值得到了流⾏。# -*-coding:utf-8 -*-import numpy as npfrom scipy import interpolateimport pylab as plx=ce(0,10,11)#x=[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]y=(x)xnew=ce(0,10,101)(x,y,"ro")for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值⽅式 #"nearest","zero"为阶梯插值 #slinear 线性插值 #"quadratic","cubic" 为2阶、3阶B样条曲线插值 f=1d(x,y,kind=kind) # ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of first, second or third order) ynew=f(xnew) (xnew,ynew,label=str(kind))(loc="lower right")()结果:

⼆维插值  ⽅法与⼀维数据插值类似,为⼆维样条插值。# -*- coding: utf-8 -*-"""演⽰⼆维插值。"""import numpy as npfrom scipy import interpolateimport pylab as plimport matplotlib as mpldef func(x, y): return (x+y)*(-5.0*(x**2 + y**2))# X-Y轴分为15*15的⽹格y,x= [-1:1:15j, -1:1:15j]fvals = func(x,y) # 计算每个⽹格点上的函数值 15*15的值print len(fvals[0])#三次样条⼆维插值newfunc = 2d(x, y, fvals, kind='cubic')# 计算100*100的⽹格上的插值xnew = ce(-1,1,100)#xynew = ce(-1,1,100)#yfnew = newfunc(xnew, ynew)#仅仅是y值 100*100的值# 绘图# 为了更明显地⽐较插值前后的区别,使⽤关键字参数interpolation='nearest'# 关闭imshow()内置的插值运算。t(121)im1=(fvals, extent=[-1,1,-1,1], cmap=, interpolation='nearest', origin="lower")##extent=[-1,1,-1,1]为x,y范围 favals为ar(im1)t(122)im2=(fnew, extent=[-1,1,-1,1], cmap=, interpolation='nearest', origin="lower")ar(im2)()

左图为原始数据,右图为⼆维插值结果图。⼆维插值的三维展⽰⽅法# -*- coding: utf-8 -*-"""演⽰⼆维插值。"""# -*- coding: utf-8 -*-import numpy as npfrom mpl_3d import Axes3Dimport matplotlib as mplfrom scipy import interpolateimport as cmimport as pltdef func(x, y): return (x+y)*(-5.0*(x**2 + y**2))# X-Y轴分为20*20的⽹格x = ce(-1, 1, 20)y = ce(-1,1,20)x, y = id(x, y)#20*20的⽹格数据fvals = func(x,y) # 计算每个⽹格点上的函数值 15*15的值fig = (figsize=(9, 6))#Draw sub-graph1ax=t(1, 2, 1,projection = '3d')surf = _surface(x, y, fvals, rstride=2, cstride=2, cmap=rm,linewidth=0.5, antialiased=True)_xlabel('x')_ylabel('y')_zlabel('f(x, y)')ar(surf, shrink=0.5, aspect=5)#标注#⼆维插值newfunc = 2d(x, y, fvals, kind='cubic')#newfunc为⼀个函数# 计算100*100的⽹格上的插值xnew = ce(-1,1,100)#xynew = ce(-1,1,100)#yfnew = newfunc(xnew, ynew)#仅仅是y值 100*100的值 (fnew) is 100*100xnew, ynew = id(xnew, ynew)ax2=t(1, 2, 2,projection = '3d')surf2 = _surface(xnew, ynew, fnew, rstride=2, cstride=2, cmap=rm,linewidth=0.5, antialiased=True)_xlabel('xnew')_ylabel('ynew')_zlabel('fnew(x, y)')ar(surf2, shrink=0.5, aspect=5)#标注()

  左图的⼆维数据集的函数值由于样本较少,会显得粗糙。⽽右图对⼆维样本数据进⾏三次样条插值,拟合得到更多数据点的样本值,绘图后图像明显光滑多了。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687976215a62706.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信