1. 引言
Python语言诞生于1990年,由Guido van Rossum设计并领导开发。最近十年Python在网络爬虫、数据分析、AI、机器学习、Web开发、金融、运维及测试等领域都有不俗的表现,它专注于解决问题、自由开发的社区环境以及丰富的第三方库,Python具有强大的科学及工程计算能力,它不但具有以矩阵计算为基础的强大数学计算能力和分析功能,而且还具有丰富的可视化表现功能和简洁的程序设计能力 [1] 。
线性代数是大学理、工、经管各专业重要的基础必修课,它在培养具有良好科学素养和创新能力的数学及应用人才方面起着十分重要的作用。它是以讨论有限维空间线性理论为主,具有较强的抽象性与逻辑性,是数学的一个重要分支,其理论与方法已广泛应用于其它科学领域中。主要包括:矩阵、行列式、线性方程组、秩问题、矩阵的特征值和特征向量、二次型等内容。同时,该课程能够为培养工科各专业学生的逻辑推理和抽象思维能力、空间直观和想象能力打下良好的基础。通过对线性代数课程的学习,学生掌握行列式、矩阵、线性方程组、向量组等基本理论,进一步增强学生的数学素养、数学计算、抽象思维与逻辑思维能力,提高学生综合分析、处理问题的能力,为利用矩阵这个数学工具处理专业领域内的复杂工程问题提供理论基础。然而,线性代数中存在着大量以运算为基础的内容,这些内容往往成为许多学生学习线性代数的拦路虎,影响了他们对线性代数的兴趣,制约了他们对线性代数知识的进一步理解及应用,Python软件强大的计算功能也会使线性代数中庞大的计算变得轻而易举,在线性代数的教学过程中,在适当时候把Python软件引入到教学中,引导学生学会使用Python解决计算问题,让学生能够把重心放在对理论知识的理解上,能有效提升教学效果,也能提高学生的实践应用能力,从而大大地提高了学生的学习积极性和教学效果 [2] 。
2. Python软件在线性代数中的应用举例
2.1. Python在解线性方程组中的应用
2.1.1. 消元法
对如下所示的线性方程组
(1)
利用线性方程组的初等变换,得到与原方程组(1)同解的方程组。用矩阵的初等变换,消掉方程组中各方程中的一些未知量,得到方程组解的过程,称为消元法 [3] 。
令方程组(1)的系数矩阵
,未知量矩阵
,常数矩阵
,则线性方程组(1)可表示为
,则线性方程组的消元解法可通过对增广矩阵
作有限次矩阵的三种行初等变换,有时也需作矩阵的第一种列初等变换,将其化为行最简阶梯型矩阵,即可得到原方程组的解。
2.1.2. 消元法的Python程序
依据消元法的一般步骤,分两步给出消元法的Python程序 [4] 。
第1步:消元
首先,导入numpy库,定义矩阵的三种初等变换,分别记为Q1,Q2,Q3;然后定义rowStep函数,用 while循环进行消元,直到系数矩阵成阶梯型,while循环结束,代码如附件1.1所示。
第2步:回代
回代过程与消元几乎一致,只是从下往上进行,得到最简行阶梯矩阵,代码如附件1.2所示。
例1 用消元法解线性方程组
。
解:将上述方程组的系数矩阵输入A,b,运行程序,即可得到如下结果:
1) 消元后结果如表1所示:
2) 回代后结果如表2所示:
由表1,表2可知,原方程组的解为
。
2.2. Python在实二次型相关问题中的应用
2.2.1. 利用正交变换化实二次型为标准型
用正交变换化实二次型
为标准型,主要有三个步骤,如下 [5] :
1) 写出二次型f的矩阵
,将A化为实对称矩阵;
2) 求n阶正交矩阵Q,使得
;
3) 正交变换化二次型为
。
上述步骤所对应的Python程序 [4] 如附件2.1所示。
例2求一正交变换,化二次型
为标准型。
解:上述二次型可化为
,将
代入程序,可得如表3所示的结果。
由表3可知,对角化后为
。
2.2.2. 实二次型正定性的判定
n阶对称矩阵A是正定的充分必要条件是A的特征值都大于零。
依据上述定理,给出判定实二次型正定的Python程序 [4] 如附件2.2所示。
例3判断
是否为正定二次型。
解:上述二次型可化为
,将
代入上述程序,可得如表4所示结果。
由表4结果可知,上述二次型为正定二次型。

Table 4. Eigenvalues of the quadratic form
表4. 二次型的特征值
2.3. Python在线性无关向量组正交化中的应用
欧氏空间V中的任一组线性无关的向量
都可以通过施密特正交化过程化为两两正交的向量
,且向量组
与
等价,施密特正交化过程如下 [5] :
由施密特正交化过程,给出正交化的Python代码:
例4设线性无关的向量组
,
,
,将
正交化。
解:将
代入上述程序中,可得如表5所示结果。
由表5可知,
正交化后
,
,
。
3. 结论
文章结合线性代数中的具体实例,探讨Python软件在解决线性代数问题中的应用,许多复杂的代数问题都可以通过编程实现,可以帮助实现做题过程的动态化展示,从而更深刻地理解解题思路和方法,通过写代码的过程,也可以让学生再次去理解和应用线性代数抽象的理论知识 [6] 。计算在线性代数的知识体系中占比很重,贯穿于线性代数学习的始终,还有很多问题可采用类似的方法去应用,使得Python和线性代数形成一个完整的互相促进的课程体系,可大大提高学生学习的积极性,增强数学的趣味性,实现复杂内容的简单化、抽象问题的具体化。
附录
1. 消元法的Python程序
1.1. 消元
import numpy as np #调用numpy
def Q1(M, i, j, row=True): #定义第一种初等变换
if row:
M[[i,j]]=M[[j,i]]
else:
M[:,[i,j]]=M[:,[j,i]]
def Q2(M,i,l, row=True): #定义第二种初等变换
if row:
M[i]=l*M[i]
else:
M[:,i]=l*M[:,i]
def Q3(m,i,j,l,row=True): #定义第三种初等变换
if row:
M[j]+=l*M[i]
else:
M[:,j]+=l*M[:,i]
def rowStep(M, m, n): #定义rowStep函数
rank=0
zero=m
i=0
order=np.array(range(n))
while i
flag=False
index=np.where(abs(M[i:,i])>1e-10)
if len(index[0])>0:
rank+=1
flag=True
k=index[0][0]
if k>0:
Q1(A,i,i+k)
else:
index=np.where(abs(M[i,i:n])>1e-10)
if len(index[0])>0:
rank+=1
flag=True
k=index[0][0]
Q1(M,i,i+k,row=False)
order[[i, k+i]]=order[[k+i, i]]
if flag:
Q2(M,i,1/M[i,i])
for t in range(i+1, zero):
Q3(M,i,t,-M[t,i])
i+=1
else:
Q1(M,i,zero-1)
zero-=1
return rank, order
M=np.array([[,,], #要求解方程组的系数矩阵,以3阶为例
b=np.array([,,]) #要求解方程组的常数项,以3阶为例
B=np.hstack((M,b.reshape(3,1)))
rank, order=rowStep(B,3,3)
print(B)
print(rank)
print(order)
1.2. 回代
def simplestStep(M,rank):
for i in range(rank-1,0,-1):
for j in range(i-1, -1,-1):
Q3(M,i,j,-M[j,i])
np.set_printoptions(suppress=True)
M=np.array([[,,], #要求解方程组的系数矩阵,以3阶为例
b=np.array([,,]) #要求解方程组的常数项,以3阶为例
B=np.hstack((M,b.reshape(3,1)))
rank, order=rowStep(B,3,3)
simplestStep(B,rank)
print(B)
2. 实二次型的Python程序
2.1. 正交变换化二次型为标准型
import numpy as np #调用numpy
np.set_printoptions(precision=4, suppress=True)
A=np.array([[,,], #二次型对应的矩阵
def symmetrization(A): #将矩阵A对称化
n,_=A.shape
for i in range(n):
for j in range(i+1,n):
A[i,j]=(A[i,j]+A[j,i])/2
A[j,i]=A[i,j]
symmetrization(A)
t,Q=np.linalg.eigh(A) #计算正交阵Q
print(t)
print(Q)
print(np.matmul(np.matmul(Q.T,A),Q))
2.2. 实二次型正定性的判定
import numpy as np #调用numpy
def symmetrization(A): #定义矩阵A对称化函数
n,_=A.shape
for i in range(n):
for j in range(i+1,n):
A[i,j]=(A[i,j]+A[j,i])/2
A[j,i]=A[i,j]
A=np.array([[,,], #二次型对应的矩阵
symmetrization(A) #对称化A
t=np.linalg.eigvalsh(A) #计算A的特征值
print(t)
3. Python在线性无关向量组正交化中的应用
正交化的Python代码
import numpy as np #调用numpy
def orthogonalize(M):
B=M.copy()
for i in range(1,m):
for j in range(i):
B[:,i]-=(np.dot(B[:,j],M[:,i])/np.dot(B[:,j],B[:,j]))*B[:,j]
return B #正交化结果
np.set_printoptions(precision=4, suppress=True)
M=np.array([[,,], #向量组矩阵
B=orthogonalize(M)
print(B)