使用scipy插值闭合曲线

soo*_*bus 8 python interpolation numpy curve-fitting scipy

我正在编写一个python脚本来插入一组给定的样条点.这些点由它们的[x, y]坐标定义.

我试着使用这段代码:

x = np.array([23, 24, 24, 25, 25])
y = np.array([13, 12, 13, 12, 13])
tck, u = scipy.interpolate.splprep([x,y], s=0)
unew = np.arange(0, 1.00, 0.005)
out = scipy.interpolate.splev(unew, tck) 
Run Code Online (Sandbox Code Playgroud)

这给了我这样一条曲线:

插值不好

但是,我需要有一个平滑的闭合曲线 - 在上面的图片上,其中一个点的衍生物显然是不一样的.我怎样才能做到这一点?

ali*_*i_m 12

您的闭合路径可以被视为参数曲线,x = f(u),y = g(u)其中u是沿曲线的距离,以区间[0,1]为界.您可以使用scipy.interpolate.splprepwith per=True将您的点xy点作为周期性处理,然后使用scipy.interpolate.splev以下方法评估拟合的样条线:

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

x = np.array([23, 24, 24, 25, 25])
y = np.array([13, 12, 13, 12, 13])

# append the starting x,y coordinates
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]

# fit splines to x=f(u) and y=g(u), treating both as periodic. also note that s=0
# is needed in order to force the spline fit to pass through all the input points.
tck, u = interpolate.splprep([x, y], s=0, per=True)

# evaluate the spline fits for 1000 evenly spaced distance values
xi, yi = interpolate.splev(np.linspace(0, 1, 1000), tck)

# plot the result
fig, ax = plt.subplots(1, 1)
ax.plot(x, y, 'or')
ax.plot(xi, yi, '-b')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述