Python 中的雙線性插值

Vaibhhav Khetarpal 2023年1月30日
  1. 在 Python 中建立一個使用者定義函式以實現雙線性插值
  2. 在 Python 中使用 scipy.interpolate.interp2d() 實現雙線性插值
Python 中的雙線性插值

線性插值線上性多項式的幫助下用於曲線擬合。

雙線性插值是線性插值的擴充套件,用於線上性插值的幫助下對任意兩個給定變數的函式進行插值。

讓我們演示在 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 指定要使用的插值型別。它可以是 linearcubicquintic。如果沒有傳遞引數,則該值預設為 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()

輸出:

Python 中的 Scipybilinear 插值

程式碼說明:

  • 所有三個基本庫,即 SciPyNumPycMatPlotLib,都被匯入到程式碼中。
  • 然後使用 numpy.arrange() 函式以陣列的形式將值插入變數 x 和 y
  • 繼續執行 meshgrid() 函式,該函式生成一個 1d 陣列,其中 x 和 y 作為笛卡爾索引。
  • 然後,利用 cos() 函式求餘弦值,該餘弦值確定程式碼中的主函式 z 的值。
  • 最後,在 matplotlib 庫函式的幫助下描述了結果。
Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

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

相關文章 - Python Interpolation