📜  SciPy 插值

📅  最后修改于: 2022-05-13 01:55:17.438000             🧑  作者: Mango

SciPy 插值

在本文中,我们将使用Python的 SciPy 模块学习插值。首先,我们将讨论插值及其类型和实现。

插值及其类型

插值是一种在给定数据点之间构建数据点的技术。 scipy.interpolate是Python SciPy 中的一个模块,由类、样条函数以及单变量和多变量插值类组成。插值可以通过多种方式完成,其中一些是:

  • 一维插值
  • 样条插值
  • 单变量样条插值
  • RBF 插值

让我们一一讨论所有方法并将结果可视化。

一维插值

要创建基于固定数据点的函数,使用scipy.interpolate.interp1d 。它接受数据点 x 和 y 并返回一个可以用新 x 调用的函数,并返回相应的 y 点。

Python
# Import the required Python libraries
import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np
  
# Initialize input values x and y
x = np.arange(0, 10)
y = x**2
  
# Interpolation
temp = interpolate.interp1d(x, y)
xnew = np.arange(0, 9, 0.2)
ynew = temp(xnew)
  
plt.title("1-D Interpolation")
plt.plot(x, y, '*', xnew, ynew, '-', color="green")
plt.show()


Python
# Import the required Python libraries
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
  
# Initialize the input values
x = np.arange(0, 10)
y = np.cos(x**3)
  
# Interpolation
# To find the spline representation of a 
# curve in a 2-D plane using the function 
# splrep
temp = interpolate.splrep(x, y, s=0)
xnew = np.arange(0, np.pi**2, np.pi/100)
ynew = interpolate.splev(xnew, temp, der=0)
  
plt.figure()
  
plt.plot(x, y, '*', xnew, ynew, xnew, np.cos(xnew),
         x, y, 'b', color="green")
  
plt.legend(['Linear', 'Cubic Spline', 'True'])
plt.axis([-0.1, 6.5, -1.1, 1.1])
plt.title('Cubic-spline Interpolation in Python')
plt.show()


Python
# Import the required libraries
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
  
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.title("Univariate Spline")
plt.plot(x, y, 'g.', ms=8)
  
# Using the default values for the 
# smoothing parameter
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'green', lw=3)
  
# Manually change the amount of smoothing
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), color='black', lw=3)
plt.show()


Python
# Import the required libraries
import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
  
# setup the data values
x = np.linspace(0, 10, 9)
y = np.cos(x/2)
xi = np.linspace(0, 10, 110)
  
# Interpolation using RBF
rbf = Rbf(x, y)
fi = rbf(xi)
  
plt.subplot(2, 1, 2)
plt.plot(x, y, '*', color="green")
plt.plot(xi, fi, 'green')
plt.plot(xi, np.sin(xi), 'black')
plt.title('Radial basis function Interpolation')
plt.show()


输出:

样条插值

在样条插值中,计算曲线的样条表示,然后在所需点处计算样条。函数splrep用于在二维平面中找到曲线的样条表示。

  • 要找到一维曲线的 B 样条表示,使用scipy.interpolate.splrep
  • 要计算 B 样条或其导数,使用scipy.interpolate.splev

Python



# Import the required Python libraries
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
  
# Initialize the input values
x = np.arange(0, 10)
y = np.cos(x**3)
  
# Interpolation
# To find the spline representation of a 
# curve in a 2-D plane using the function 
# splrep
temp = interpolate.splrep(x, y, s=0)
xnew = np.arange(0, np.pi**2, np.pi/100)
ynew = interpolate.splev(xnew, temp, der=0)
  
plt.figure()
  
plt.plot(x, y, '*', xnew, ynew, xnew, np.cos(xnew),
         x, y, 'b', color="green")
  
plt.legend(['Linear', 'Cubic Spline', 'True'])
plt.axis([-0.1, 6.5, -1.1, 1.1])
plt.title('Cubic-spline Interpolation in Python')
plt.show()

输出:

单变量样条

它是适合给定数据点组的一维平滑样条。 scipy.interpolate.UnivariateSpline用于将 k 次的样条 y = spl(x) 拟合到提供的 x, y 数据。 s 通过指定平滑条件来指定节点数。 scipy.interpolate.UnivariateSpline。 set_smoothing_factor:使用给定的平滑因子 s 和最后一次调用时找到的结点进行样条计算。

Python

# Import the required libraries
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
  
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.title("Univariate Spline")
plt.plot(x, y, 'g.', ms=8)
  
# Using the default values for the 
# smoothing parameter
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'green', lw=3)
  
# Manually change the amount of smoothing
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), color='black', lw=3)
plt.show()

输出:

插值的径向基函数

scipy.interpolate.Rbf用于在 n 维内插散数据。径向基函数被定义为对应于一个固定的参考数据点。 scipy.interpolate.Rbf是一个类,用于从 ND 散射数据到 MD 域的函数的径向基函数插值。

Python

# Import the required libraries
import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
  
# setup the data values
x = np.linspace(0, 10, 9)
y = np.cos(x/2)
xi = np.linspace(0, 10, 110)
  
# Interpolation using RBF
rbf = Rbf(x, y)
fi = rbf(xi)
  
plt.subplot(2, 1, 2)
plt.plot(x, y, '*', color="green")
plt.plot(xi, fi, 'green')
plt.plot(xi, np.sin(xi), 'black')
plt.title('Radial basis function Interpolation')
plt.show()

输出: