我有以下数据:
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
中这样做?我可以在splprep
和splev
中使用任何可选参数来指定实现此目的,还是需要一种全新的方法来执行此操作?
问题2 :如果我想要两端都被钳制,那么我该如何实现呢?
某些数学:'在初始点处被钳位'意味着初始点处的一阶导数为零且“在终点处自由”意味着其中的二阶导数为零。
答案 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()
夹紧条件显然在此附近有一些影响。