官术网_书友最值得收藏!

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))。

主站蜘蛛池模板: 石门县| 巴里| 江源县| 阳朔县| 应用必备| 无棣县| 宁海县| 大城县| 临颍县| 乐清市| 乌拉特前旗| 错那县| 简阳市| 娱乐| 普宁市| 泸西县| 自贡市| 碌曲县| 贵德县| 西峡县| 阳信县| 扎鲁特旗| 五大连池市| 丹东市| 黔东| 喀什市| 屏东县| 隆安县| 鄢陵县| 辉南县| 中牟县| 上蔡县| 西宁市| 微博| 奉化市| 宜宾县| 托里县| 内江市| 依安县| 勃利县| 龙门县|