使用CubicSpline/interp1d三次插值得到直线,如何生成光滑曲线?
如何生成穿过整数坐标点的光滑曲线?
你遇到的问题不是插值方法无效,而是绘图时采样点太少——你用原x数组(间隔为1的整数点)计算并绘制插值结果,这些点刚好是样条曲线的分段端点,所以看起来是直线段。实际上CubicSpline和interp1d(kind='cubic')已经生成了光滑的三次样条曲线,只需要用更密集的x值采样就能呈现出光滑效果。
修改后的代码示例
import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import CubicSpline x = np.arange(34) y = [8,3,0,1,6,2,1,7,6,2,0,2,6,0,1,6,2,2,0,2,7,0,2,8,6,3,6,2,0,1,6,2,7,2] # 生成三次样条插值函数 f = CubicSpline(x, y) # 生成更密集的x采样点(比如从0到33取1000个点) x_new = np.linspace(x.min(), x.max(), 1000) plt.figure(figsize=(10,3)) plt.plot(x, y, 'o', label='原始点') # 绘制原始整数点 plt.plot(x_new, f(x_new), label='三次样条光滑曲线') # 用密集点绘制光滑曲线 plt.legend() plt.show()
用interp1d的实现方式
如果想用interp1d,同样只需要替换插值函数并使用密集采样点:
from scipy.interpolate import interp1d f_interp = interp1d(x, y, kind='cubic') plt.plot(x_new, f_interp(x_new), label='interp1d三次样条曲线')
这样修改后,就能得到穿过所有原始整数点的光滑曲线了。
内容的提问来源于stack exchange,提问作者yannis
相关产品推荐
相关产品推荐

