我正在尝试绘制一些实验数据的图,并为其找到平滑的插值。我正在尝试使用 scipy.interpolate.splrep ,它在我的数据之间创建了这种奇怪的起伏模式,创建了假的最大值和最小值。其他算法(如 UnivariateSpline 或 savgol_filter)也会产生类似的结果。我也尝试过改变 w 权重因子(尽管我真的不知道该放什么)。 我尝试更改数据集中第四个和第五个点的权重以使其更加相似,但它根本没有改变。 k=2 的值效果更好一点
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt
x = [0,0.001226, 0.002454, 0.003696, 0.01,0.027,0.058, 0.068]
y = [0, 101.85916358, 203.71832716, 305.57749074, 356.50707253, 407.43665432, 458.3662361, 470.58933573]
plt.plot(x,y)
itp_spline = splrep(x,y)
x_new = np.linspace(min(x), max(x), num=100)
y_new = splev(x_new, tck=itp_spline)
plt.plot(x_new, y_new)
weights = [1,1,4,100,200,40,30,2]
itp_spline_2 = splrep(x, y, w=weights, k=2, s=1)
x_new = np.linspace(min(x), max(x), num=100)
y_new = splev(x_new, tck=itp_spline_2)
plt.plot(x_new, y_new, linestyle="dashed")
蓝线是实验的实际数据。橙色线是带有 splrep 的简单样条线,绿色虚线正在编辑权重 k 和 s。粉红色的线更接近我想要的。
¿我做错了什么吗? 我可以让它使用这种方法,但改变权重,使第四个和第五个值对样条曲线更重要,并且 k 和 s 是正确的吗? ¿有谁知道另一种算法可以产生更接近我想要的结果?
非常感谢:)
您没有太多数据,并且点间隔不紧密,因此三次样条插值(使用
scipy.interpolate.splrep
和 scipy.interpolate.make_interp_spline
等内容时的默认值)将在点之间出现过冲和下冲。
我可以为你想到 4 个选项。
目前,以下是如何使用
scipy.make_interp_spline
进行一阶拟合:
from scipy.interpolate import make_interp_spline
spl = make_interp_spline(x, y, k=1)
x_new = np.linspace(min(x), max(x), num=100)
y_new = spl(x_new)