三维三次样条样条曲线的轨迹求取 [英] Get Trajectory of Three Dimensional Cubic Spline Scipy

查看:76
本文介绍了三维三次样条样条曲线的轨迹求取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用三维三次样条线近似给定的路线(坐标)。示例数据:

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插值法相似,但不同(例如,在端点附近)。

这篇关于三维三次样条样条曲线的轨迹求取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆