Python中的SciPy样条曲线插值
B样条曲线,是⼀种与线性插值⼀样常见的插值⽅法。 Python中可以使⽤scipy 的⽅法实现。
函数介绍
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
产⽣从start到stop的等差数列,num为元素个数,默认50个
interpolate.interp1d
linspace numpy其中,x和y参数是⼀系列已知的数据点,kind参数是插值类型,可以是字符串或整数
scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0, per=0, quiet=1)查⼀维曲线的B样条曲线表⽰。给定数据点集,确定区间上度k的平滑样条近似。
scipy.interpolate.splev(x,tck,der = 0,ext = 0)
其中,
x: 点数组,在该点处返回平滑样条或其导数的值。如果tck是从返回的splprep,则应该给出参数值u。
tck: 3元组或BSpline对象
der int,要计算的样条曲线的导数阶数(必须⼩于或等于k,即样条曲线的阶数)。
ext int,控制x不在结序列定义的间隔内的元素返回的值。
输出参数:
y ndarray或ndarray列表
表⽰样条函数的值的数组,在x的点处求值。如果tck是从返回的splprep,则这是代表ND空间中曲线的数组的列表。
⽰例代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import pylab as pl
from scipy import interpolate
def generate_data(begin, end, num):
""" 产⽣x点集 """
x = np.linspace(begin, end, num)
return x
def generate_sin(x):
""" 得到 sin 函数的x,对应的y点 """
y = np.sin(x)
return y
def interpolate_linear(x, y):
""" 线性插值"""
f_linear = interpolate.interp1d(x, y)
return f_linear
def interpolate_b_spline(x, y, x_new, der=0):
""" B 样条曲线插值或者导数. 默认der = 0"""
tck = interpolate.splrep(x, y)
y_bspline = interpolate.splev(x_new, tck, der=der)
return y_bspline
def test_interpolate():
begin =0
end =2* np.pi + np.pi /4
pt_x = generate_data(begin=begin, end=end, num=10)
pt_y = generate_sin(pt_x)
interpolate_x = generate_data(begin=begin, end=end, num=100)
f_linear = interpolate_linear(pt_x, pt_y)
y_bspline = interpolate_b_spline(pt_x, pt_y, interpolate_x, der=0)
y_bspine_derivative = interpolate_b_spline(pt_x, pt_y, interpolate_x, der=1)# ⼀阶导数
pl.plot(pt_x, pt_y,"o", label=u"origin data")
pl.plot(interpolate_x, f_linear(interpolate_x), label=u"linear")
pl.plot(interpolate_x, y_bspline, label=u"B-spline")
pl.plot(interpolate_x, y_bspine_derivative, label=u"B-spline-der")
pl.legend()
pl.show()
if __name__ =='__main__':
test_interpolate()
结果图,可以代码得到。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。