08.叉乘

本文的主要內容:叉乘的計算方式,幾何含義和詳細證明.

1.叉乘的計算公式

[v1,v2,v3]x[w1,w2,w3] = [[ v2w3 - v3w2],[-v1w3 + v3w1],[ v1w2 - v2w1]]

import sympy as sp v1,v2,v3,w1,w2,w3 = sp.symbols("v1,v2,v3,w1,w2,w3") M1 = sp.Matrix([v1,v2,v3]) M2 = sp.Matrix([w1,w2,w3]) M3 = M1.cross(M2)#cross叉乘 M3 #Matrix([[ v2*w3 - v3*w2],[-v1*w3 + v3*w1],[ v1*w2 - v2*w1]]) M3.subs([[v1,1],[v2,2],[v3,3],[w1,4],[w2,5],[w3,6]]) #Matrix([[-3], [ 6], [-3]]) import numpy as np M1 = np.matrix([1,2,3]) M2 = np.matrix([4,5,6]) np.cross(M1,M2) #array([[-3, 6, -3]])

2.叉乘的幾何意義

叉乘:也叫向量積,外積,叉積,矢積。對於2個3維向量的叉乘,結果是一個和已有兩個向量都垂直的向量,方向符合右手定則。

如果我們有3個三維向量,第1個是未知向量 vec a =[x,y,z],第2個是已知向量 vec v = [v1,v2,v3],第3個是已知向量 vec w = [w1,w2,w3],這三個向量構成的平行六面體設為F,設M1=[[x,v1,w1],[y,v2,w2],[z,v3,w3]].

F的體積為 Vol_FVol_F 等於det(M1)的絕對值

因為x,y,z是未知的,所以我們歸納M1的行列式為x,y,z作為變數的表達式.

import sympy as sp x,y,z,v1,v2,v3,w1,w2,w3 = sp.symbols("x,y,z,v1,v2,v3,w1,w2,w3") M1 = sp.Matrix([[x,v1,w1],[y,v2,w2],[z,v3,w3]]) M1.det().factor(x,y,z) #factor 提取變數 #結果為:x*(v2*w3 - v3*w2) + y*(-v1*w3 + v3*w1) + z*(v1*w2 - v2*w1)

det(M1) = x*(v2*w3 - v3*w2) + y*(-v1*w3 + v3*w1) + z*(v1*w2 - v2*w1)

體積 Vol_F =|det(M1)|=|x*(v2*w3 - v3*w2) + y*(-v1*w3 + v3*w1) + z*(v1*w2 - v2*w1)|

vec a 為右手定則的拇指一側(偏差<=90°)時, Vol_F =det(M1),否則- Vol_F =det(M1).

[注意上面用了一個技巧,本來 vec a 是為食指, vec v 為中指, vec w 為拇指的,但是經過旋轉(不經過變換),相對下圖其實 vec a 就是拇指方向(而不是反方向),可以動手旋轉一下]

假設: vec p 為垂直於 vec vvec w 平面的向量,| vec p |等於和構成的面積,右手定則的拇指方向為 vec p 方向.

根據點乘公式可知, vec p.vec a = |vec p|.|vec a |.cos(vec p,vec a )

因為 vec p 垂直於 vec vvec w 平面, |vec a |.cos(vec p,vec a ) 為在上的投影,所以 |vec a |.cos(vec p,vec a ) 為立體F在 vec vvec w 平面的高,又因為| vec p |為 vec v和vec w 構成的面積.

可得 |vec p.vec a | =高*面積 = Vol_F =|det(M1)|.

嘗試去除公式中的絕對值,我們希望得到 vec p.vec a =det(M1):

(1)當為右手定則的拇指一側(偏差<=90°)時, vec p.vec a >=0, Vol_F =det(M1),此時 vec p和vec a 夾角<=90°,則 Vol_F =det(M1)=vec p.vec a

(2)當為右手定則的拇指不同側的時, vec p.vec a <0,- Vol_F =det(M1),此時 vec p和vec a 夾角大於90°,- Vol_F =det(M1)=vec p.vec a

綜上, vec p.vec a =det(M1) = x*(v2*w3 - v3*w2) + y*(-v1*w3 + v3*w1) + z*(v1*w2 - v2*w1),

因為 vec a =[x,y,z],可得 vec p  = [v2*w3 - v3*w2,-v1*w3 + v3*w1,v1*w2 - v2*w1]= vec v x vec w

幾何含義:

結合叉乘的計算公式, vec v x vec w =[v2*w3 - v3*w2,-v1*w3 + v3*w1,v1*w2 - v2*w1]= vec p

所以叉乘的實質為求得 vec v x vec w 右手定則拇指方向的向量,其長度為 vec v x  vec w 構成的面積.

幾何含義為:可以引入一個向量(如這裡的 vec a ),這個向量點乘 vec p 後的絕對值為三個向量構成的平行六面體的體積,其中 vec v x vec w = vec p

下一節的內容鏈接為:

袁傑雄:09.基變換[python線性變換]?

zhuanlan.zhihu.com圖標
推薦閱讀:

Python實現PCA降維
《機器學習實戰》學習總結(五)——Logistic回歸
flowpy語法特性總覽和二進位包
Python練習第一題,在圖片上加入數字
左手用R右手Python系列——多進程/線程數據抓取與網頁請求

TAG:Python | 線性代數 | 可視化 |