我们先聊聊为啥要搞这个东西。你想想我们最熟悉的坐标系,x轴、y轴、z轴,它们有什么特点?互相垂直,而且每个轴的单位长度都是1。这种又垂直、长度又为1的向量组合用起来最方便,计算简单,互不干扰。但现实世界里,我们拿到的一组向量通常都不是这样的,它们可能是歪歪扭扭、互相倾斜的。斯密特正交化,说白了,就是把一组歪歪扭扭的向量,变成一组互相垂直的向量。它就像一个整理工具,把一堆乱七八糟的木棍,重新摆放成互相垂直的结构。
这个过程的核心思想其实就一句话:挨个处理,每次拿出一个新向量,然后把它身上“不垂直”的成分都去掉。啥叫“不垂直”的成分?就是它在其他已经处理好的、垂直的向量上的投影。你把它在别人身上的影子都减掉,剩下的那部分,自然就跟别人垂直了。
我们一步一步来。假设你手里有三个线性无关的向量:v1, v2, v3。我们的目标是得到三个互相垂直的向量 u1, u2, u3。
第一步:处理第一个向量 v1
这一步最简单,简直是白送的。因为目前还没有其他向量需要它去垂直,所以它自己就是标准。我们直接把第一个正交基向量 u1 定义为 v1。
u1 = v1
没错,就这么简单。我们有了第一个“标准”向量,后面的向量都要向它看齐。
第二步:处理第二个向量 v2
现在我们要得到第二个正交向量 u2。u2 必须和 u1 垂直。怎么做到?我们看 v2。v2 这个向量,可以想象成两部分组成的:一部分是它沿着 u1 方向的分量,另一部分是它与 u1 垂直的分量。我们要的,就是那个垂直的分量。
所以,思路很简单:从 v2 中,减掉它在 u1 上的投影。剩下的就是我们要的 u2。
这个“投影”怎么算?线性代数里有个公式,向量 v2 在 u1 上的投影是:
proj_u1(v2) = ( (v2 · u1) / (u1 · u1) ) u1
这个公式看着吓人,但拆开看就那么几件事。
v2 · u1 是两个向量的点积,一个标量,它衡量了 v2 在 u1 方向上的“程度”。
u1 · u1 是 u1 自己和自己的点积,也就是 u1 长度的平方。
前面那一坨分数 (v2 · u1) / (u1 · u1) 最终只是一个数字,一个系数。它告诉我们,要沿着 u1 方向走多远,才能在“影子”的意义上代表 v2。
然后用这个数字去乘以向量 u1,就得到了那个投影向量。
现在我们有了投影,直接从 v2 里把它减掉:
u2 = v2 – proj_u1(v2)
u2 = v2 – ( (v2 · u1) / (u1 · u1) ) u1
这样得到的 u2,我敢保证,它一定和 u1 垂直。为什么?因为我们把 v2 身上所有“像”u1 的成分都剔除掉了,剩下的自然就跟 u1 没关系了,也就是垂直了。不信你可以算一下 u1 · u2,结果一定是0。
第三步:处理第三个向量 v3
现在我们手里有两个互相垂直的向量了:u1 和 u2。轮到 v3 了。
思路和第二步一模一样。我们要让新的向量 u3 同时与 u1 和 u2 垂直。怎么办?很简单,把 v3 身上“像”u1 的成分和“像”u2 的成分都减掉就行了。
也就是,我们要从 v3 中减去它在 u1 上的投影,再减去它在 u2 上的投影。
v3 在 u1 上的投影:proj_u1(v3) = ( (v3 · u1) / (u1 · u1) ) u1
v3 在 u2 上的投影:proj_u2(v3) = ( (v3 · u2) / (u2 · u2) ) u2
然后,把它们都从 v3 里拿走:
u3 = v3 – proj_u1(v3) – proj_u2(v3)
u3 = v3 – ( (v3 · u1) / (u1 · u1) ) u1 – ( (v3 · u2) / (u2 · u2) ) u2
这样得到的 u3,就同时和 u1、u2 垂直了。
这个过程可以一直进行下去。如果你有更多的向量 v4, v5, …,方法都是一样的:拿出新向量 vk,然后减去它在所有已经正交化的向量 u1, u2, …, u(k-1) 上的投影。
我们来上手算一个具体的例子,这样感觉更真实。
假设我们有三个三维向量:
v1 = (1, 1, 0)
v2 = (1, 2, 0)
v3 = (2, 2, 1)
这三个向量显然不是互相垂直的。我们来把它们正交化。
第一步:
u1 = v1 = (1, 1, 0)
搞定。
第二步:
我们需要计算 u2 = v2 – ( (v2 · u1) / (u1 · u1) ) u1
先算点积:
v2 · u1 = (1 1) + (2 1) + (0 0) = 3
u1 · u1 = (1 1) + (1 1) + (0 0) = 2
所以那个系数是 3 / 2。
现在代入公式:
u2 = (1, 2, 0) – (3/2) (1, 1, 0)
u2 = (1, 2, 0) – (3/2, 3/2, 0)
u2 = (1 – 3/2, 2 – 3/2, 0 – 0)
u2 = (-1/2, 1/2, 0)
我们可以验证一下 u1 和 u2 是不是垂直的:
u1 · u2 = (1 -1/2) + (1 1/2) + (0 0) = -1/2 + 1/2 + 0 = 0。
确实垂直。
第三步:
我们需要计算 u3 = v3 – ( (v3 · u1) / (u1 · u1) ) u1 – ( (v3 · u2) / (u2 · u2) ) u2
这个要算两个投影。
第一个投影(在 u1 上):
v3 · u1 = (2 1) + (2 1) + (1 0) = 4
u1 · u1 刚才算过了,是 2。
所以第一个系数是 4 / 2 = 2。
第一个投影向量是 2 u1 = 2 (1, 1, 0) = (2, 2, 0)。
第二个投影(在 u2 上):
v3 · u2 = (2 -1/2) + (2 1/2) + (1 0) = -1 + 1 + 0 = 0
这个结果是0,说明 v3 本身在 u2 方向上就没有分量,它已经和 u2 垂直了。这只是个巧合,但让计算变简单了。
u2 · u2 = (-1/2)^2 + (1/2)^2 + 0^2 = 1/4 + 1/4 = 1/2。
所以第二个系数是 0 / (1/2) = 0。
第二个投影向量是 0 u2 = (0, 0, 0)。
现在把它们从 v3 中减掉:
u3 = v3 – (2 u1) – (0 u2)
u3 = (2, 2, 1) – (2, 2, 0) – (0, 0, 0)
u3 = (0, 0, 1)
好了,我们得到了正交化后的一组向量:
u1 = (1, 1, 0)
u2 = (-1/2, 1/2, 0)
u3 = (0, 0, 1)
你可以自己验证一下,它们两两之间的点积都是0。
最后,还有一个可选步骤,叫“单位化”或“标准化”。我们得到的 u1, u2, u3 虽然互相垂直,但它们的长度不一定是1。比如 u1 的长度是 sqrt(1^2 + 1^2 + 0^2) = sqrt(2)。如果我们想得到像 x,y,z 轴那样长度为1的向量,只需要把每个向量除以它自己的长度就行了。
e1 = u1 / ||u1|| = (1, 1, 0) / sqrt(2) = (1/sqrt(2), 1/sqrt(2), 0)
e2 = u2 / ||u2|| = (-1/2, 1/2, 0) / sqrt(1/2) = (-1/sqrt(2), 1/sqrt(2), 0) // 这里有个计算技巧
e3 = u3 / ||u3|| = (0, 0, 1) / sqrt(1) = (0, 0, 1)
这组 e1, e2, e3 就是一个“标准正交基”。它既互相垂直,每个向量的长度又都是1。
有几个点需要注意。
第一,这个过程对初始向量的顺序很敏感。如果你把 v1 和 v2 的顺序换一下,最后得到的正交基会完全不同。虽然它们张成的空间是一样的,但基向量本身会变。
第二,如果在这个过程中,你算出来某个 u 是零向量,比如 u3 = (0, 0, 0)。这说明什么?说明你一开始给的向量 v1, v2, v3 是线性相关的。也就是说,v3 可以由 v1 和 v2 表示出来,它没有提供任何新的方向信息。这个过程也能帮你检测出向量组是不是线性相关的。

本站部分图片和内容来自网友上传和分享,版权归原作者所有,如有侵权,请联系删除!若转载,请注明出处:https://www.rzedutec.com/p/63245/