直线的 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)。
我有一个问题,我需要做一个样条曲线 - 找到一个可以平滑地插入一组 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)。