Python 中的雙線性插值
Vaibhhav Khetarpal
2023年1月30日
線性插值線上性多項式的幫助下用於曲線擬合。
雙線性插值是線性插值的擴充套件,用於線上性插值的幫助下對任意兩個給定變數的函式進行插值。
讓我們演示在 Python 中實現雙線性插值的不同方法。
在 Python 中建立一個使用者定義
函式以實現雙線性插值
在這裡,我們建立了一個與四個點關聯的使用者定義
函式,並利用 Python 中的雙線性插值。
def bilinterpol(a, b, pts):
i = sorted(pts)
(a1, b1, x11), (_a1, b2, x12), (a2, _b1, x21), (_a2, _b2, x22) = i
if a1 != _a1 or a2 != _a2 or b1 != _b1 or b2 != _b2:
print("The given points do not form a rectangle")
if not a1 <= a <= a2 or not b1 <= b <= b2:
print("The (a, b) coordinates are not within the rectangle")
Y = (
x11 * (a2 - a) * (b2 - b)
+ x21 * (a - a1) * (b2 - b)
+ x12 * (a2 - a) * (b - b1)
+ x22 * (a - a1) * (b - b1)
) / ((a2 - a1) * (b2 - b1) + 0.0)
return Y
pts = [
(0, 1, 12),
(4, 1, 0),
(0, 3, -4),
(4, 3, 8),
]
print(bilinterpol(2, 3, pts))
輸出:
2.0
在 Python 中使用 scipy.interpolate.interp2d()
實現雙線性插值
SciPy
庫是 Scientific Python
的縮寫,是開源的。
由大量實用函式組成,有助於資料科學、優化、插值、線性代數、訊號處理等。SciPy
庫使用並依賴於 NumPy
庫。
此方法可以處理處理 NumPy
陣列的非常複雜的問題。我們案例中的 scipy.interpolate.interp2d()
函式在 2d 網格上實現雙線性插值。
語法:
scipy.interpolate.interp2d(
x, y, z, kind="linear", copy=True, bounds_error=False, fill_value=None
)
該函式包含三個重要引數,需要理解這些引數才能正確使用它。
x, y
都包含類似陣列的值,描述給定座標的資料點。x
表示列座標。相反,考慮到資料點位於網格上,y
表示行
座標。z
包含類似陣列的值,它指定要使用給定資料點集內插的函式的值。kind
指定要使用的插值型別。它可以是linear
、cubic
或quintic
。如果沒有傳遞引數,則該值預設為linear
。
以下程式碼使用 scipy.interpolate.interp2d()
在 Python 中實現雙線性插值。
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-15.01, 15.01, 1.00)
y = np.arange(-15.01, 15.01, 1.00)
xx, yy = np.meshgrid(x, y)
z = np.cos(xx ** 2 + yy ** 2)
f = interpolate.interp2d(x, y, z, kind="quintic")
xnew = np.arange(-15.01, 15.01, 1e-2)
ynew = np.arange(-15.01, 15.01, 1e-2)
znew = f(xnew, ynew)
plt.plot(x, z[0, :], "ro-", xnew, znew[0, :], "b-")
plt.show()
輸出:
程式碼說明:
- 所有三個基本庫,即
SciPy
、NumPyc
和MatPlotLib
,都被匯入到程式碼中。 - 然後使用
numpy.arrange()
函式以陣列的形式將值插入變數x 和 y
。 - 繼續執行
meshgrid()
函式,該函式生成一個1d
陣列,其中x 和 y
作為笛卡爾索引。 - 然後,利用
cos()
函式求餘弦值,該餘弦值確定程式碼中的主函式z
的值。 - 最後,在
matplotlib
庫函式的幫助下描述了結果。
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn