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

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

我做到了:

 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/

相关文章:

python - 如何优化 Python 中的黑盒函数?

python - 使用 Python 查找 3D 中周围数据点的距离和角度。寻找直线

Python tkinter 单选按钮不会更改变量

python - Numpy:如何将矩阵随机拆分/选择为 n 个不同的矩阵

python - 使用 Numpy 和 Pandas 替换数据框中的缺失值并更新旧值

python - 如何从 3D numpy meshgrid 中提取 2D 平面

Python:微调几个拟合函数

python - 这是 python pandas DataFrame 后排序绘图错误吗?

python - 使用 PyODBC 选择表中的列名

python - 在我将 2D 灰度 PIL 图像转换为 1D numpy 数组后,获得 2D numpy 数组(图像/矩阵)的最平滑方法是什么?