【回归本源】1.2-向量点乘
书接上文,麦子带大家简单看了下向量是什么以及向量的加减法,到目前为止所有的结论都是很直观的,但是讲到向量的乘法时我们遇到了两个问题:
两个向量相乘是个什么含义呢?
两个向量相乘,结果是个标量呢?还是个向量呢?如果是向量,方向是指向哪儿的呢?
从第二个问题我们能看出一些端倪,这并不是一个很简单的问题。但是如果仅仅是要使用向量之间的乘法,不去太过在意做法来源的话,就能很轻易地讲完。(关于做法来源,大家可以在学会矩阵以及理解矩阵与空间转换关系之后去看下3Blue1Brown线性代数系列第7、第8集)
对于3D空间而言,我们会有两种向量相乘的做法:
点乘
叉乘
其中点乘的做法对任意维度都适用,但叉乘仅适用与3D或7D的情况。如果你对7D的叉乘感兴趣,请自行阅读《Cross Products of Vectors in Higher Dimensional Euclidean Spaces》(麦子我没接触过)
今天我们先来讲讲点乘。
注:这篇里部分地方会用到矩阵,我们还没讨论过,我会在有矩阵的段落开头加上(*)做为标记,对矩阵不熟的朋友可以之后返回来看,但是不会也并不影响阅读。
点乘(Dot Product)
点乘的结果会是一个标量,同时可以看成一个向量在另一个向量方向上的投影长度与另一个向量长度相乘。听起来拗口啊,但是看到数学表达式应该就很清楚了。
v→⋅u→=|v→||u→|cos(θ)
其中
θ
是两个向量之间的夹角,因此
(|u→|cos(θ))
就是向量
u→
在向量
v→
方向上的投影长度,之后这个长度再与
|v→|
进行最平常的相乘。同理,也可以认为
(|v→|cos(θ))
是
v→
在
u→
方向上的投影长度。
<img src="https://pic3.zhimg.com/v2-21ad0a239747efe0926d6844d7b596c6_b.jpg" data-caption="" data-size="normal" data-rawwidth="1367" data-rawheight="1000" class="origin_image zh-lightbox-thumb" width="1367" data-original="https://pic3.zhimg.com/v2-21ad0a239747efe0926d6844d7b596c6_r.jpg"/>
如果
v→=(
vx |
vy |
vz |
)
,
u→=(
ux |
uy |
uz |
)
,那么我们还可以用如下方法进行点乘计算:
v→⋅u→=vxux+vyuy+vzuz=∑i∈(x,y,z)viui
,
值得一提的是,为什么这两种表达方式是向等的呢?这里给大家看个三角形应该可以简要说明下这个问题。
<img src="https://pic1.zhimg.com/v2-0c7b26c6c8823cef80a046fa4131b344_b.jpg" data-caption="" data-size="normal" data-rawwidth="1661" data-rawheight="1000" class="origin_image zh-lightbox-thumb" width="1661" data-original="https://pic1.zhimg.com/v2-0c7b26c6c8823cef80a046fa4131b344_r.jpg"/>
如图所示,这个三角形由三个向量包围而成,
v→
,
u→
以及
(v→−u→)
,余弦定理(不记得这个定理了,可以看看文章最下面)告诉我们
|v→−u→|
2
=|v→|
2
+|u→|
2
−
2
|v→||u→|cos(θ)
相信你已经看到了点乘结果的那一部分了,接下来就是一些基本数学操作了。回顾下上一篇文章中我们提过
|v→|=(∑i∈(x,y,z)vi
2
)
1
2
,
爱XR的麦子:回归本源系列1.1-向量简介13 赞同 · 6 评论文章
由此我们就有了
∑i∈(x,y,z)(vi−ui)
2
=∑i∈(x,y,z)vi
2
+∑i∈(x,y,z)ui
2
−
2
|v→||u→|cos(θ)
⇒∑i∈(x,y,z)vi
2
−
2
viui+ui
2
=∑i∈(x,y,z)vi
2
+∑i∈(x,y,z)ui
2
−
2
|v→||u→|cos(θ)
⇒−
2
∑i∈(x,y,z)viui=−
2
|v→||u→|cos(θ)
最后就是我们想要的点乘公式了:
v→⋅u→=∑i∈(x,y,z)viui=|v→||u→|cos(θ)
希望你也能看出来,整个证明流程实际上并不只限于3D。
(*) 如上一讲提到过的,在计算机中常把向量之间的操作直接看成矩阵操作。熟悉矩阵的朋友应该一眼就看出来,这个点乘可以被看成
v→⋅u→≡vTu
这样的矩阵操作。(不熟悉的朋友也没事,快讲到了)
点乘也具有一些很重要但是不难想到的性质,可以自己去思考下为啥它们是对的
v→⋅u→=u→⋅v→
(av→)⋅u→=a(v→⋅u→)
v→⋅(u→+w→)=v→⋅u→+v→⋅w→
v→⋅v→=|v→|
2
|v→⋅u→|≤|v→||u→|
留意下第四点,它直接来源于一个向量自己在自己方向的投影自然还是它自己。同时也说明
cos(θ)
和点乘的大小也反应了两个向量有多“平行”。两个向量越“平行“,绝对值越大;反之,两个向量越“垂直”,绝对值越小。
这也是为什么点乘在物理里也是无处不在,最直接的例子就是初中物理里强调过的
平行于物体移动方向的力做功:
dW=F→⋅dx→=(Fcos(θ))dx
<img src="https://pic3.zhimg.com/v2-141ba77da3f38685ff1ea32631c835a2_b.jpg" data-caption="" data-size="normal" data-rawwidth="1805" data-rawheight="1000" class="origin_image zh-lightbox-thumb" width="1805" data-original="https://pic3.zhimg.com/v2-141ba77da3f38685ff1ea32631c835a2_r.jpg"/>
虽然那个时候还没讲点乘,但是也能看出这个概念并不是很遥远。
关于点乘最后讲两个点。如果你就是想知道一个向量在另一个向量方向的投影向量,怎么办?相信你能很自然地告诉我,
v→
在
u→
方向上的投影就是
projuv→=(v→⋅u^)u^=v→⋅u→|u→|
2
u→
,
同时
v→
垂直于
u→
方向的向量就可以用
v→
和
projuv→
的差值来得到
perpuv→=v→−projuv→
,
没看出来的小伙伴最好自己画画图看看。
(*) 最后,关于投影向量可以用矩阵一步到位地求出来,有兴趣的小伙伴可以自己试一试
projuv→=
1
|u→|
2
[
ux 2 |
uxuy |
uxuz |
uxuy |
uy 2 |
uyuz |
uxuz |
uyuz |
uz 2 |
][
vx |
vy |
vz |
]
。
继续补下Python那Class
class vector_3d(object):
def __init__(self, x, y, z, ifTransposed=False):
# 默认是竖向量
super(vector_3d, self).__init__()
self.x = x
self.y = y
self.z = z
self.ifTransposed = ifTransposed
# ......
def dot(self, another_vector):
assert type(another_vector) is Vector_3d
assert another_vector.ifTransposed == False
return self.x * another_vector.x + \
self.y * another_vector.y + \
self.z * another_vector.z
def proj(self, project_to):
assert type(project_to) is Vector_3d
return self.dot(project_to)/abs(project_to) * project_to.unit()
def perp(self, perpendicular_to):
assert type(perpendicular_to) is Vector_3d
return self - self.proj(perpendicular_to)
这次可以试下向量点乘的性质了。
好了,点乘的介绍就到这里了,明天将会继续更新叉乘,有兴趣的小伙伴可以点个收藏。
这里就是再补充下余弦定理,
c
2
=a
2
+b
2
−
2
abcos(θ)
,
嘛,这个证明还是很简单的了,任意一三角形,三边分别为
a
,
b
和
c
,角
θ
是
a
、
b
两边的夹角。如图做垂线:
<img src="https://pic2.zhimg.com/v2-59f43f4e533e9664f1f698f70b090c91_b.jpg" data-caption="" data-size="normal" data-rawwidth="1639" data-rawheight="1000" class="origin_image zh-lightbox-thumb" width="1639" data-original="https://pic2.zhimg.com/v2-59f43f4e533e9664f1f698f70b090c91_r.jpg"/>
右侧的小三角形做勾股定理
c
2
=(a
sin(θ))
2
+(b−a
cos(θ))
2
=a
2
sin
2
(θ)+b
2
−
2
a
b
cos(θ)+a
2
cos
2
(θ)
=a
2
(sin
2
(θ)+cos
2
(θ))+b
2
−
2
a
b
cos(θ)
于是就有了我们的余弦定理
from: https://zhuanlan.zhihu.com/p/342622957