使用interp1d生成的三次样条与二次样条图形一致,求代码错误排查
问题排查:二次样条与三次样条插值图形一致的原因
我使用scipy库的interp1d函数实现二次样条(quadratic)和三次样条(cubic)插值,但发现生成的三次样条图形与二次样条完全一致,怀疑代码存在错误,恳请帮忙排查问题。
原始代码
from scipy.interpolate import interp1d import matplotlib.pyplot as plt import numpy as np x = [1.6, 2, 2.5, 3.2, 4, 4.5] y = [2, 8, 14, 15, 8, 2] f1 = interp1d(x, y, kind='quadratic') f2 = interp1d(x, y, kind='cubic') fig, axs = plt.subplots(4) fig.suptitle(' Splines') axs[0].plot(x, y, 'go') # quadratic spline axs[1].plot(x, y, 'go', x, f1(x),'m--') # cubic spline axs[2].plot(x, y, 'go', x, f2(x), 'b-.') axs[3].plot(x, y, 'go', x, f1(x), 'r-', x, f2(x), 'b-.') axs[3].legend(['data', 'quadratic', 'cubic'], loc='best') plt.show()
问题原因
你看到的图形重合是因为只在原始数据点x上绘制了插值结果——插值的基本性质就是在原始数据点上,插值函数的取值和原数据完全一致,所以二次、三次样条在这些点上的结果必然相同,自然看不出差异。
你的数据点数量(6个)满足kind='cubic'的最低要求(至少4个点),所以不是参数不合法导致的降级问题。
修正后的代码
要看到两种样条的差异,需要生成更密集的采样点来绘制完整的插值曲线:
from scipy.interpolate import interp1d import matplotlib.pyplot as plt import numpy as np x = [1.6, 2, 2.5, 3.2, 4, 4.5] y = [2, 8, 14, 15, 8, 2] f1 = interp1d(x, y, kind='quadratic') f2 = interp1d(x, y, kind='cubic') # 生成密集的采样点,覆盖原始x的范围 x_new = np.linspace(min(x), max(x), 100) fig, axs = plt.subplots(4, figsize=(8, 10)) fig.suptitle('Splines Comparison') # 原始数据点 axs[0].plot(x, y, 'go') axs[0].set_title('Original Data') # 二次样条(用密集点绘制) axs[1].plot(x, y, 'go', x_new, f1(x_new),'m--') axs[1].set_title('Quadratic Spline') # 三次样条(用密集点绘制) axs[2].plot(x, y, 'go', x_new, f2(x_new), 'b-.') axs[2].set_title('Cubic Spline') # 对比图 axs[3].plot(x, y, 'go', x_new, f1(x_new), 'r-', x_new, f2(x_new), 'b-.') axs[3].legend(['data', 'quadratic', 'cubic'], loc='best') axs[3].set_title('Comparison') plt.tight_layout() plt.show()
效果说明
运行修正后的代码,就能清晰看到二次样条和三次样条在原始数据点之间的曲线形态差异——三次样条的平滑度更高,曲线过渡更自然。
内容的提问来源于stack exchange,提问作者Vivianne Miranda
相关产品推荐
相关产品推荐

