當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy interpolate.BarycentricInterpolator用法及代碼示例


本文簡要介紹 python 語言中 scipy.interpolate.BarycentricInterpolator 的用法。

用法:

class  scipy.interpolate.BarycentricInterpolator(xi, yi=None, axis=0, *, wi=None, random_state=None)#

對一組點進行插值多項式。

構造一個通過給定點集的多項式。允許評估多項式及其所有導數、有效更改要插值的 y-values,以及通過添加更多 x- 和 y-values 進行更新。

出於數值穩定性的原因,該函數不計算多項式的係數。

需要在計算函數之前提供 yi 值,但任何預處理都不依賴於它們,因此可以快速更新。

參數

xi 類似數組,形狀 (npoints, )

多項式應通過的點的 x 坐標的一維數組

yi 數組,形狀(...,npoints,...),可選

N-D 多項式應經過的點的 y 坐標數組。如果沒有,則 y 值稍後將通過set_y方法。長度為沿插補軸的長度必須等於xi。使用axis參數來選擇正確的軸。

axis 整數,可選

yi 數組中的軸對應於 x 坐標值。默認為 axis=0

wi 數組,可選

所選插值點 xi 的重心權重。如果不存在或無,則權重將從 xi (默認)計算。如果使用相同節點 xi 計算多個插值,則這允許重新使用權重 wi,而無需重新計算。

random_state {無,int, numpy.random.Generator numpy.random.RandomState },可選

如果種子是無(或np.random), 這numpy.random.RandomState使用單例。如果種子是一個 int,一個新的RandomState使用實例,播種種子.如果種子已經是一個Generator或者RandomState實例然後使用該實例。

注意

此類使用 “barycentric interpolation” 方法,將問題視為有理函數插值的特殊情況。該算法在數值上相當穩定,但即使在精確計算的世界中,除非非常仔細地選擇 x 坐標 - 切比雪夫零點(例如,cos(i*pi/n))是一個不錯的選擇 - 多項式插值本身就是一個由於龍格現象,非常ill-conditioned過程。

基於 Berrut 和 Trefethen 2004 年,“Barycentric Lagrange Interpolation”。

例子

要生成逼近函數 及其前四個導數的五次重心插值,請使用 中的六個 randomly-spaced 節點:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.interpolate import BarycentricInterpolator
>>> rng = np.random.default_rng()
>>> xi = rng.random(6) * np.pi/2
>>> f, f_d1, f_d2, f_d3, f_d4 = np.sin, np.cos, lambda x: -np.sin(x), lambda x: -np.cos(x), np.sin
>>> P = BarycentricInterpolator(xi, f(xi), random_state=rng)
>>> fig, axs = plt.subplots(5, 1, sharex=True, layout='constrained', figsize=(7,10))
>>> x = np.linspace(0, np.pi, 100)
>>> axs[0].plot(x, P(x), 'r:', x, f(x), 'k--', xi, f(xi), 'xk')
>>> axs[1].plot(x, P.derivative(x), 'r:', x, f_d1(x), 'k--', xi, f_d1(xi), 'xk')
>>> axs[2].plot(x, P.derivative(x, 2), 'r:', x, f_d2(x), 'k--', xi, f_d2(xi), 'xk')
>>> axs[3].plot(x, P.derivative(x, 3), 'r:', x, f_d3(x), 'k--', xi, f_d3(xi), 'xk')
>>> axs[4].plot(x, P.derivative(x, 4), 'r:', x, f_d4(x), 'k--', xi, f_d4(xi), 'xk')
>>> axs[0].set_xlim(0, np.pi)
>>> axs[4].set_xlabel(r"$x$")
>>> axs[4].set_xticks([i * np.pi / 4 for i in range(5)],
...                   ["0", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$\frac{3\pi}{4}$", r"$\pi$"])
>>> axs[0].set_ylabel("$f(x)$")
>>> axs[1].set_ylabel("$f'(x)$")
>>> axs[2].set_ylabel("$f''(x)$")
>>> axs[3].set_ylabel("$f^{(3)}(x)$")
>>> axs[4].set_ylabel("$f^{(4)}(x)$")
>>> labels = ['Interpolation nodes', 'True function $f$', 'Barycentric interpolation']
>>> axs[0].legend(axs[0].get_lines()[::-1], labels, bbox_to_anchor=(0., 1.02, 1., .102),
...               loc='lower left', ncols=3, mode="expand", borderaxespad=0., frameon=False)
>>> plt.show()
scipy-interpolate-BarycentricInterpolator-1.png

屬性

dtype

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.BarycentricInterpolator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。