- 程序員數(shù)學(xué):用Python學(xué)透線性代數(shù)和微積分
- (美)保羅·奧蘭德
- 3648字
- 2022-01-10 14:44:14
3.3 點(diǎn)積:測(cè)量向量對(duì)齊
我們已經(jīng)見過的一種向量乘法是標(biāo)量乘法,將一個(gè)標(biāo)量(實(shí)數(shù))和一個(gè)向量結(jié)合起來,得到一個(gè)新的向量。不過還沒有討論過任何將向量相乘的方法。實(shí)際上,有兩種重要的方法可以做到這一點(diǎn),二者都提供了重要的幾何學(xué)見解。一種叫作點(diǎn)積,使用點(diǎn)運(yùn)算符書寫(例如,);另一種叫作向量積(例如,
)。對(duì)于數(shù)來說,這些符號(hào)的意思是一樣的,如3·4 = 3 × 4。對(duì)于兩個(gè)向量來說,運(yùn)算
和
不僅僅有不同的符號(hào),而且代表的意義完全不同。
點(diǎn)積取兩個(gè)向量并返回一個(gè)標(biāo)量(數(shù)),而向量積取兩個(gè)向量并返回另一個(gè)向量。然而,使用這兩種運(yùn)算都可以推斷出三維空間中向量的長(zhǎng)度和方向。我們首先從點(diǎn)積開始介紹。
3.3.1 繪制點(diǎn)積
點(diǎn)積(也叫內(nèi)積)是對(duì)兩個(gè)向量的運(yùn)算,返回一個(gè)標(biāo)量。換句話說,給定兩個(gè)向量和
,那么
的結(jié)果是實(shí)數(shù)。點(diǎn)積適用于二維、三維等任意維度的向量。它可以被看作測(cè)量輸入向量對(duì)的“對(duì)齊程度”。首先來看看
平面上的一些向量,以及它們的點(diǎn)積,以便對(duì)這個(gè)運(yùn)算有一些直觀的認(rèn)識(shí)。
向量和
的長(zhǎng)度分別為4和5,而且方向幾乎相同。它們的點(diǎn)積為正,意味著它們是對(duì)齊的(見圖3-24)。

圖3-24 大致對(duì)齊的兩個(gè)向量給出一個(gè)大的正點(diǎn)積
指向相似方向的兩個(gè)向量的點(diǎn)積為正,并且向量越大,乘積就越大。對(duì)于同樣對(duì)齊的較短向量,點(diǎn)積較小但仍然是正的。新向量和
的長(zhǎng)度都是2(見圖3-25)。

圖3-25 指向相似方向的兩個(gè)較短向量,點(diǎn)積較小但仍為正
相反,如果兩個(gè)向量指向相反或大致相反的方向,則其點(diǎn)積為負(fù)(見圖3-26和圖3-27)。向量越長(zhǎng),則點(diǎn)積的負(fù)值越小。

圖3-26 指向相反方向的向量點(diǎn)積為負(fù)

圖3-27 指向相反方向的較短向量,點(diǎn)積較大但仍為負(fù)數(shù)
并非所有的向量對(duì)都明確地指向相似或相反的方向,點(diǎn)積可以檢測(cè)這一點(diǎn)。如圖3-28所示,如果兩個(gè)向量的方向完全垂直,那么無論它們的長(zhǎng)度如何,點(diǎn)積都是零。

圖3-28 垂直向量的點(diǎn)積總是為零
這就是點(diǎn)積最重要的應(yīng)用之一:在不做任何三角運(yùn)算的情況下,計(jì)算兩個(gè)向量是否垂直。這種垂直的情況也可以用來區(qū)分其他情況:如果兩個(gè)向量的夾角小于90°,則向量的點(diǎn)積為正;如果夾角大于90°,則向量的點(diǎn)積為負(fù)。雖然還沒有講到計(jì)算點(diǎn)積的方法,但你現(xiàn)在知道如何解釋這個(gè)值了。接下來介紹如何計(jì)算它。
3.3.2 計(jì)算點(diǎn)積
給定兩個(gè)向量的坐標(biāo),有一個(gè)計(jì)算點(diǎn)積的簡(jiǎn)單公式:將相應(yīng)的坐標(biāo)相乘,然后將乘積相加。例如,在點(diǎn)積 (1, 2, -1)·(3, 0, 3) 中,坐標(biāo)的乘積為3,
坐標(biāo)的乘積為0,
坐標(biāo)的乘積為-3,因?yàn)橄嗉訛?3 + 0 + (-3) = 0,所以點(diǎn)積為零。如果我說得沒錯(cuò),這兩個(gè)向量應(yīng)該是垂直的。如果繪制它們并從正確的角度去看,就能證明這一點(diǎn)(見圖3-29)。

圖3-29 點(diǎn)積為零的兩個(gè)向量在三維空間中確實(shí)是垂直的
在三維空間中,我們的視角可能有誤導(dǎo)性,這使得計(jì)算出向量的相對(duì)方向比目測(cè)更有價(jià)值。再看一個(gè)示例,圖3-30顯示了二維向量(2, 3)和(4, 5)在平面上具有相似的方向。
坐標(biāo)的乘積是2·4 = 8,而
坐標(biāo)的乘積是3·5 = 15。8 + 15 = 23就是點(diǎn)積的結(jié)果。這個(gè)結(jié)果是一個(gè)正數(shù),證實(shí)了向量的夾角小于90°。它們?cè)谌S空間中可以表示為恰好位于
平面內(nèi)的向量(2, 3, 0)和(4, 5, 0)。但是無論在二維平面還是三維空間中,它們的相對(duì)幾何性質(zhì)是不變的。

圖3-30 計(jì)算點(diǎn)積的另一個(gè)示例
在Python中,可以實(shí)現(xiàn)一個(gè)點(diǎn)積函數(shù)來處理任意一對(duì)(只要它們的坐標(biāo)數(shù)目相同即可)輸入向量。例如:
def dot(u,v):
return sum([coord1 * coord2 for coord1,coord2 in zip(u,v)])
這段代碼使用Python的zip
函數(shù)對(duì)相應(yīng)的坐標(biāo)進(jìn)行配對(duì),然后在推導(dǎo)式中將每對(duì)坐標(biāo)相乘,并添加到結(jié)果列表中。下面就借助它,進(jìn)一步探索點(diǎn)積的行為。
3.3.3 點(diǎn)積的示例
位于不同軸上的兩個(gè)向量的點(diǎn)積為零并不奇怪。這說明它們是垂直的。
>>> dot((1,0),(0,2))
0
>>> dot((0,3,0),(0,0,-5))
0
我們還可以證實(shí),向量越長(zhǎng),其點(diǎn)積的絕對(duì)值越大。例如,將任意一個(gè)輸入向量乘以2,點(diǎn)積的輸出就會(huì)翻倍。
>>> dot((3,4),(2,3))
18
>>> dot(scale(2,(3,4)),(2,3))
36
>>> dot((3,4),scale(2,(2,3)))
36
這說明,點(diǎn)積的絕對(duì)值與其輸入向量的長(zhǎng)度成正比。如果取同方向兩個(gè)向量的點(diǎn)積,那么點(diǎn)積就等于兩個(gè)向量長(zhǎng)度的乘積。例如,(4, 3)的長(zhǎng)度為5,(8, 6)的長(zhǎng)度為10,所以二者的點(diǎn)積等于5·10。
>>> dot((4,3),(8,6))
50
當(dāng)然,點(diǎn)積并不總是等于其輸入向量長(zhǎng)度的乘積。如圖3-31所示,向量(5, 0)、(-3, 4)、(0, -5)和(-4, -3)的長(zhǎng)度都是5,但它們與原始向量(4, 3)的點(diǎn)積是不同的。

圖3-31 由于方向不同,相同長(zhǎng)度的向量與向量 (4, 3)有不同的點(diǎn)積
兩個(gè)長(zhǎng)度為5的向量的點(diǎn)積范圍是-25~25:當(dāng)它們指向相反方向時(shí),點(diǎn)積為-25;當(dāng)它們對(duì)齊時(shí),點(diǎn)積為5·5 = 25。在3.3.5節(jié)的練習(xí)中你會(huì)發(fā)現(xiàn),兩個(gè)向量的點(diǎn)積范圍是長(zhǎng)度乘積到長(zhǎng)度乘積的負(fù)值。
3.3.4 用點(diǎn)積測(cè)量角度
我們已經(jīng)知道,點(diǎn)積是根據(jù)兩個(gè)向量的夾角而變化的。具體來說,當(dāng)夾角角度為0到180°時(shí),點(diǎn)積的取值范圍是
和
長(zhǎng)度乘積的1到-1倍。我們已經(jīng)見過具有這樣特征的函數(shù),即余弦函數(shù)。其實(shí)點(diǎn)積還有另一個(gè)公式。如果
和
分別表示向量
和
的長(zhǎng)度,那么點(diǎn)積的計(jì)算公式為:
是向量
和
之間的角度。原則上,這提供了一種計(jì)算點(diǎn)積的新方法。通過測(cè)量?jī)蓚€(gè)向量的長(zhǎng)度和它們之間的角度,就可以得到點(diǎn)積的結(jié)果。如圖3-32所示,假設(shè)已知有兩個(gè)長(zhǎng)度分別為3和2的向量,并使用量角器測(cè)量出它們的夾角是75°。

圖3-32 長(zhǎng)度分別為3和2的兩個(gè)向量,夾角為75°
圖3-32中兩個(gè)向量的點(diǎn)積為。通過適當(dāng)?shù)幕《绒D(zhuǎn)換,我們可以使用Python計(jì)算出這個(gè)值約為1.55。
>>> from math import cos,pi
>>> 3 * 2 * cos(75 * pi / 180)
1.5529142706151244
在使用向量進(jìn)行計(jì)算時(shí),更常見的是基于坐標(biāo)來計(jì)算角度。我們可以結(jié)合這兩個(gè)公式來算出一個(gè)角:首先使用坐標(biāo)計(jì)算向量的點(diǎn)積和長(zhǎng)度,然后求解角度。
讓我們找出向量(3, 4)和(4, 3)之間的角度。它們的點(diǎn)積是24,向量長(zhǎng)度都是5。從新的點(diǎn)積公式可以得出:
可以將簡(jiǎn)化成
。使用Python的
math.acos
庫,可以得到值約為0.284弧度或16.3°,其余弦值為24/25。
這個(gè)練習(xí)提醒了我們,為什么在二維平面上不需要點(diǎn)積。第2章展示了如何得到向量與軸正方向之間的角度。創(chuàng)造性地使用那個(gè)公式,可以在平面上找到我們想要的任意角度。點(diǎn)積在三維空間中才真正開始發(fā)揮作用,因?yàn)槿S空間中的坐標(biāo)變換對(duì)測(cè)量角度的幫助并不大。
例如,我們可以用同樣的公式來求(1, 2, 2)和(2, 2, 1)之間的角度。它們的點(diǎn)積是1·2 + 2·2 + 2·1 = 8,向量長(zhǎng)度都是3。這意味著,所以
,
約為0.476弧度或27.3°。
這個(gè)過程在二維平面或三維空間中是一樣的,將被反復(fù)使用。通過實(shí)現(xiàn)Python函數(shù)來求兩個(gè)向量之間的角度可以節(jié)省一些精力。因?yàn)?code>dot函數(shù)和length
函數(shù)中都沒有硬編碼維數(shù),所以這個(gè)新函數(shù)也不會(huì)。利用這個(gè)公式可得:
以及
第二個(gè)公式可以被直接翻譯成如下Python代碼。
def angle_between(v1,v2):
return acos(
dot(v1,v2) /
(length(v1) * length(v2))
)
這段Python代碼沒有依賴向量和
的維數(shù)。它們既可以是包含2個(gè)坐標(biāo)的元組,也可以是包含3個(gè)坐標(biāo)的元組(實(shí)際上,還可以是包含4個(gè)或更多坐標(biāo)的元組,我們將在后面的章節(jié)中討論)。相比之下,接下來要說的向量積(外積、叉積)只在三維空間中有效。
3.3.5 練習(xí)
練習(xí)3.11:根據(jù)圖3-33,將
、
和
從大到小排列。
![]()
圖 3-33
解:乘積
是唯一正的點(diǎn)積,因?yàn)?img alt="" class="h-pic-1" src="https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/136.gif?sign=1755220539-8ojiKRw3GXAwPcdKlPa01ijeJ8NNph7B-0-27acebf4ae490156298adaaf516b89c1">和
是唯一一對(duì)夾角小于直角的向量對(duì)。此外,
比
更小(更負(fù)),因?yàn)?img alt="" class="h-pic-1" src="https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/136.gif?sign=1755220539-8ojiKRw3GXAwPcdKlPa01ijeJ8NNph7B-0-27acebf4ae490156298adaaf516b89c1">既大又離
更遠(yuǎn),所以
。
練習(xí)3.12:(-1, -1, 1)和(1, 2, 1) 的點(diǎn)積是多少?這兩個(gè)三維向量的夾角是大于90°、小于 90°,還是正好等于90°?
解:(-1, -1, 1)和(1, 2, 1)的點(diǎn)積為-1·1 + -1·2 + 1·1 = -2。因?yàn)榻Y(jié)果是負(fù)數(shù),所以兩個(gè)向量之間的角度超過90°。
練習(xí)3.13(小項(xiàng)目):對(duì)于兩個(gè)三維向量
和
,
和
的值都等于
。在這種情況下,
,而
和
都是36,是原結(jié)果的2倍。請(qǐng)證明這個(gè)規(guī)則對(duì)于任意實(shí)數(shù)
都適用,而不僅僅是2。換句話說,請(qǐng)證明對(duì)于任意
,
和
的值都等于
。
解:設(shè)
和
的坐標(biāo)為
和
,那么
。因?yàn)?img alt="" class="h-pic-x" src="https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/327.gif?sign=1755220539-DdsNoa6NvtqZ2u5RPTd0TfWGVGu1vT3b-0-7814044d23bcb68451553bedce388b95">,
,我們可以通過展開點(diǎn)積來計(jì)算。
![]()
上式證明了標(biāo)量乘法會(huì)對(duì)點(diǎn)積的結(jié)果進(jìn)行相應(yīng)的縮放處理。
另一個(gè)點(diǎn)積同理,以下公式證明了同樣的事實(shí)。
練習(xí)3.14(小項(xiàng)目):用代數(shù)證明向量與其自身的點(diǎn)積是其長(zhǎng)度的平方。
解:如果一個(gè)向量的坐標(biāo)是
,那么它與自身的點(diǎn)積是
,確實(shí)是其長(zhǎng)度
的平方。
練習(xí)3.15(小項(xiàng)目):找出長(zhǎng)度為3的向量
和長(zhǎng)度為7的向量
,使
。再找出一對(duì)向量
和
,使
。最后,再找出三對(duì)長(zhǎng)度分別為3和7的向量,并證明它們的長(zhǎng)度都在-21和21之間。
解:兩個(gè)方向相同的向量(例如,沿
軸正方向)具有最高的點(diǎn)積。
>>> dot((3,0),(7,0)) 21
兩個(gè)方向相反的向量(例如,分別沿
軸正負(fù)方向)具有最低的點(diǎn)積。
>>> dot((0,3),(0,-7)) -21
利用極坐標(biāo),可以很容易地再生成一些長(zhǎng)度為3和7的任意角度的向量。
from vectors import to_cartesian from random import random from math import pi def random_vector_of_length(l): return to_cartesian((l, 2 *pi*random())) pairs = [(random_vector_of_length(3), random_vector_of_length(7)) for i in range(0,3)] for u,v in pairs: print("u = %s, v = %s" % (u,v)) print("length of u: %f, length of v: %f, dot product :%f" % (length(u), length(v), dot(u,v)))
練習(xí)3.16:設(shè)
和
是向量,其中
,
。如果
和
的夾角是101.3°,那么
是什么?
(a) 5.198
(b) 5.098
(c) -1.019
(d) 1.019
解:同樣可以將這些值代入新的點(diǎn)積公式,并通過適當(dāng)?shù)幕《绒D(zhuǎn)換,使用Python計(jì)算結(jié)果。
>>> 3.61 * 1.44 * cos(101.3 * pi / 180) -1.0186064362303022
四舍五入到小數(shù)點(diǎn)后三位,答案與(c)一致。
練習(xí)3.17(小項(xiàng)目):通過把(3, 4)和(4, 3)轉(zhuǎn)換為極坐標(biāo)并取角的差值,來求出它們之間的角度。答案是以下哪一個(gè)?
(a) 1.569
(b) 0.927
(c) 0.643
(d) 0.284
提示:結(jié)果應(yīng)與點(diǎn)積公式求得的值一致。
解:因?yàn)閺?img alt="" class="h-pic-1" src="https://epubservercos.yuewen.com/8EA7F4/22124474309908206/epubprivate/OEBPS/Images/x-1.jpg?sign=1755220539-PVYJNXJZPrpTfcT5OJUUoNrY7gr5rIXe-0-4e6eba79c9ab41c38d625a9751c82a94">軸正半軸開始沿逆時(shí)針方向看,向量(3, 4)比(4, 3)距離更遠(yuǎn),所以用(3, 4)的角度減去(4, 3)的角度就能得到答案。結(jié)果與答案(d)完全吻合。
>>> from vectors import to_polar >>> r1,t1 = to_polar((4,3)) >>> r2,t2 = to_polar((3,4)) >>> t1-t2 -0.2837941092083278 >>> t2-t1 0.2837941092083278
練習(xí)3.18:(1, 1, 1)與(-1, -1, 1)之間的角是多少度?
(a) 180°
(b) 120°
(c) 109.5°
(d) 90°
解:兩個(gè)向量的長(zhǎng)度都是
,約等于1.732。它們的點(diǎn)積是1·(-1) + 1·(-1) + 1·= -1,即
。所以,
。由此可求得這個(gè)角約為1.911弧度或109.5°(答案是(c))。
- C語言程序設(shè)計(jì)(第2 版)
- Power Up Your PowToon Studio Project
- Oracle從新手到高手
- JavaScript語言精髓與編程實(shí)踐(第3版)
- Visual Basic編程:從基礎(chǔ)到實(shí)踐(第2版)
- Visual FoxPro 程序設(shè)計(jì)
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優(yōu)化計(jì)算
- 零基礎(chǔ)學(xué)Java(第4版)
- EPLAN實(shí)戰(zhàn)設(shè)計(jì)
- Python完全自學(xué)教程
- SQL Server數(shù)據(jù)庫管理與開發(fā)兵書
- 深入理解BootLoader
- 計(jì)算機(jī)系統(tǒng)解密:從理解計(jì)算機(jī)到編寫高效代碼
- C++面向?qū)ο蟪绦蛟O(shè)計(jì)
- 前端Serverless:面向全棧的無服務(wù)器架構(gòu)實(shí)戰(zhàn)