Julia求矩阵特征向量
填坑。上一篇Julia的学习笔记,使用QR分解求矩阵的特征值。但是仅求出了方阵的特征值,而没有求出特征向量。在此使用特征值求解对应的特征向量。
根据特征值和特征向量的定义: A x = λ x Ax=\lambda x Ax=λx,可以化简为 ( A − λ I ) x = 0 (A-\lambda I)x =0 (A−λI)x=0,也即是求解出特征值 λ \lambda λ对应的特征向量 x x x。本质上,向量 x x x对应于矩阵 A − λ I A-\lambda I A−λI的零空间中的向量。
对于矩阵零空间的求解,在MATLAB中封装的有null()函数,也可使用rref()函数将矩阵转化为最简形式,再进行回代求解。在Julia中可以使用LinearAlgebra中的nullspace()函数求出矩阵的零空间。
在此,自己想练习写一个零空间求解函数。主要思想是对矩阵使用高斯消元法,进行初等行变换,化为最简形式,然后利用回代求解出矩阵零空间的基向量。
主要思路:
-
- 高斯消元,初等行变换
-
- 回代求解
-
- 特征向量正交化
1.高斯消元,初等行变换
function gauss_reduction(A) #在此不指定类型
#第一步 矩阵的高斯消元
#两层循环
A=collect(Float64,A) #需要进行数值转化一下,如果整数/浮点数,会报错
m,n=size(A)
for k in 1:min(m,n) #最小索引
#Step1----先对矩阵进行 行交换
for i in k:m #行索引
if abs(A[i,k])>10*eps() #利用绝对值
A[i,:],A[k,:]=A[k,:],A[i,:]#第i行和第k行交换
break
end
end
# Step 2----高斯消元
if abs(A[k,k])>10*eps()
A[k,:]=A[k,:]./A[k,k] #除以首元
if k!=m
#对于后面的行高斯消元
for j in k+1:m
A[j,:]=A[j,:]-A[j,k].*A[k,:]
end
end
end
end
# Step 3----回代消元
for index in min(m,n):-1:1
for t in index-1:-1:1
A[t,:]=A[t,:]-A[t,index].*A[index,:]
end
end
#递归
if maximum(abs.(A[:,1]))<10*eps()
return hcat(zeros(m,1),gauss_reduction(A[:,2:end]))
else
return A
end
end
测试结果如下所示:
2.回代求解
对矩阵进行高斯消元后的矩阵,对于非零行,每一行的第一个非零元素一定为1。此时的矩阵按行中非零元素的多少,可以划分为三类。第一类行向量中具有多个非零元素;第二类行向量中只有一个非零元素;第三类为行向量为全零向量。
关键点是,找出自由变量 x i x_{i} xi的数量。对于未知向量 x x x其维度等同于矩阵