接上一篇「曲线插值:大直若曲」。

时空

当我生活在一条多项式曲线 $P(t)$ 构造的空间里,要让我感受到这个空间是弯曲的,需要给我一个测量工具,让我能够测量这个空间里任意两个 $t$ 值 $t_a$ 与 $t_b$ 对应的两个点 $P_a$、$P_b$ 之间的距离,即 $d(P_a, P_b)$。为了便于描述,我给 $t$ 取了个名字,叫时间。

假设这个空间是平直的,我拿着始终朝一个方向前进,那么在任何一段时间 $\Delta t = t_b - t_a$ 里,我走过的距离应该是相等的。我将这种运动称为匀速直线运动。

我开始做这个实验,足迹几乎踏遍了整个世界。结果让我很吃惊,在相同的 $\Delta t$ 里,经常性地出现走过的距离不相等的情况。在你看来,这是个很简单的现象,因为随着曲线的弯曲,相同的 $\Delta t$ 对应的曲线弧长不尽相同,在曲率较大的区域,弧长会比平直区域增大很多。然而,这个现象却足以让我怀疑人生了。

如果我有你们的那个世界里的爱因斯坦的头脑,我一定会认为我的空间在膨胀或收缩,时间变快了或变慢了……然而在你看来,我所谓的时间变快或变慢,只是空间弯曲给我造成的一种错觉。

我一直以为自己是匀速运动,而在你看来,我时而加速,时而减速……否则你无法解释,为什么我在同样的 $\Delta t$ 里走过的长度不相等。在我看来,这其实是你的错觉,是我的时间变快或变慢给你造成了我的行走过程中存在着加速与减速。

看来,我们都要时不时地怀疑一下自己的人生了。

半圆

有一种曲线,叫做圆。从理论上说,我在这样的曲线里行走,感受应当与在一条直线里行走一样。

不过,在我看来,这个理论是无法成立的。如果是一个整圆,那么我在向一个方向行走的过程,可以通过是否能够回到起点来判断。如果是一个半圆,那么从理论上来说,我的确会误认为它是直线。然而,这种事不可能会发生,因为多项式曲线永远无法精确地表示圆。

现在假设二维空间中有三个点 $P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$。显然,这三个点位于单位圆上,确切的说是半个单位圆。假设这三个点对应的 $t$ 值分别为 -1、0、1,那么使用 Neville 算法对这三个点进行插值,结果得到的不是半圆,而是弧长比半圆要小一些的二次曲线——抛物线,如下图所示:

由于 POV-Ray 仅能渲染三维图形,因此为了绘制这条曲线,我在做曲线插值时,为这三个点进行了升维变换,即给它们增加了一个维度,将它们变成 $P_0 = (-1, 0, 0)$、$P_1 = (0, 1, 0)$、$P_2 = (1, 0, 0)$。

你认真思考了一下为什么我会走这样的路径,很快你会发现,是我走的太快了。当我以恒定的「光速」在二次的曲线空间中行走时,这就是我走出来的最短路径。怪我咯!走得太快也有错吗?

质量

你需要想出一种办法来限制我的速度,让我在某些控制点处的速度能够变得慢一些。然而,你有能力给我制造曲线空间,却没有能力控制我的速度。于是,你只能故伎重演,给我制造了一个新的曲线空间,让我在这个空间里以光的速度奔跑,而我在原曲线所在的空间里投下的影子则时而快时而慢地欢快奔跑。

新的曲线所在的空间,其维度必定大于二维(不要忘记,上文是在二维空间里讨论曲线插值问题)。这是因为,在二维空间里,过三个点有且仅有一条二次插值曲线,企图不增加空间维度,而在原空间中改变我的影子的速度,是徒劳的。

重新来看上述的三个点,$P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$,它们到原点的距离都是 1。这是因为它们的坐标要符合单位圆的定义,即 $x^2 + y^2 = 1$。然而这个定义只是描述了两个正交的一维平直空间的关系,而未能描述这分别位于两个空间中的点 x 与 y 的运动。要描述运动,需要时间。经过一番思索,你发现可以像下面这样给出单位圆定义的等价描述:

$$ \begin{aligned} x(t) & = \frac{2t}{1 + t^2} \\ y(t) & = \frac{1-t^2}{1 + t^2} \end{aligned} $$

这样,当 $t$ 发生变化时,两个一维点的运动轨迹,在二维空间里便「合成」了你所以为的半圆。

这时,你发现,这两个一维点的运动轨迹方程的右侧的分式,分母是相同的,都是 $1+t^2$。如果移走这个分母,那么剩下的分子便形成了单项式与多项式——这是我们都喜欢的。

移走分母的办法很简单,方程两边都乘以分母,结果就得到了

$$ \begin{aligned} (1 + t^2)x(t) & = 2t \\ (1 + t^2)y(t) & = 1-t^2 \\ \end{aligned} $$

但是左边绑着这么一个东西也不是事,干脆就把它割下来,作为 $z(t)$,于是就得到了

$$ \begin{aligned} x(t) & = 2t \\ y(t) & = 1-t^2 \\ z(t) & = 1 + t^2 \end{aligned} $$

你发现,这样做不仅成功地将二维点变成了三维点,而且只要将 $x(t)$ 与 $y(t)$ 分别除以 $z(t)$,就可以重新得到原来的 $x(t)$ 与 $y(t)$,类似于将一个三维点投影到了二维空间,而且恰好落在半圆上。

你发现,这样做不仅成功地将二维点变成了三维点,而且只要将 $x(t)$ 与 $y(t)$ 分别除以 $z(t)$,就可以重新得到原来的 $x(t)$ 与 $y(t)$,类似于将一个三维点投影到了二维空间,而且恰好落在半圆上。

你对我说,这样做是不是很神奇?我无语,因为在我看来,一切都没变,它们都是单项式或多项式曲线。你觉得这就是神奇之处,一些看上去使用多项式无法精确表示的曲线,却可以在一个维度更高的空间里形成一条多项式曲线。

你用上述手法,分别用 -1、0、1 作为 $P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$ 对应的 $t$ 值,便可以将着三个点变换为三维空间中的点,即 $P'_0 = (-2, 0, 2)$、$P'_1 = (0, 1, 1)$、$P'_2 = (2, 0, 2)$。

现在,假设你只是生活在二维空间中的生物,第三个维度对你而言,只是你想象出来的一个维度,它在你的世界里没有任何物理意义,也就是说,这个 $z(t)$ 的量纲与 $x(t)$ 和 $x(t)$ 毫无关系,而它又好像是你的这个世界里一个固有属性。于是,你给它取了个名字,叫做质量,用符号 $m$ 来表示它,又将带质量的点称为质点,用 $(x, y, m)$ 来表示。

每个维度的人都有着在更高维度空间里的人看来很可笑的思维局限。

现在,你决定先不考虑质量的本质究竟是什么这个问题了,你想尝试的是,对 $t$ 直分别为 -1、0、1 的 $P'_0 = (-2, 0, 2)$、$P'_1 = (0, 1, 1)$、$P'_2 = (2, 0, 2)$ 使用 Neville 算法进行 2 次多项式曲线插值,结果可以得到

将上述曲线投影到二维空间——曲线上所有点的各维坐标除以质量(第三维坐标),就可以得到半圆:

实际上得到的是位于 z = 1 平面上的半圆。因为 $(x, y, m)$ 的各维坐标除以质量,得到的是 $(\frac{x}{m}, \frac{y}{m}, 1)$,也就是质量为 1 的点。

很魔性,对吧?

三个空间

想不想知道这两条曲线的关系?看下面这张图:

上面那条曲线,便是三维空间中的一条抛物线,下面那条曲线便是那条抛物线在 $z = 1$ 平面上的投影——半圆。最下面的那个点是原点 $O(0,0,0)$。蓝色的线是投影线。这实际上便是所谓的投射投影,原点为灭点。但是,你们的世界里,有一些人给它起了个更令人敬畏的名字,即奇点,并认为你们的整个宇宙是从这个点爆炸出来的,而且这个爆炸的过程还在继续……更可怕的是,你们认为这个点的质量无限大。

像圆、椭圆、双曲线之类的曲线被称为有理曲线——不是因为它们很有理,而是讲究理性的古人发现了它们。要用多项式曲线精确表示有理曲线,我们需要构造三个空间。多项式曲线所在的空间叫做仿射空间。有质点的那个空间叫格拉斯曼空间。有理曲线所在的空间叫射影空间。

关于这三个空间的关系,以后有时间我会再写一篇文章。

如果觉得我的文章对你有用,请随意赞赏

载入中...
garfileo garfileo

4.8k 声望

发布于专栏

while(1) { }

只关心 C 与 Lisp/Scheme 程序的基本形状,其他的事关心不过来。

147 人关注