本文介绍了三维三次样条样条曲线的轨迹求取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试用三维三次样条线近似给定的路线(坐标)。示例数据:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
%matplotlib inline
x = np.array([1, 2, 2.3, 3, 4, 5, 5.5, 8, 9, 9.5])
y = np.arange(0, 10)
z = np.sin(x) * np.cos(y^2) + x
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.stem(x, y, z)
现在我使用RBF Interpolatorfrom Scipy来近似数据点。这是正确的方法吗?
from scipy.interpolate import RBFInterpolator
coord_data = np.stack([x, y], -1)
spline = RBFInterpolator(coord_data, z, kernel = 'cubic')
现在如何获得结果样条线(它所遵循的点)?我如何访问它的衍生产品?
推荐答案
您正在尝试近似一条路线,即3D中的曲线,而不是曲面。您尝试的方法会产生表面,因此不适合您的情况。
3D曲线的合适表示形式是参数形式的元组(x(u), y(u), z(u))
,其中u
是某个参数,每个坐标是u
的函数。
将曲线拟合问题归结为(ui, xi)
、(ui, yi)
和(ui, zi)
三个二维拟合问题(see also my answer here)。
因此,为了执行曲线拟合,您需要为每个输入点提供参数。
在样条拟合中,一种常见的参数化方法是chord-length parameterization。该参数化由有序的点之间的距离的累积长度来定义(...等)。
下面的代码使用弦长参数实现数据的样条线内插。
from scipy import interpolate
xyz = np.vstack([x, y, z]).T
u = np.cumsum(np.r_[[0], np.linalg.norm(np.diff(xyz, axis=0), axis=1)])
# u is the chord-legth parameterization for each xyz point
sx = interpolate.InterpolatedUnivariateSpline(u, x) # x(u) spline
sy = interpolate.InterpolatedUnivariateSpline(u, y) # y(u) spline
sz = interpolate.InterpolatedUnivariateSpline(u, z) # z(u) spline
下面的代码对生成的样条线进行采样,并在数据(黑色多段线)上绘制结果(蓝色)。结果如下所示:
uu = np.linspace(u[0], u[-1], 100)
xx = sx(uu)
yy = sy(uu)
zz = sz(uu)
plt.plot(xx, yy, zz, "b")
您还可以使用您建议的RBF
函数进行单变量内插。
以下代码是如何执行此操作的示例:
from scipy.interpolate import Rbf
rbfi_x = Rbf(u, x, function='cubic')
rbfi_y = Rbf(u, y, function='cubic')
rbfi_z = Rbf(u, z, function='cubic')
以类似于上面的样条线样本的方式对结果函数进行采样,并在上图中绘制结果,我们得到了下面的图。可以看出,样条法和RBF插值法相似,但不同(例如,在端点附近)。
这篇关于三维三次样条样条曲线的轨迹求取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!