在Matlab中不用eig()命令求方阵的特征值和特征向量矩阵,并判断其是否可以对角化
#本文仅针对标题所示问题的代码解答,若相关概念不熟,请去资料。
#不要问我为什么放着好好的eig()命令不用,反而去写一堆代码。这得去问我们的好老师(/(ㄒoㄒ)/~~)。
思路:
1、先得到输入值A的维度大小,判断其是否为方阵;
2、生成与A同维度的一个单位矩阵,由(λE-A)x=0解得特征值λ;
3、将每个特征值λ带入原式,解齐次线性方程组,得到基础解系;
4、将每个基础解系合并,并去掉相同列向量,即可得到特征向量矩阵;
代码实现:
function [v,d]=tzz(A)
syms v
n=size(A);
d=[];
if n(1)~=n(2) %判断A是否为方阵
fprintf('输入的不是方阵,请重新输入A');
v=[];
else
v=solve(@(v)det(v.*eye(n)-A)) %方阵A的特征值
for i=1:n(1)
di=null((v(i).*eye(n)-A))'; %通过循环结构求解每个特征值对应的齐次
%线性方程组的基础解系并转置为行向量
d=[d;di]; %将所有基础解系合并
end
d=(unique(d,'rows'))' %删除相同的行向量并转置回列向量
end
if n==size(d)
fprintf('方阵A可以对角化');
else
fprintf('方阵A不能对角化');
end
end
实例:
A=[1,2,2;2,1,2;2,2,1]
#相关函数及其功能请自行搜索查询