Python 和物理:矩阵数学备忘单

   随着 STEM 课程的进展,一个常见的数学主题不断出现,那就是矩阵。在本文中,我们将通过一些示例来说明如何使用 Python 解决一些常见的矩阵数学问题。

直接进入代码

   首先,我们应该导入一些包来帮助我们处理一些更复杂的主题,例如特征值和行列式。虽然它们可以通过冗长的计算来解决,但这些包将帮助我们更快地完成事情。

    进口numpy的是NP
    从numpy.linalg进口DET
    从numpy.linalg进口EIG
    从numpy.linalg进口INV

标量乘法

首先,让我们从一些简单的乘法开始,例如从正数变为负数。

a = np.reshape(([2, 3, 4, 5]), (2,2)) #制作2x2矩阵
print(a)##输出
[[2 3]
[4 5]]


 相乘,我们只使用星号。

symbol_change = -1 *
打印(symbol_change)##输出
[[-2 -3]
[-4 -5]
乘以一个常数,我们做同样的事情。
constant_multiplication = 2 *
打印(constant_multiplication)##输出
[[ 4 6]
[ 8 10]]


矩阵乘法/点积

现在我们从矩阵乘法/点积开始。这次我们将尝试使用不同维度的矩阵。

b = np.reshape([1,2,3,4,5,6],(2,3))#2行3列矩阵
print(b)
print(‘----‘)
c = np .reshape([7,8,9,10,11,12],(3,2))#3行2列矩阵
打印(c)##输出
[[1 2 3]
[4 5 6]]
----
[[ 7 8]
[ 9 10]
[11 12]]


虽然 Numpy 确实有一个matmul函数,但 Python 使用 @ 符号来表示矩阵乘法。

matrix_dot_product = b@c #@ 符号做我们的矩阵乘法
print(matrix_dot_product)##输出
[[ 58 64]
[139 154]]


矩阵逆

使用我们之前导入的包inv,我们可以轻松地对矩阵逆。为了验证它是否有效,我们将逆矩阵与原始矩阵相乘以查看它是否形成单位矩阵。需要注意的是,有时,由于 Python 处理的精度,单位矩阵的值可能不为零,因此如果您正在执行某些需要精度的计算,请多加注意。

print(a) 
inverse = inv(a)
print(‘---‘)
print(inverse)
print(‘---‘)
identity = a@inverse
print(identity)##Output
[[2 3] #Original
[4 5]]
---
[[-2.5 1.5] #Inverse
[ 2. -1. ]]
---
[[1. 0.] #Verified 它确实输出了我们的单位矩阵
[0. 1.]]


行列式

使用我们导入的另一个包, det 将帮助解决决定因素。对于这个例子,我们将通过一个 2x2 矩阵和一个 3x3 矩阵。

b = np.reshape([4,6,3,8],(2,2)) 
print(b)
行列式 = det(b)
det_format = float("%.2f" % det(b))
print(‘ ---‘)
打印(行列式,‘/‘,det_format),
c= np.reshape([6,1,1,4,-2,5,2,8,7],(3,3))
打印(‘---‘)
打印(c)
打印(‘---‘)
det_c = det(c)
打印(det_c)##Output
[[4 6]
[3 8]] #Original 2x2 matrix
---
14.0000000000000004 / 14.0 #行列式,第二个值格式化
---
[[ 6 1 1]
[ 4 -2 5]
[ 2 8 7]] #原始 3x3 矩阵
---
-306.0 #行列式


如前所述,有时,Python 的精度给了我们意想不到的值,就像这个行列式的情况一样。代码行det_format,我只是使用 Python 的字符串格式将内容保留在两个小数点以下,并使用float以确保它不会保留为字符串值。

求解 Ax = B

我们一直在使用的函数的更实际用途是求解方程组。通过将它们转换为Ax=B形式,我们可以通过将两边乘以A的倒数来求解x由于一个由它的倒数就是单位矩阵,解决了X,我们只需要乘的逆一个

a = np.reshape([1,1,1,0,2,5,2,5,-1],(3,3)) 
print(a)
print(‘---‘)
b = np.reshape ([6,-4,27],(3,1))
print(b)
print(‘---‘)
solve_x = inv(a) @ b
print(solving_x)##Output
[[ 1 1 1]
[ 0 2 5]
[ 2 5 -1]] #Our A
---
[[ 6]
[-4]
[27]] #Our B
---
[[ 5.]
[ 3.]
[-2.]] #我们的 X


为了验证,我们乘一个X,看看我们是否得到我们的

打印(a@solving_x)##Output 
[[ 6.]
[-4.]
[27.]] #Works!

转置和共轭

对于转置,我们利用了 Numpy 的内置命令T

print(a) 
print(‘---‘)
transpose = aT #所有我们需要得到一个Numpy数组的
转置print(transpose)##Output
[[2 3]
[4 5]]
---
[[2 4]
[3 5]] #切换出对角线上的值

对于共轭,我们使用 Numpy 的共轭命令,我们可以完全输入共轭,也可以只使用conj为了显示我们的虚数,我们使用j而不是最常见的i

#j 为我们的虚数,1j 等于 i。
a = np.reshape([1+1j,-2+1j,3+-1j,4+-1j],(2,2))
print(a)
print(‘---‘)
共轭 = np.conj (a)
打印(共轭)##输出
[[ 1.+1.j -2.+1.j]
[ 3.-1.j 4.-1.j]]
---
[[ 1.-1.j -2.-1 .j]
[ 3.+1.j 4.+1.j]] #改变虚数的符号

特征值和特征向量

此外,我们将使用我们导入的最后一个包eig特征值的给出非常简单,但对于特征向量,我们将不得不稍微处理一下。

a = np.reshape([-6,3,4,5],(2,2)) #2x2 矩阵
print(a)
print(‘---‘)
values, vectors = eig(a) #Values and vectors由 eig 函数给出
print(values)
print(‘---‘)
print(vectors)##Output
[[-6 3] #Original Matrix
[ 4 5]]
---
[-7. 6.] #2 特征值
---
[[-0.9486833 -0.24253563] #2 向量,每个向量是一列
[ 0.31622777 -0.9701425 ]]

如果我们使用vectors[0]来获取我们的第一个向量,我们将得到第一行,它不会是第一个向量。所以为了得到第一个向量,这就是我所做的。

#将行的第一个值分配为向量
vector_one = np.reshape([vectors[0][0],vectors[1][0]],(2,1))
print(vector_one)##输出
数组([[-0.9486833],
[0.31622777]])

检查它们是否是特征值和特征向量,我们首先将原始矩阵乘以向量,看看它是否与通过将特征值乘以向量给出的向量匹配。

print(a@vector_one) #矩阵乘以向量
print(values[0]*vector_one) #第一个特征值乘以向量##Output
[[ 6.64078309]
[-2.21359436]]
[[ 6.64078309]
[-2.21359436]] #他们匹配!

你有它!一个很好的 Python 示例集合,可以帮助那些需要创建处理矩阵的程序的人。还有很多其他概念需要访问,例如跟踪和正交性等,但这应该是大多数需求朝着正确方向迈出的一步!希望你喜欢这个!

软件开发咨询 微信 zhiyan0112

Python 和物理:矩阵数学备忘单

上一篇:短信api接口


下一篇:【GA源码分析之知识补充二】Windows钩子机制