带interp1d的Python插值:线性插值和二次插值的结果相同

带interp1d的Python插值:线性插值和二次插值的结果相同,python,interpolation,Python,Interpolation,我有一个python代码,可以演示给定数据的线性插值和二次插值之间的区别。然而,我发现线性和二次都会产生相同的结果!有什么好处?我遗漏了什么微妙之处 del f1 del f2 n=10; x = np.linspace(0, 4, n) y = np.cos(x**2/3+4)+ 0.1 * np.random.randn(n) f1 = interp1d(x, y, kind = 'linear') f2 = interp1d(x, y, kind = 'cubic') n2=n xne

我有一个python代码,可以演示给定数据的线性插值和二次插值之间的区别。然而,我发现线性和二次都会产生相同的结果!有什么好处?我遗漏了什么微妙之处

del f1
del f2
n=10;
x = np.linspace(0, 4, n)
y = np.cos(x**2/3+4)+ 0.1 * np.random.randn(n)
f1 = interp1d(x, y, kind = 'linear')
f2 = interp1d(x, y, kind = 'cubic')


n2=n
xnew = np.linspace(0, 4, n)

plt.subplot(1,2,1)
plt.plot(x, y, 'o', xnew, f1(xnew), '-', xnew, f2(xnew), '--')
plt.xlabel('x')
plt.ylabel('y')
plt.subplot(1,2,2)
plt.semilogy(xnew, np.abs(f1(xnew)-y), '*', xnew, np.abs(f2(xnew)-y), 'o')
plt.xlabel('xnew')
plt.ylabel('Relative error between \n interpolation (f1 or f2) and actual y ')
plt.tight_layout()
plt.show()
线性插值和二次插值之间的差异太小了。不应该更大吗?见下图。我觉得我可能遗漏了一些明显的或微妙的东西

根据收到的评论编辑代码 我将代码更改为更简单的函数,并在
xnew
中增加点数。这几乎没有什么区别。我的哑巴缺了什么?线性插值(不管在
xnew
中有多少个条目)真的那么好吗

x = np.linspace(0,8,n)
y = 0.1*x**2;

f1 = interp1d(x, y, kind='linear')
f2 = interp1d(x, y, kind='quadratic')
xnew = np.linspace(np.min(x), np.max(x), num=250)
plt.plot(xnew, 0.1*xnew**2, '+', xnew, f1(xnew), 'r-', xnew, f2(xnew), 'g--')
plt.xlabel('xnew')
plt.ylabel('y, y(linear interp), y(quadratic interp)')
plt.show()

plt.figure(figsize=(10,4))
plt.subplot(1,3,1)
plt.plot(0.1*xnew**2+np.cos(2*xnew)-f1(xnew))
plt.xlabel('xnew')
plt.ylabel('y(linear interpolation)')

plt.subplot(1,3,2)
plt.plot(0.1*xnew**2+np.cos(2*xnew)-f2(xnew))
plt.xlabel('xnew')
plt.ylabel('y(quadratic interpolation)')

plt.subplot(1,3,3)
plt.plot(f1(xnew)-f2(xnew))
plt.xlabel('xnew')
plt.ylabel('difference betw \n linear and quadratic \n interpolation')


我没有全面了解您所做的工作,但这里有一个简单的示例,其中包含您的初始数据:

import numpy as np
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt

n = 10
x = np.linspace(0, 4, n)
y = np.cos(x**2/3+4)+ 0.1 * np.random.randn(n)

f1 = interp1d(x, y, kind = 'linear')
f2 = interp1d(x, y, kind = 'cubic')

xnew = np.linspace(0, 4, 100)

f, ax = plt.subplots(2, 1, sharex=True)
ax[0].plot(x, y, 'o', xnew, f1(xnew), '-')
ax[1].plot(x, y, 'o', xnew, f2(xnew), '-')
输出:

编辑:使用二次而不是三次

import numpy as np
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt

n = 10
x = np.linspace(0, 4, n)
y = np.cos(x**2/3+4)+ 0.1 * np.random.randn(n)

f1 = interp1d(x, y, kind = 'linear')
f2 = interp1d(x, y, kind = 'quadratic')

xnew = np.linspace(0, 4, 100)

f, ax = plt.subplots(2, 1, sharex=True)
ax[0].plot(x, y, 'o', xnew, f1(xnew), '-')
ax[1].plot(x, y, 'o', xnew, f2(xnew), '-')


三次函数和二次函数都提供了更多的“圆角”边。

在定义原始函数的相同点上计算插值函数。理想情况下,在这些点上不会有任何差异!您需要在更多的点上进行评估,以查看插值的效果。增加xnew中的点数。@jasonharper我做了一次编辑。我发现事情的方式没有什么不同。我的愚蠢的自我缺失了什么?@Mathieu我做了一次编辑。我发现事情的方式没有什么不同。我愚蠢的自我缺失了什么?问题解决了吗?