,,python实现各种插值法(数值分析)

,,python实现各种插值法(数值分析)

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: