![程序员数学:用Python学透线性代数和微积分](https://wfqqreader-1252317822.image.myqcloud.com/cover/548/42617548/b_42617548.jpg)
3.4 向量积:测量定向区域
如前所述,向量积以两个三维向量和
作为输入,其输出
是另一个三维向量。它与点积的相似之处在于,输入向量的长度和相对方向决定了输出;但不同之处在于,它的输出不仅有大小,还有方向。我们需要仔细思考三维空间中方向的概念,以理解向量积的作用。
3.4.1 在三维空间中确定自己的朝向
在本章开头介绍轴、
轴和
轴时,我提出了两点:第一,我承诺常见的
平面存在于三维世界中;第二,我设定了垂直于
平面的
方向,且
平面在
的地方。我没有明确指出的是,
轴的正方向是向上的而不是向下的。
换句话说,如果我们从通常的角度来看平面,可以看到
轴正半轴从平面上向我们延伸。另一种选择是让
轴正半轴远离我们(见图3-34)。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/341.jpg?sign=1738817265-L2KY1d5AxeAy3BtlT0P8ZdnQcgIPZmXO-0-51bd0baf9b27b3b4faf48324d9a13185)
图3-34 像在第2章中那样,在三维空间中定位自己以观察平面。当观察
平面时,我们选择正
轴指向我们,而不是远离我们
这里的区别并不是角度的问题。这两种选择代表了三维空间的不同方向,从任何角度看都是可以区分的。假设我们漂浮在轴的某个正坐标上,比如图3-34中的上图。可以看到
轴的正方向是从
轴的正方向逆时针旋转了1/4圈;否则,轴的朝向就是错误的。
现实世界中的很多事物都有方向性,与它们的镜像看起来并不完全相同。例如,鞋的左右脚大小和形状相同,但方向不同。普通的咖啡杯没有方向,没有标记的咖啡杯是没法通过照片来区分的。但如图3-35所示,如果两个咖啡杯在相反的两面上有相同的图案,是可以区分的。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/342.jpg?sign=1738817265-hbAYYCJ62GbpQgynmWUtdUJtoA5DUSC1-0-be0ec142a86f834a658cdc5a3e2b10da)
图3-35 没有图案的杯子与其镜像是同一对象,一面有图案的杯子则与其镜像不同
大多数数学家用手作为检测方向的现成工具。我们的手是定向的,所以即使右手或左手不幸脱离身体,我们也能分辨出它们。你能分辨出图3-36中的手是右手还是左手吗?
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/343.jpg?sign=1738817265-AM4jayoSfmeghusjZcZaRUctmm8OEpW0-0-6c6e42d3ddda30c2a49ed0aef313c5be)
图3-36 这是右手还是左手
很明显,这是右手:如果是左手,指尖上不可能有指甲!数学家可以用手来区分坐标轴的两种可能方向,称为右手方向和左手方向。右手方向的规则如图3-37所示:如果右手食指指向轴正方向,中指、无名指和小指向
轴正方向弯曲,那么你的拇指就会指明
轴的正方向。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/344.jpg?sign=1738817265-Pmg0mbzqfu2IeCSc1niVEyllYLHDLa9P-0-57802afb98c3672d7cd1030fa4151618)
图3-37 右手规则帮助我们记住选择的方向
这就是右手规则,如果它与你的坐标轴一致,那么你就(正确地)使用了右手方向。方向很重要!如果你正在实现程序来控制无人机或腹腔镜手术机器人,就需要保持上、下、左、右、前、后是一致的。向量积作为定向机器,可以帮助我们在所有的计算中跟踪方向。
3.4.2 找到向量积的方向
在告诉你如何计算向量积之前,我想向你展示它的样子。已知两个输入向量,向量积的结果垂直于这两个向量。例如,如果,
,那么向量积
恰好是(0, 0, 1),如图3-38所示。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/347.jpg?sign=1738817265-11JxGJQBjqjxpCJ8LLNSW2lUt8Pg9QcG-0-f1e973741959879b39334289c94de68f)
图3-38 和
的向量积
事实上,如图3-39所示,平面内任意两个向量的向量积都位于
轴上。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/348.jpg?sign=1738817265-EJbydjqyFnY8bgrhEwUQczxG6DKhjnjS-0-d2573ceb0daee2bf9602958aeb1802bd)
图3-39 平面内任意两个向量的向量积都位于
轴上
这清楚地说明了为什么向量积在二维中不起作用:它返回的向量位于包含两个输入向量的平面之外。我们可以看到,向量积的输出总是垂直于两个输入,即使输入并不在平面内也是一样(见图3-40)。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/349.jpg?sign=1738817265-9hFiwosMZ6E3c5Ajcm80aRpAAjJpLtTJ-0-2769672ca17f6e322f6c71c7fb79e35b)
图3-40 向量积总是返回垂直于两个输入的向量
但是有两个可能的垂直方向,向量积只能在其中之一上。例如,(1, 0, 0) × (0, 1, 0)的结果正好是(0, 0, 1),指向轴正方向。
轴上的任何向量,不管是正还是负,都垂直于这两个输入。为什么结果会指向正方向?
这就是方向的作用:向量积也遵循右手规则。一旦你找到了垂直于两个输入向量和
的方向,向量积
的方向就将三个向量
、
和
置于了右手系中。也就是说,我们可以将右手食指指向
的方向,将三指弯向
,拇指指向的就是
的方向(见图3-41)。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/350.jpg?sign=1738817265-zdO3P8ms4u4Yd9Ryh5ODPSuY5ZVZ7DlN-0-78276b56c4ace7d70c151a38646cec44)
图3-41 右手规则告诉我们向量积指向哪个垂直方向
当输入向量位于两个坐标轴上时,不难找到它们的向量积指向的确切方向:它指向剩余坐标轴的一个方向。一般来说,如果不计算它们的向量积,就很难描述垂直于两个向量的方向。我们一旦知道如何计算它,就掌握了一个非常有用的特征。但是向量并不仅仅指定方向,还指定了长度。向量积的长度也蕴含有用的信息。
3.4.3 求向量积的长度
和点积一样,向量积的长度也是一个数,它提供了关于输入向量的相对位置的信息。它测量的并不是两个向量的对齐程度,而更像是“它们的垂直程度”。更准确地说,它告诉我们两个输入之间的面积有多大(见图3-42)。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/351.jpg?sign=1738817265-pK7Ynwh4d5HDfoMOwvHXfaKwnajorLDp-0-414664129fdb3467ae4bf6bb49eb9580)
图3-42 向量积的长度等于一个平行四边形的面积
如图3-42所示,以和
为边的平行四边形的面积等于向量积
的长度。对于给定长度的两个向量,在它们垂直时张成的面积最大。如果
和
在同一方向上,则张不成任何面积,向量积的长度为零。这是显而易见的:如果两个输入向量平行,则不存在唯一的垂直方向。
与结果的方向搭配,结果的长度能给我们一个精确的向量。平面上的两个向量保证有指向轴正方向或负方向的向量积。从图3-43中可以看到,平面向量张成的平行四边形越大,向量积越长。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/352.jpg?sign=1738817265-3WUYXPDTIFZLvlYvMJDqcCjSe7eLEkn5-0-7871cb6e084993006bbe6760318e9956)
图3-43 根据张成的平行四边形的面积,平面上的向量对具有不同大小的向量积
平行四边形的面积有一个三角公式:如果和
的夹角为
,面积就是
。我们可以结合长度和方向来求一些简单的向量积。例如,(0, 2, 0)和(0, 0, -2)的向量积是多少?这两个向量分别位于
轴和
轴上,所以要想与它们垂直,向量积必须位于
轴上。我们用右手定则来求出结果的方向。
用食指指向第一个向量的方向(轴正方向),再把三根手指弯向第二个向量的方向(
轴负方向),我们发现大拇指指向
轴负方向。向量积的大小是
,因为
轴和
轴相交成90°角。(在这种情况下,平行四边形恰好是一个边长为2的正方形。)求得向量积的大小是4,所以结果是(-4, 0, 0):在
轴负方向上长度为4的向量。
看起来,通过几何方法计算向量积是一种有良好定义的运算,但是这并不实用。一般来说,当向量并不总在坐标轴上时,要找到垂直结果所需的坐标并不容易。幸运的是,有一个明确的公式可以用输入坐标来计算向量积的坐标。
3.4.4 计算三维向量的向量积
向量积的公式乍一看很复杂,但我们可以用Python函数快速把它包装起来,然后毫不费力地进行计算。首先从和
的坐标开始。虽然可以将其坐标设置成
和
,但是使用更好的符号会更清楚:
和
。比起用
这样的任意字母来称呼它,记住
是
的
坐标更加容易。根据这些坐标,向量积的公式为:
如果使用Python,则如下所示。
def cross(u, v):
ux,uy,uz = u
vx,vy,vz = v
return (uy*vz - uz*vy, uz*vx - ux*vz, ux*vy - uy*vx)
你可以在练习中试着使用这个公式。注意,与我们目前使用的大多数公式相比,这个公式似乎不能很好地推广到其他维度。它要求输入向量必须有三个分量。
这个代数程序与本章中的几何描述一致。因为它能给出面积和方向,所以向量积可以帮助我们判断,能否在三维空间中看到同样浮在空间中的多边形。例如,如图3-44所示,站在轴上的观察者是看不到
和
张成的平行四边形的。
![](https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/362.jpg?sign=1738817265-RamkvPfNJr9TV4QXzGNVFUYva0uSv0VW-0-bc55e41aa80f980759fa370ac35aeadf)
图3-44 向量积指出多边形对观察者是否可见
换句话说,图3-44中的多边形与观察者的视线平行。利用向量积,我们不用画图也能知道这一点。因为向量积与人的视线垂直,所以多边形是不可见的。
现在是时候开始我们的终极项目了:用多边形构建一个三维对象,并在二维画布上绘制它。你会使用到目前为止见过的所有向量操作。特别是,向量积将帮你判断哪些多边形是可见的。
3.4.5 练习
练习3.19:如图3-45所示,各图中都存在三个相互垂直的箭头,分别表示
轴、
轴和
轴的正方向。在这些显示为三维框的透视图中,框的背面是灰色的。四幅图中的哪一个与我们选择的相符?也就是说,哪张图显示了我们所画的
轴、
轴和
轴,即使从不同的角度来看也是如此?
![]()
图3-45 以上哪些轴线与我们约定的方向一致
解:从上向下看图3-45a,我们会像往常一样看到
轴和
轴,且
轴指向我们。与我们约定的方向一致的是图3-45a。
在图3-45b中,
轴指向我们,而
轴正方向与
轴正方向顺时针成90°角。这与我们的方向不一致。
如果我们从
轴正方向上的某点看图3-45c(从框的左侧),会看到
轴正方向与
轴正方向逆时针成90°角。图3-45c也与我们的方向一致。
从框左侧看图3-45d,
轴正方向应该是朝向我们的,
轴正方向仍位于
轴正方向的逆时针方向。这与我们的方向也是一致的。
练习3.20:如果把三条坐标轴立在镜子前,镜子里图像的方向是相同的还是不同的呢?
解:镜像的方向是相反的。从这个角度看,
轴和
轴仍然指向相同的方向。在原图中,
轴正半轴在
轴正半轴的顺时针方向,但在镜像中变成了逆时针方向(见图3-46)。
![]()
图3-46
轴、
轴和
轴及其镜像
练习3.21:(0, 0, 3) × (0, -2, 0)的结果指向什么方向?
解:如果我们把右手食指指向(0, 0, 3),也就是
轴正方向,然后弯曲三指指向(0, -2, 0),即
轴负方向,则大拇指会指向
轴正方向。因此,(0, 0, 3) × (0, -2, 0)指向
轴正方向。
练习3.22:(1, -2, 1)和(-6, 12, -6)向量积的坐标是多少?
解:这些向量互为彼此的负标量乘积,它们指向相反的方向且不会张成任何面积。因此,向量积的长度为零。唯一一个长度为零的向量是(0, 0, 0),这就是答案。
练习3.23(小项目):如图3-47所示,平行四边形的面积等于它的底边长乘以它的高。
![]()
图 3-47
基于此,请解释公式
是有意义的。
解:在图3-48中,向量
定义了底边,所以底边长度为
。可以从
的头部到底边画一个直角三角形。
的长度就是斜边,而三角形的高就是我们要找的高。根据正弦函数的定义,高为
。
![]()
图3-48 平行四边形的面积公式使用其一个角的正弦来表示
因为底长为
,高是
,所以平行四边形的面积确实是
。
练习3.24:向量积(1, 0, 1) × (-1, 0, 0)的结果是什么?
(a) (0, 1, 0)
(b) (0, -1, 0)
(c) (0, -1, -1)
(d) (0, 1, -1)
解:这些向量位于
平面,所以它们的向量积在
轴上。将右手食指指向(1, 0, 1)的方向,并将三指向(-1, 0, 0)方向弯曲,则拇指会指向
轴负方向(见图3-49)。
![]()
图3-49 通过几何方法来计算(1, 0, 1)和(−1, 0, 0)的向量积
可以求出向量的长度和它们之间的夹角,从而得到向量积的大小,但我们已经从坐标中得到了底长和高。因为它们都是1,所以长度也是1。因此,向量积为(0, -1, 0),它是
轴负方向上长度为1的向量,答案是(b)。
练习3.25:使用Python的
cross
函数计算,其中第二个向量
是几个不同的值。每个结果的
坐标是多少,为什么?
解:无论选择哪个向量
,结果的
坐标都是零。
>>> cross((0,0,1),(1,2,3)) (-2, 1, 0) >>> cross((0,0,1),(-1,-1,0)) (1, -1, 0) >>> cross((0,0,1),(1,-1,5)) (1, 1, 0)
因为
,所以
和
都是零。这意味着不管
和
的值是多少,向量积公式中的
都是零。从几何学上讲,这是有意义的:向量积应该垂直于两个输入,并且垂直于(0, 0, 1),
分量必须为零。
练习3.26(小项目):用代数法证明
垂直于
和
,不管
和
的坐标是多少。
提示:将
和
展开成坐标用于证明。
解:在下面的方程中,设
,
。我们可以将
用如下的坐标方式表示,把向量积展开成坐标,并进行点积运算。
在继续展开点积后,我们看到共有6项。每一项都能与另一项抵消。
因为完全展开后,所有项都被抵消了,所以结果是零。为了节省“墨水”,这里不再展示
的结果,但情况仍不变:出现了6个项并相互抵消,结果为零。这意味着
垂直于
和
。