前言
本文讲解向量的向量积与混合积,并通过编程实现它们。
向量的向量积
两个向量的向量积(英语: Outer Products)向量空间中向量的二元运算。与数量积(点积)不同,向量积的运算结果是一个向量而不是一个标量,记作两向量叉乘,向量积所得向量的模长为:原向量模长乘积乘以原向量夹角的正弦值,方向与两个原向量都垂直。
向量向量积的几何意义可以理解为:由两向量为邻边构建的平行四边形的面积。
图1: 向量积的几何意义
从向量向量积的几何意义出发,计算向量积会比较繁琐。我们引入三维直角坐标系(这里我们只考虑三维向量,不考虑高维(n−1)向量),使用三阶行列式来求解向量积。
→a=[axayaz]=ax⋅→i+ay⋅→j+az⋅→k →b=[bxbybz]=bx⋅→i+by⋅→j+bz⋅→k则这两枚向量的向量积为(这里将下标换成了数字,更加清晰):
→v=→a×→b=|→i→j→ka1a2a3b1b2b3|=→i⋅|a2a3b2b3|−→j⋅|a1a3b1b3|+→k⋅|a1a2b1b2|=→i⋅(a2⋅b3−a3⋅b2)−→j⋅(a1⋅b3−a3⋅b1)+→k⋅(a1⋅b2−a2⋅b1)向量的混合积
向量的混合积是由向量的数量积与向量积一起运算得到的。向量的混合积由一枚向量先与另一枚向量做叉乘,得到的向量积再与一枚向量做点乘,所以向量混合积最终结果是一个标量。我们可以列出一个三阶行列式来快速求解向量的混合积。
n=(→a×→b)⋅→c=|axayazbxbybzcxcycz|向量积与混合积的编程实现
在了解了向量向量积的基本概念后,我们考虑它的编程实现。我们来为向量类添加一个求向量积的方法。
根据向量积的定义及其三阶行列式求法,我们可以很容易地实现求向量积:取出两枚向量三个维度的坐标数值,按照行列式展开运算得出向量积的坐标,构建向量返回即可。
...
def cross(self, v):
try:
x1, y1, z1 = self.coordinates
x2, y2, z2 = v.coordinates
return Vector([
y1 * z2 - y2 * z1,
-(x1 * z2 - x2 * z1),
x1 * y2 - x2 * y1
])
except:
print("Something error")
return None
...
代码清单1: 向量积的代码实现(Python)
向量的混合积是由向量的数量积与向量分一起运算得到的。我们没有必要单独写一个求混合积的方法,完全可以由已经实现的数量积与向量积来得混合积。
...
def vector_mixed(m, v, w):
return m.cross(v).dot(w)
...
代码清单2: 混合积的代码实现(Python)
接下来,我们来写求由两枚向量所构建的图形面积(三角形与平行四边形)的代码实现。
...
def area_of_parallelogram_with(self, v):
return self.cross(v).magnitude()
def area_of_triangle_with(self, v):
return self.area_of_parallelogram_with(v) / 2.0
...
代码清单3: 向量构成图形面积的代码实现(Python)
我们来写一些测试代码,看看我们新添加的方法是否可用。
def vector_cross_test():
print(Vector([1, 1, 0]).cross(Vector([2, 0, 0])).magnitude())
print(Vector([1, 1, 0]).area_of_parallelogram_with(Vector([2, 0, 0])))
print(Vector([1, 1, 0]).area_of_triangle_with(Vector([2, 0, 0])))
代码清单4: 相关测试代码(Python)
参考资料
- 同济高等数学(第7版)下册, P17 - P22