gpt4 book ai didi

python - 使用 scipy.interpolate.splprep 和 splev 一端夹紧,另一端自由三次样条

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:03 24 4
gpt4 key购买 nike

我有以下数据:

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)保持固定(夹紧),另一端自由

我做到了:

 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:如果我希望两端都被夹紧,那么我该如何实现呢?

一些数学:“在初始点钳位”意味着初始点的一阶导数为零,“在终点自由”意味着那里的二阶导数为零。

最佳答案

看来你想要一个插值样条线,这意味着平滑参数 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

夹紧条件显然对该端附近有一些影响。

关于python - 使用 scipy.interpolate.splprep 和 splev 一端夹紧,另一端自由三次样条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47089749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com