首页 > 解决方案 > SciPy 插值给出了意想不到的曲线

问题描述

对于数据集

  x   y

  1  80
  4  40
 16  20
 64  10
256   5

LibreOffice Calc 给我以下(多项式,3 次,趋势线)

计算

scipy.interpolate.interp1d调用kind='cubic'产生这个:

在此处输入图像描述

我试过玩interp1d's 的论点,也试过样条插值,scipy.optimize.curve_fit但都没有给我类似于 Calc 产生的东西。

标签: pythonscipy

解决方案


因此,您在 LibreOffice Calc 中所做的是将 x 转换为对数刻度,然后将数据拟合为三次多项式。对数刻度很重要;拟合 x 和 y 直接导致错误的曲线。这是 Python 的等价物:

import numpy as np
import matplotlib.pyplot as plt

x = [1, 4, 16, 64, 256]
y = [80, 40, 20, 10, 5]
logx = np.log2(x)
plt.scatter(logx, y, marker='s')
plt.xticks(logx, x)
plt.grid()

coeff = np.polyfit(logx, y, 3)
yfit = np.poly1d(coeff)

logx_new = np.linspace(logx[0], logx[-1], 100)
plt.plot(logx_new, yfit(logx_new))

interp1d进行样条插值,在三次样条的情况下,每 3 个相邻点拟合三次多项式。无论您是否转换 x,这都不同于将所有数据拟合为三次多项式。


推荐阅读