使用scipy.interpolate.splprep和splev将一端夹紧并使用另一端自由三次样条

时间:2017-11-03 06:30:33

标签: python numpy scipy interpolation

我有以下数据:

x_old = [  0.00000000e+00,  -5.96880765e-24,  -8.04361605e-23,
    -2.11167774e-22,  -2.30386081e-22,  -7.86854147e-23,
     1.17548440e-22,   1.93009272e-22,   1.49906866e-22,
     9.66877465e-23,   1.48495705e-23]
y_old = [ 0.        ,  0.03711505,  0.03780602,  0.02524459,  0.01349815,
    0.00964215,  0.00972842,  0.0168793 ,  0.02577024,  0.02761626,
    0.02141961]


z_old = [ 0.        ,  0.29834302,  0.59805918,  0.89773519,  1.19755092,
    1.49749325,  1.79750314,  2.09741402,  2.39727031,  2.69726787,
    2.99719479]

我想在这些点之间找到3-D样条线,以便初始坐标(0, 0, 0)保持固定(钳位),另一端为free

我做了:

 from scipy.interpolate import splprep, splev
 import numpy as np

 # find the knot points
 tckp,u = splprep([x_old,y_old,z_old],s=3.0,k=3,nest=-1)
 # evaluate spline.
 xnew,ynew,znew = splev(np.linspace(0,1,400),tckp)

图表:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

ax.plot(xnew, ynew, znew, label='first iteration')
plt.scatter(x_old, y_old, z_old, color='blue', label='given')
ax.legend()

plt.show()

问题1 。在上图中,初始点肯定不是固定的。在数学上,我知道我需要指定边界条件,以便得到我想要的3-D样条。我怎样才能在scipy中这样做?我可以在splprepsplev中使用任何可选参数来指定实现此目的,还是需要一种全新的方法来执行此操作?

问题2 :如果我想要两端都被钳制,那么我该如何实现呢?

某些数学:'在初始点处被钳位'意味着初始点处的一阶导数为零且“在终点处自由”意味着其中的二阶导数为零。

1 个答案:

答案 0 :(得分:1)

似乎您需要插值样条,这意味着平滑参数s应设置为0.

tckp, u = splprep([x_old,y_old,z_old], s=0.0, k=3, nest=-1)

可以使用make_interp_spline制作夹紧样条(或具有其他边界条件的样条曲线)。下面,参数l, r是左端和右端的边界条件。我在左端规定零一阶导数,在右边规定零二阶导数。

l, r = [(1, (0, 0, 0))], [(2, (0, 0, 0))]
clamped_spline = make_interp_spline(u, np.array([x_old, y_old, z_old]).T, bc_type=(l, r))
xnew2, ynew2, znew2 = clamped_spline(np.linspace(0,1,400)).T

请注意,我使用了第一个样条曲线中的参数u,期望它比随机线性间距数组更好。 (u是根据数据点计算的。)

绘制两者进行比较:

from mpl_toolkits.mplot3d import Axes3D as ax
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(xnew, ynew, znew, label='first iteration')
ax.plot(xnew2, ynew2, znew2, color='red', label='second iteration')
ax.scatter(x_old, y_old, z_old, color='blue', label='given')
ax.legend()
plt.show()

splines

夹紧条件显然在此附近有一些影响。