本文主要介绍python对各种插值方法(数值分析)的实现,通过实例代码非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。
一维插值
插值不同于拟合。插值函数通过样本点,拟合函数一般基于最小二乘法通过尽可能接近的所有样本点。常见的插值方法有拉格朗日插值法、分段插值法、样条插值法。
拉格朗日插值多项式:当节点数n较大时,拉格朗日插值多项式的次数较高,可能导致收敛不一致,计算复杂。随着样本点的增加,高阶插值会带来误差的振动现象称为龙格现象。
分段插值:虽然收敛,但平滑性差。
样条插值:样条插值是一种使用称为样条的特殊分段多项式的插值形式。样条插值之所以流行,是因为它可以使用低阶多项式样条来实现更小的插值误差,从而避免了使用高阶多项式时的龙格现象。
#-*-编码:utf-8 -*-
将numpy作为np导入
从scipy导入插值
将pylab作为pl导入
x=np.linspace(0,10,11)
#x=[ 0。1.2.3.4.5.6.7.8.9.10.]
y=np.sin(x)
xnew=np.linspace(0,10,101)
pl.plot(x,y,' ro ')
对于['最接近','零','线性','二次','三次']: #插值法
# '最近','零'是步进插值。
# slinear线性插值
#“二次”、“三次”是二阶和三阶B样条曲线的插值。
f=interpolate.interp1d(x,y,kind=kind)
#“线性”、“二次”和“三次”是指一阶、二阶或三阶样条插值)
ynew=f(xnew)
pl.plot(xnew,ynew,label=str(kind))
pl.legend(loc='右下角')
pl.show()
结果:
二维插值
方法类似于一维数据插值,是二维样条插值。
# -*-编码:utf-8 -*-
'''
演示二维插值。
'''
将numpy作为np导入
从scipy导入插值
将pylab作为pl导入
将matplotlib作为mpl导入
def func(x,y):
return(x y)* NP . exp(-5.0 *(x * * 2y * * 2))
# X-Y轴被分成15*15个网格
y,x=np.mgrid[-1:1:15j,-1:1:15j]
Fvals=func(x,y) #计算15*15的函数值在每个网格点的值
打印长度(fvals[0])
#三次样条2D插值
newfunc=interpolate.interp2d(x,y,fvals,kind='cubic ')
#在100*100的网格上计算插值
xnew=np.linspace(-1,1,100)#x
ynew=np.linspace(-1,1,100)#y
Fnew=newfunc(xnew,ynew)#只是一个Y值为100*100的值
#绘图
#为了更明显地比较插值前后的差异,使用关键字参数interpolation='nearest '
#关闭imshow()内置的插值运算。
pl .支线剧情(121)
im1=pl.imshow(fvals,extent=[-1,1,-1,1],cmap=mpl.cm.hot,interpolation='nearest ',origin='lower')#pl.cm.jet
#extent=[-1,1,-1,1]是x,y范围favals是
颜色条(im1)
pl .支线剧情(122)
im2=pl.imshow(fnew,extent=[-1,1,-1,1],cmap=mpl.cm.hot,interpolation='nearest ',origin='lower ')
颜色条(im2)
pl.show()
左图为原始数据,右图为二维插值结果。
二维插值的三维展示方法
# -*-编码:utf-8 -*-
'''
演示二维插值。
'''
# -*-编码:utf-8 -*-
将numpy作为np导入
从mpl_toolkits.mplot3d导入Axes3D
将matplotlib作为mpl导入
从scipy导入插值
将matplotlib.cm作为cm导入
将matplotlib.pyplot作为plt导入
def func(x,y):
return(x y)* NP . exp(-5.0 *(x * * 2y * * 2))
# X-Y轴被分成20*20个网格
x=np.linspace(-1,1,20)
y=np.linspace(-1,1,20)
x,y=np.meshgrid(x,y)#20*20网格数据
Fvals=func(x,y) #计算15*15的函数值在每个网格点的值
fig=plt.figure(figsize=(9,6))
#绘制子图1
ax=plt.subplot(1,2,1,projection='3d ')
surf=ax.plot_surface(x,y,fvals,rstride=2,cstride=2,cmap=cm.coolwarm,线宽=0.5,抗锯齿=True)
ax.set_xlabel('x ')
ax.set_ylabel('y ')
ax.set_zlabel('f(x,y)')
Plt.colorbar (surf,shrink=0.5,aspect=5) # annotation
# 2D插值
Newfunc=interpolate.interp2d (x,y,fvals,kind=' cubic') # newfunc是一个函数
#在100*100的网格上计算插值
xnew=np.linspace(-1,1,100)#x
ynew=np.linspace(-1,1,100)#y
fnew=newfunc(xnew,ynew)#就是值NP。形状(fnew)为100*100,y值为100 * 100。
xnew,ynew=np.meshgrid(xnew,ynew)
ax2=plt.subplot(1,2,2,projection='3d ')
surf2=ax2.plot_surface(xnew,ynew,fnew,rstride=2,cstride=2,cmap=cm.coolwarm,线宽=0.5,抗锯齿=True)
ax2.set_xlabel('xnew ')
ax2.set_ylabel('ynew ')
ax2.set_zlabel('fnew(x,y)')
Plt。颜色条(SURF2,shrink=0.5,aspect=5) #批注
plt.show()
左边二维数据集的函数值会因为样本少而显得粗糙。右边是对二维样本数据进行三次样条插值,拟合得到更多数据点的样本值。画完之后,图像平滑多了。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。