python實(shí)現(xiàn)各種插值法(數(shù)值分析)
一維插值
插值不同于擬合。插值函數(shù)經(jīng)過(guò)樣本點(diǎn),擬合函數(shù)一般基于最小二乘法盡量靠近所有樣本點(diǎn)穿過(guò)。常見(jiàn)插值方法有拉格朗日插值法、分段插值法、樣條插值法。
- 拉格朗日插值多項(xiàng)式:當(dāng)節(jié)點(diǎn)數(shù)n較大時(shí),拉格朗日插值多項(xiàng)式的次數(shù)較高,可能出現(xiàn)不一致的收斂情況,而且計(jì)算復(fù)雜。隨著樣點(diǎn)增加,高次插值會(huì)帶來(lái)誤差的震動(dòng)現(xiàn)象稱(chēng)為龍格現(xiàn)象。
- 分段插值:雖然收斂,但光滑性較差。
- 樣條插值:樣條插值是使用一種名為樣條的特殊分段多項(xiàng)式進(jìn)行插值的形式。由于樣條插值可以使用低階多項(xiàng)式樣條實(shí)現(xiàn)較小的插值誤差,這樣就避免了使用高階多項(xiàng)式所出現(xiàn)的龍格現(xiàn)象,所以樣條插值得到了流行。
# -*-coding:utf-8 -*- import numpy as np from scipy import interpolate import pylab as 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") for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值方式 #"nearest","zero"為階梯插值 #slinear 線性插值 #"quadratic","cubic" 為2階、3階B樣條曲線插值 f=interpolate.interp1d(x,y,kind=kind) # ‘slinear', ‘quadratic' and ‘cubic' refer to a spline interpolation of first, second or third order) ynew=f(xnew) pl.plot(xnew,ynew,label=str(kind)) pl.legend(loc="lower right") pl.show()
結(jié)果:

二維插值
方法與一維數(shù)據(jù)插值類(lèi)似,為二維樣條插值。
# -*- coding: utf-8 -*- """ 演示二維插值。 """ import numpy as np from scipy import interpolate import pylab as pl import matplotlib as mpl def func(x, y): return (x+y)*np.exp(-5.0*(x**2 + y**2)) # X-Y軸分為15*15的網(wǎng)格 y,x= np.mgrid[-1:1:15j, -1:1:15j] fvals = func(x,y) # 計(jì)算每個(gè)網(wǎng)格點(diǎn)上的函數(shù)值 15*15的值 print len(fvals[0]) #三次樣條二維插值 newfunc = interpolate.interp2d(x, y, fvals, kind='cubic') # 計(jì)算100*100的網(wǎng)格上的插值 xnew = np.linspace(-1,1,100)#x ynew = np.linspace(-1,1,100)#y fnew = newfunc(xnew, ynew)#僅僅是y值 100*100的值 # 繪圖 # 為了更明顯地比較插值前后的區(qū)別,使用關(guān)鍵字參數(shù)interpolation='nearest' # 關(guān)閉imshow()內(nèi)置的插值運(yùn)算。 pl.subplot(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為 pl.colorbar(im1) pl.subplot(122) im2=pl.imshow(fnew, extent=[-1,1,-1,1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower") pl.colorbar(im2) pl.show()
左圖為原始數(shù)據(jù),右圖為二維插值結(jié)果圖。
二維插值的三維展示方法
# -*- coding: utf-8 -*-
"""
演示二維插值。
"""
# -*- coding: utf-8 -*-
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
from scipy import interpolate
import matplotlib.cm as cm
import matplotlib.pyplot as plt
def func(x, y):
return (x+y)*np.exp(-5.0*(x**2 + y**2))
# X-Y軸分為20*20的網(wǎng)格
x = np.linspace(-1, 1, 20)
y = np.linspace(-1,1,20)
x, y = np.meshgrid(x, y)#20*20的網(wǎng)格數(shù)據(jù)
fvals = func(x,y) # 計(jì)算每個(gè)網(wǎng)格點(diǎn)上的函數(shù)值 15*15的值
fig = plt.figure(figsize=(9, 6))
#Draw sub-graph1
ax=plt.subplot(1, 2, 1,projection = '3d')
surf = ax.plot_surface(x, y, fvals, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
plt.colorbar(surf, shrink=0.5, aspect=5)#標(biāo)注
#二維插值
newfunc = interpolate.interp2d(x, y, fvals, kind='cubic')#newfunc為一個(gè)函數(shù)
# 計(jì)算100*100的網(wǎng)格上的插值
xnew = np.linspace(-1,1,100)#x
ynew = np.linspace(-1,1,100)#y
fnew = newfunc(xnew, ynew)#僅僅是y值 100*100的值 np.shape(fnew) is 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,linewidth=0.5, antialiased=True)
ax2.set_xlabel('xnew')
ax2.set_ylabel('ynew')
ax2.set_zlabel('fnew(x, y)')
plt.colorbar(surf2, shrink=0.5, aspect=5)#標(biāo)注
plt.show()

左圖的二維數(shù)據(jù)集的函數(shù)值由于樣本較少,會(huì)顯得粗糙。而右圖對(duì)二維樣本數(shù)據(jù)進(jìn)行三次樣條插值,擬合得到更多數(shù)據(jù)點(diǎn)的樣本值,繪圖后圖像明顯光滑多了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Pycharm中對(duì)代碼進(jìn)行注釋和縮進(jìn)的方法詳解
今天小編就為大家分享一篇在Pycharm中對(duì)代碼進(jìn)行注釋和縮進(jìn)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
關(guān)于Series的index的方法和屬性使用說(shuō)明
這篇文章主要介紹了關(guān)于Series的index的方法和屬性使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子
這篇文章主要介紹了django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python特征降維知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Python特征降維知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-08-08
python使用writerows寫(xiě)csv文件產(chǎn)生多余空行的處理方法
這篇文章主要介紹了python使用writerows寫(xiě)csv文件產(chǎn)生多余空行的處理方法,需要的朋友可以參考下2019-08-08
Python基于codecs模塊實(shí)現(xiàn)文件讀寫(xiě)案例解析
這篇文章主要介紹了Python基于codecs實(shí)現(xiàn)文件讀寫(xiě)案例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法
下面小編就為大家分享一篇python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
matplotlib 畫(huà)雙軸子圖無(wú)法顯示x軸的解決方法
這篇文章主要介紹了matplotlib 畫(huà)雙軸子圖無(wú)法顯示x軸的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

