>>> from env_helper import info; info()
页面更新时间: 2023-06-24 12:31:24
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-9-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.4. B-Spline样条曲线

interpolate库提供了许多对数据进行插值运算的函数。下面是使用直线和B-Spline对正弦波上的点进 行插值的例子。

>>> import numpy as np
>>> import pylab as pl
>>> from matplotlib import font_manager
>>>
>>> font_manager.fontManager.addfont('/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')
>>> font_manager.fontManager.addfont('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc')
>>> from scipy import interpolate
>>>
>>> x = np.linspace(0, 2*np.pi+np.pi/4, 10)
>>> y = np.sin(x)
>>>
>>> x_new = np.linspace(0, 2*np.pi+np.pi/4, 100)
>>> f_linear = interpolate.interp1d(x, y)
>>> tck = interpolate.splrep(x, y)
>>> y_bspline = interpolate.splev(x_new, tck)
>>> pl.rcParams['font.sans-serif'] = 'WenQuanYi Zen Hei'
>>>
>>> pl.plot(x, y, "o",label=u"原始数据")
>>> pl.plot(x_new, f_linear(x_new), label=u"线性插值")
>>> pl.plot(x_new, y_bspline, label=u"B-spline插值")
>>> pl.legend()
>>> pl.show()
/usr/lib/python3/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 8722 (N{MINUS SIGN}) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)
_images/sec04_bspline_3_1.png

上图为使用interpolate库对正弦波数据进行线性插值和B-Spline插值的结果。

在这段程序中,通过interp1d函数直接得到一个新的线性插值函数。而B-Spline插值运算需要先使用 splrep函数计算出B-Spline曲线的参数,然后将参数传递给splev函数计算出各个取样点的插值结果。