在科學計算中,數據往往是散點的,而不是連續的函數,很多需要連續數據的應用,比如對兩個數據點之間的數值進行求解,便需要使用插值函數進行處理。
而Scipy是Python中一個非常強大的科學計算庫,其中包含了多種插值函數,可以滿足不同場合的需求。
一、一維插值函數
一維插值函數主要是指計算兩個數據點之間的數值,並且接受一個可接受誤差值來處理異常情況。Scipy中的一維插值函數使用interp1d實現。
from scipy.interpolate import interp1d x = [0, 1, 2, 3, 4, 5, 6] y = [0, 3, 6, 8, 8, 7, 4] f = interp1d(x, y) print(f(2.5)) # 輸出:5.0
上述代碼實現了一個簡單的一維插值。其中x表示數據點,在這裡是0到6的整數,y表示每個數據點對應的值。使用interp1d創建一個插值函數,然後用f(2.5)計算出2.5和3之間的線性插值。
二、拉格朗日插值
拉格朗日插值是一種插值方法,它可以計算出一組數據點的多項式函數,然後再使用此函數插值。Scipy中的lagrange函數實現了拉格朗日插值。注意:拉格朗日插值可能會出現瑕疵,稱為龍格現象。
from scipy.interpolate import lagrange x = [0, 1, 2, 3, 4, 5, 6] y = [0, 3, 6, 8, 8, 7, 4] f = lagrange(x, y) print(f(2.5)) # 輸出:5.3125
上述代碼實現了基於拉格朗日插值的插值函數。它與前面的例子很相似,只是這裡使用了lagrange函數生成插值函數,而不是interp1d。
三、樣條插值
當數據點之間存在噪聲時,拉格朗日插值很可能會產生不可接受的結果。因此,樣條插值是這種情況下更好的選擇。樣條插值利用多個低次多項式實現插值,在兩個數據點之間使用局部函數進行插值。Scipy中的spline函數和PchipInterpolator函數都可以實現一維樣條插值。
spline函數的一個例子:
from scipy.interpolate import spline x = [0, 1, 2, 3, 4, 5, 6] y = [0, 3, 6, 8, 8, 7, 4] xnew = np.linspace(0, 6, 25) ynew = spline(x, y, xnew) import matplotlib.pyplot as plt plt.plot(x, y, 'o', xnew, ynew) plt.show()
PchipInterpolator函數的一個例子:
from scipy.interpolate import PchipInterpolator x = [0, 1, 2, 3, 4, 5, 6] y = [0, 3, 6, 8, 8, 7, 4] f = PchipInterpolator(x, y) import matplotlib.pyplot as plt xnew = np.linspace(0, 6, 25) ynew = f(xnew) plt.plot(x, y, 'o', xnew, ynew) plt.show()
上述兩個例子展示了如何使用spline函數和PchipInterpolator函數實現一維的樣條插值。兩個函數都需要傳入數據點x和y,然後可以通過生成新的數據點實現不同程度的插值。最後使用plt將二維數據進行可視化。
四、二維插值函數
二維插值函數主要用於對二維網格中的數值進行插值。Scipy中的interpolate二維查找函數可以使用各種方法進行插值。下面給出一個使用interp2d進行插值的例子:
from scipy.interpolate import interp2d import numpy as np x = np.array([0, 1, 2, 3, 4, 5, 6]) y = np.array([0, 1, 2, 3, 4, 5]) z = np.array([[1, 2, 3, 4, 5, 6, 7], [2, 3, 4, 5, 6, 7, 8], [3, 4, 8, 7, 9, 6, 5], [4, 5, 7, 9, 6, 5, 4], [5, 6, 9, 8, 5, 4, 3]]) f = interp2d(x, y, z) new_x = np.linspace(0, 6, 15) new_y = np.linspace(0, 5, 10) new_z = f(new_x, new_y) import matplotlib.pyplot as plt plt.imshow(new_z, interpolation='nearest', origin='lower', extent=[new_x.min(), new_x.max(), new_y.min(), new_y.max()]) plt.show()
上述例子展示了如何使用interp2d執行二維插值。其中,插值前的數據是3 * 5共15個數據點的二維點。我們傳遞的x和y是分別對應x軸和y軸數據點所在的位置。
總結
本文介紹了Python中Scipy插值函數的使用。分別介紹了一維插值函數、拉格朗日插值、樣條插值、二維插值函數等多種插值方法,深入講解了如何使用Scipy來實現數據的插值,為讀者提供了豐富的實用知識。
原創文章,作者:NLDKK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/313838.html