scipy 如何使用非线性插值法确定曲线上的单个值

mu0hgdu0  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(183)

我的数据如下所示:

当我绘制它时,它看起来像这样:

我已经能够使用这样的代码来拟合数据的非线性曲线:

df = pd.read_csv('data.csv')

X = df['Molecular Weight']
y = df['Time 1']

f = interpolate.interp1d(X, y)
f2 = interpolate.interp1d(X, y, kind='cubic')

plt.plot(X, y, 'o', X, f2(X), '-')
plt.legend(['data', 'cubic spline'], loc='best')
plt.show()

给了我这样一个情节:

我的问题是:我如何使用这个函数来解释5.111点的值?

qlvxas9a

qlvxas9a1#

您将永远无法使用用于对点进行插值的函数来获取用于插值的点的最大值和最小值之外的值;在你的情况下,这些是最低的1350和最高的670000。
如果您希望获得更小的值,则应将数据拟合为可表示数据点的函数。在您的情况下,我认为二阶多项式就足够了,而您不能超过四阶,因为您只有5个点。您应始终获得能够再现数据的最低阶数
您应该使用python代码是:

X = [670000, 158000, 44000, 17000, 1350]
y = [4.19, 5.469, 6.554, 7.293, 9.109]

polynom = np.polyfit(X, y, 2)
f2 = np.poly1d(polynom)

plt.plot(X, y, 'o', X, f2(X), '-')
plt.legend(['data', 'cubic spline'], loc='best')
plt.show()

从这个f2,你可以得到5.11的值

f2(5.11)

事情的一部分,我认为最好是当你绘制拟合过度表达的向量x,以有一个光滑的曲线,当你绘制的数据

x_fit = np.linspace(1350, 670000, 1000)
plt.plot(X, y, 'o', x_fit, f2(x_fit), '-')
plt.legend(['data', 'cubic spline'], loc='best')
plt.show()

相关问题