scipy 3-Python中的维度平滑样条

taor4pac  于 2023-05-07  发布在  Python
关注(0)|答案(1)|浏览(185)

我正在尝试创建一个适合我输入的点的三维样条曲线。我目前的解决方案创建了输入数据的最小二乘拟合,但我需要一个与我输入的每个数据点相交的样条。这是我现在的代码:

import numpy as np
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt
numpoints = 15
x = np.linspace(0, 10, numpoints)
y = np.cos(x)
z = x
tck, u = splprep([x, y, z], s=0.5)
new_points = splev(u, tck)
fig, ax = plt.subplots()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z, 'r.')
ax.plot(new_points[0], new_points[1], new_points[2], 'r-')
plt.show()

这导致该图:Current 3D spline graph
这里的样条图有点块状,不光滑,并且不相交于每个点。我不需要输出来近似输入函数,我只需要它是平滑的,并且与每个点相交。我还需要能够迭代样条的点。
这个解决方案是使用scipy.interpolate.splprep和splev,但是我正在寻找一个不同的函数库,可以完成我所寻找的。

hmae6n7t

hmae6n7t1#

也许是这个https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.make_interp_spline.html

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

numpoints = 15
x = np.linspace(0, 10, numpoints)
z = x
y = np.array([np.cos(x), z])

ax = plt.axes(projection='3d')
xx = np.linspace(0, 10, 100)
bspl = make_interp_spline(x, y, axis=1)
ax.plot3D(xx, *bspl(xx))
ax.scatter3D(x, *y, color='red')
plt.show()

相关问题