Python Scipy Interpolate Splrep 插值无法正确拟合点并创建虚假的最大值和最小值

问题描述 投票:0回答:1

我正在尝试绘制一些实验数据的图,并为其找到平滑的插值。我正在尝试使用 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")

stackhelp 2

蓝线是实验的实际数据。橙色线是带有 splrep 的简单样条线,绿色虚线正在编辑权重 k 和 s。粉红色的线更接近我想要的。

¿我做错了什么吗? 我可以让它使用这种方法,但改变权重,使第四个和第五个值对样条曲线更重要,并且 k 和 s 是正确的吗? ¿有谁知道另一种算法可以产生更接近我想要的结果?

非常感谢:)

python matplotlib scipy interpolation spline
1个回答
0
投票

您没有太多数据,并且点间隔不紧密,因此三次样条插值(使用

scipy.interpolate.splrep
scipy.interpolate.make_interp_spline
等内容时的默认值)将在点之间出现过冲和下冲。

我可以为你想到 4 个选项。

  1. 接受结果。
  2. 收集更多数据,这样数据就不会那么粗糙。
  3. 使用一阶拟合(即线性插值)。
  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)

© www.soinside.com 2019 - 2024. All rights reserved.