向量微积分:理解叉积(Cross Product)

取两个向量,我们可以写出它们在网格中所有分量的组合:

cross product interaction grid

这个完整的网格就是 外积,可以分解为:

  • 点积(Dot product),即相似维度之间的相互作用(x*x, y*y, z*z)

  • 叉积(Cross product),即不同维度之间的相互作用(x*y,y*z, z*x等)

这个 点积(dot product) ($\vec{a} \cdot \vec{b}$) 衡量相似性,因为它只累积匹配维度的相互作用。这是一个简单的计算,涉及3个分量。

叉积(写作 $\vec{a} \times \vec{b}$)需要衡量半打“交叉相互作用”。计算看起来复杂,但概念很简单:将6个单独的差异累加起来得到总差异。

不要想“什么时候需要叉积?”,而要想“什么时候需要不同维度之间的相互作用?”。

例如,面积是由指向不同方向的向量形成的(正交性越好,面积越大)。实际上,叉积衡量的是两个三维向量所张成的面积(来源):

(“叉积”假设三维向量,但可以 该概念扩展(the concept extends) 推广到更高维度。)

关键直觉有头绪了吗?让我们深入细节。

定义叉积(Defining the Cross Product)

这个 点积(dot product) 表示向量之间的相似性,用一个数字表示:

\displaystyle{\text{dot product} = (a_x, a_y, a_z) \cdot (b_x, b_y, b_z) = a_x b_x + a_y b_y + a_z b_z = \|\vec{a}\| \|\vec{b}\| \cos(\theta)}

例如,我们可以说北和东有0%的相似性,因为 $(0, 1) \cdot (1, 0) = 0$。或者北和东北有70%的相似性($\cos(45) = .707$,记住 三角函数是百分比(trig functions are percentages).) 相似度显示了一个向量在另一个向量中"出现"的量。

叉积(向量之间的差异)也应该是一个单一数值吗?

让我们试试。正弦值就是百分比差异,所以我们可以写成:

\displaystyle{\text{cross product candidate} = \text{amount of difference} = \|\vec{a}\| \|\vec{b}\| \sin(\theta)}

不幸的是,我们缺少一些细节。假设我们沿 x 轴方向看:y 和 z 都 100% 背离我们。像“100%”这样的数值告诉我们存在很大的差异,但我们不知道它是什么!我们需要额外的信息来告诉我们“$\vec{x}$ 和 $\vec{y}$ 之间的差异是 这个” 以及 “$\vec{x}$ 和 $\vec{z}$ 之间的差异是 那个“.

因此,让我们将叉积表示为一个向量:

  • 这个 大小 叉积的大小是数值上的“差异量”(以 $\sin(\theta)$ 作为百分比)。它本身无法区分 $\vec{x} \times \vec{y}$ 和 $\vec{x} \times \vec{z}$。

  • 这个 方向 叉积的方向基于两个输入:它是同时垂直于两者的方向(即不偏袒任何一方)。

现在 $\vec{x} \times \vec{y}$ 和 $\vec{x} \times \vec{z}$ 有不同的结果,每个结果的大小都表明它们与 $\vec{x}$ 有“100%”的差异。

(点积也应该是一个向量结果吗?嗯,我们是在追踪 $\vec{a}$ 和 $\vec{b}$ 之间的相似度。相似度衡量的是原始向量方向之间的重叠,我们已经有了这些方向。)

几何解释(Geometric Interpretation)

两个向量确定一个平面,叉积指向与两者都不同的方向(来源):

cross product vector diagram

问题在于:有两个垂直方向。按照惯例,我们采用“右手系”(来源):

cross product right hand rule

如果你像图中所示那样伸出前两根手指,你的拇指将指向叉积的方向。我通过将食指从 $\vec{a}$ 扫向 $\vec{b}$ 来确保方向正确。方向确定后,叉积的大小为 $|a| |b| \sin(\theta)$,它与每个向量的大小以及“差异百分比”(正弦值)成正比。

正交向量的叉积(The Cross Product For Orthogonal Vectors)

要记住右手定则,将 xyz 顺序写两次: xyzxyz。接下来,找到你想要的模式:

  • xy => z (x 叉积 yz)
  • yz => x (y 叉积 zx;我们绕了一圈: yzx)
  • zx => y

现在, xyyx 具有相反的符号,因为它们在我们的 xyzxyz 设定中分别向前和向后。

所以,即使没有公式,你也应该能够计算出:

\displaystyle{\vec{x} \times \vec{y} = (1, 0, 0) \times (0, 1, 0) = (0, 0, 1) = \vec{z}}

同样,这是因为 x 叉积 y 是正的 z 在右手坐标系中。我使用了单位向量(Unit Vector),但我们可以缩放各项:

\displaystyle{(3, 0, 0) \times (0, 4, 0) = (0, 0, 12)}

计算叉积(Calculating The Cross Product)

单个向量可以分解为其3个正交分量:

\displaystyle{ \vec{a} = (a_x, a_y, a_z) = (a_x, 0, 0)  + (0, a_y, 0) + (0, 0, a_z)}

\displaystyle{ \vec{b} = (b_x, b_y, b_z) = (b_x, 0, 0)  + (0, b_y, 0) + (0, 0, b_z)}

当向量作叉积时,每对正交分量(如 $a_x \times b_y$)都会投票决定正交向量的指向。6个分量,6票,它们的总和就是叉积(Cross Product)。(类似于 梯度(gradient),其中每个轴投票选出增长最快的方向。)

  • xy => zyx => -z (假设 $\vec{a}$ 是第一个,因此 xy 表示 $a_x b_y$)
  • yz => xzy => -x
  • zx => yxz => -y

xyyx 竞争在 z 方向。如果这些项相等,例如在 $(2, 1, 0) \times (2, 1, 1)$ 中,则叉积分量在 z 方向(2 – 2 = 0)。

最终组合为:

\displaystyle{(a_x, a_y, a_z) \times (b_x, b_y, b_z) = (a_y b_z - a_z b_y, a_z b_x - a_x b_z, a_x b_y - a_y b_x) = \|a\| \|b\| \sin(\theta) \vec{n}}

其中 $\vec{n}$ 是垂直于 $\vec{a}$ 和 $\vec{b}$ 的单位向量。

别被这个吓到:

  • 有6项,3正3负
  • 两个维度决定第三个(所以 z 项必须只包含 yx 分量)
  • 正负顺序基于 xyzxyz 模式

如果你喜欢,有一个 代数证明(algebraic proof),该公式既是正交的,大小又为 $|a| |b| \sin(\theta)$,但我更喜欢“比例投票”的直觉。

示例时间(Example Time)

同样,我们应该在心中进行简单的叉积计算:

\displaystyle{(1, 0, 0) \times (0, 1, 0) = (0, 0, 1)}

为什么?我们交叉了 xy 轴,得到 z (或使用单位向量,$\vec{i} \times \vec{j} = \vec{k}$)。反向交叉则得到 $-\vec{k}$。

以下是我如何处理更复杂示例的方法:

\displaystyle{(1, 2, 3) \times (4, 5, 6) = ?}

  • 让我们来处理最后一项,即 z 分量。它是 (1)(5) 减去 (4)(2),即 5 – 8 = -3。我之所以先做 z 是因为它用到了 xy前两项。当你从第一个向量扫描到第二个向量时,试着把 (1)(5) 看作“正向”,而把 (4)(2) 看作从第二个向量到第一个向量的“反向”。
  • 现在来看 y 分量:(3)(4) – (6)(1) = 12 – 6 = 6
  • 现在来看 x 分量:(2)(6) – (5)(3) = 12 – 15 = -3

所以,总和是 $(-3, 6, -3)$,我们可以 验证(verify) 使用 Wolfram Alpha。

(1, 2, 3) cross product (4, 5, 6) example

简而言之:

  • 叉积(Cross Product)追踪了维度之间的所有“交叉交互”
  • 共有 6 种交互(每个维度 2 种),其符号取决于 xyzxyz 顺序

附录(Appendix)

与行列式的联系

你可以用这个矩阵的行列式来计算叉积:

\mathbf{u\times v}=\begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k}\\
u_1 & u_2 & u_3\\
v_1 & v_2 & v_3\\
\end{vmatrix}

 \mathbf{u\times v}=
\begin{vmatrix}
u_2 & u_3\\
v_2 & v_3
\end{vmatrix}\mathbf{i}
-\begin{vmatrix}
u_1 & u_3\\
v_1 & v_3
\end{vmatrix}\mathbf{j}
+\begin{vmatrix}
u_1 & u_2\\
v_1 & v_2
\end{vmatrix}\mathbf{k}

这里有一个巧妙的联系,因为行列式(“有符号面积/体积”)追踪了来自正交分量的贡献。

存在 理论原因(theoretical reasons) 为什么叉积(作为一个正交向量)只在0、1、3或7维中可用。然而,叉积作为一个单一数字本质上就是行列式(标量形式的有符号面积、体积或超体积)。

与旋度的联系

旋度(Curl) 衡量向量场施加在一点上的扭转力,并用垂直于表面的向量来度量。每当你听到“垂直向量”时,就想到“叉积”。

我们取这个矩阵的“行列式”:

\begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \\  \\
{\frac{\partial}{\partial x}} & {\frac{\partial}{\partial y}} & {\frac{\partial}{\partial z}} \\
 \\  F_x & F_y & F_z \end{vmatrix}

\displaystyle{\nabla \times \vec{F} = \left(\frac{\partial F_z}{\partial y}  - \frac{\partial F_y}{\partial z}\right) \vec{i} + \left(\frac{\partial F_x}{\partial z} - \frac{\partial F_z}{\partial x}\right) \vec{j} + \left(\frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y}\right) \vec{k}}

不是乘法,交互是取偏导数。和之前一样,旋度的$\vec{i}$分量基于$\vec{j}$和$\vec{k}$方向上的向量和导数。

与勾股定理的关系

叉积和点积就像三角形的正交边:

\displaystyle{a^2 + b^2 = c^2 }

对于单位向量,其中$|a| = |b| = 1 $,我们有:

\displaystyle{ \|\text{dot product}\|^2 + \|\text{cross product}\|^2 = \cos^2 + \sin^2 = 1}

我在网格图中有点作弊,因为我们必须跟踪平方量级(如勾股定理中所做的那样)。

高等数学

叉积及其相关概念在 克利福德代数(Clifford Algebra)几何代数(Geometric Algebra)中得到扩展。我仍在学习这些。

叉积的叉积

有时你会遇到这样的情况:

\displaystyle{\vec{a} \times \vec{b} \times \vec{c} = ? }

首先,叉积 不可结合(isn't associative):顺序很重要。

接下来,记住叉积的作用:寻找正交向量。如果任意两个分量平行($\vec{a}$平行于$\vec{b}$),则没有维度相互推挤,叉积为零(这延伸到$0 \times \vec{c}$)。

但是$\vec{a}$和$\vec{c}$平行是可以的,因为它们从未直接参与叉积,例如:

\displaystyle{\vec{i} \times \vec{j} \times \vec{i} = \vec{k} \times \vec{i} = \vec{j} }

哇!我们怎么回到了$\vec{j}$?我们要求一个同时垂直于$\vec{i}$和$\vec{j}$的方向,然后又让这个方向垂直于$\vec{i}$。“双重垂直”意味着你回到了原来的轴上。

叉积的点积

现在如果我们取

\displaystyle{\vec{a} \times \vec{b} \cdot \vec{c} = ? }

会发生什么?我们必须先计算 $\vec{a} \times \vec{b}$,因为 $\vec{b} \cdot \vec{c}$ 返回一个标量(单个数字),不能用于叉积。

如果 $\vec{a}$ 和 $\vec{c}$ 平行,会发生什么?嗯,$\vec{a} \times \vec{b}$ 垂直于 $\vec{a}$,也就是说它垂直于 $\vec{c}$,所以与 $\vec{c}$ 的点积为零。

我从未真正记住这些规则,我必须思考它们的相互作用。

其他坐标系

Unity 游戏引擎是 左撇子(left-handed),OpenGL(以及大多数数学/物理工具)是右手系的。为什么?

在计算机游戏中, x 是水平的, y 是垂直的,而 z 指向“屏幕内部”。这导致了一个左手系。(试试看:用你的右手,你可以看到 x 叉积 y 应该指向屏幕外部)。

叉积的应用

  • 找出垂直于两个给定向量的方向。
  • 找出两个向量所张成的有符号面积。
  • 判断两个向量是否正交(不过检查点积是否为 0 可能更快)。
  • “乘以”两个向量,仅当垂直交叉项有贡献时(例如计算扭矩)。
  • 使用四元数(4 维复数)时,叉积实现了一个向量绕另一个向量的旋转(另一篇文章正在撰写中!)。

数学愉快。

本系列其他文章

  1. 向量微积分:理解点积(Dot Product)
  2. 向量微积分:理解叉积(Cross Product)
  3. 向量微积分:理解通量(Flux)
  4. 向量微积分:理解散度(Divergence)
  5. 向量微积分:理解环流与旋度(Circulation and Curl)
  6. 向量微积分:理解梯度(Gradient)
  7. 理解毕达哥拉斯距离与梯度(Gradient)

加入 45 万月度读者

喜欢这篇文章?还有更多内容能帮你建立持久、直观的数学理解。加入通讯以获取额外内容和最新更新。