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. 高斯消元,初等行变换
    1. 回代求解
    1. 特征向量正交化

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其维度等同于矩阵

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值