直线的 3 维插值

3-dimensional interpolation of a line

我有一个问题,我需要做一个样条曲线 - 找到一个可以平滑地插入一组 3D 点 (y,x,z) 的函数。比方说,有一组 20 个点,每个点都在 R3 中,所以:

P1(10, 10, 10)
P2(11, 12, 14)
P3(12, 17, 11)
P4(13, 14, 20)
...
P20(29, 32, 43)

我想绘制一条包含这些点的平滑线并找到新的点,这些点位于其上并具有给定的 y 值(例如 P21(10.5, x, z))。这个问题对我来说在 2D 中非常明显,因为我可以使用例如拉格朗日插值。但无法真正找到 3D 线的解决方案。我的第一个猜测是对每个表面进行单独的拉格朗日插值,因此:

//Lagrange for y, x surface
x=Lx(y)
//Lagrange for y, z surface
z=Lz(y)
//Finding point having y given
Pa(10, Lx(10), Lz(10))

这样合适吗?我将非常感谢在 3D 中找到插值函数的任何解决方案。任何更大维度的解决方案也会对我有所帮助。

感谢您的宝贵时间。

当你说一条线时,我假设你指的是一条曲线(不一定是一条直线)。从问题中对拉格朗日插值的引用我了解到,对于您的需要,多项式插值就足够了(即使它可能导致 Runge's phenomenon)。

3D 曲线的一种方便的表示形式是参数形式(例如参见 [​​=34=])作为元组 (X(s), Y(s), Z(s)),其中 s 是一些参数,每个坐标是s(您的情况是多项式函数)。给每个输入点一个参数si,曲线拟合问题就简化为三个二维问题分别拟合(si, Xi)(si, Yi)(si, Zi)

但是,要使其正常工作,您需要对输入点进行适当的参数化 si。在问题中,您建议 Yi 可以作为这样的参数化。如果 Yi 确实是一个合适的参数化,那么你很幸运,你的工作就完成了。您有函数 X(y), Z(y)Lx(y)Lz(y) 在您的问题中)并且可以在任何 y 值下评估它们。

然而,在许多情况下,y 不是 3D 的合适参数化。特别是,如果 (Yi, Xi) 值或 (Yi, Zi) 值在 Yi 中不是单调的,那么它不能用作参数化。

既然你有点的排序,你可以使用统一的参数化(s0=0, s1=1,...等),这肯定是单调的。样条拟合中常见的优选方法是 chord-length 参数化。这里的参数化由有序点之间的距离的累积长度定义(s0=0, s1=|p1-p0|, s2 = s1+|p2-p1|...等)。 这种参数化可能会给你一个更好的契合度。 这些参数化也扩展到更高维度的曲线。

参数曲线的一般困难在于,虽然它们使您能够沿曲线密集地采样点,但在曲线上找到对应于给定 y0 值的点需要一个反问题。在您的情况下,它需要找到 Y(s)=y0 的根,然后将根 s 插入 X(s)Z(s)。 然而,这无法避免,因为例如可能有多个点对应于给定的 y 值。 可以使用bisection method or Newton-Raphson等求根方法来解决

最后一点,您可能更喜欢使用 B 样条插值(即分段多项式),它比高阶多项式插值具有一些更可取的特性(参见 here 或任何 B 样条教科书例如“The NURBs Book”)。 Python 的 scipy 库也有用于样条拟合的函数(例如参见这个 SO answer)。