版权声明:<–本博客所有内容均为自己在学习工作中的总结、摘录等-- --转载请注明出处-- --如有侵权请联系删除–> https://blog.csdn.net/ai359005521/article/details/85068305
资源中包含了行列式因子、不变因子、初等因子、smith标准型、Jordan标准型、最小多项式的matlab实现。运行环境为matlab R2017
行列式因子、不变因子、初等因子、smith标准型、Jordan标准型、最小多项式的matlab实现
一下是代码实现
1.求矩阵A的smith标准型、行列式因子、初等因子、不变因子、最小多项式和jordan标准型
%all--得到矩阵A的smith标准型、行列式因子、初等因子、不变因子、最小多项式和jordan标准型
A = input('A = '); %获取矩阵A
n = size(A,1); %将矩阵A的行数赋值给n
syms x; %声明变量x
E = eye(n); %E为n阶的单位矩阵
C = x*E-A; %C为矩阵A的特征矩阵
%1---求lambda矩阵的行列式因子(开始)
h = [];
for k = 1:n
y = [];
%从n个元素(第一个元素到第n个元素的所有元素)中取出k项,其中所有可能的组合放在p中(组合数)
p = nchoosek(1:n,k); q = p;
m = size(p,1);
%1-b将所有的i阶行列式求出
for i = 1:m
a = p(i,:);
for j = 1:m
b = q(j,:);
B = [];
for s = 1:k
g = [];
for t = 1:k
g = [g,C(a(s),b(t))];
end
B=[B;g];
end
if det(B) ~= 0
y = [y,det(B)];
end
end
end
%1-b结束
o = size(y,2);
%1-a--求所有j阶行列式的最大公因子(开始)
for j = 1:o-1
y(j+1) = gcd(y(j),y(j+1));
end
%1-a--结束
h = [h,y(o)];
end
%1---求lambda矩阵的行列式因子(结束)
d = [];
d = [d,h(1)];
for i = 2:n
% d = [d,factor(h(i)/h(i-1))];
d = [d,expand(h(i)/h(i-1))];
end
%2---将上面所求行列式因子进行因式分解,得到因式分解后的行列式因子
k = size(h,2);
for i = 1:k
t = h(i);
t = factor(t);
l = size(t,2);
h(i)=1;
h(i) = h(i)*t(j);
end
end
%2---结束
%3---将上面所求不变因子进行因式分解,得到因式分解后的不变因子
k = size(d,2);
for i = 1:k
t = d(i);
t = factor(t);
l = size(t,2);
d(i)=1;
for j = 1:l
d(i) = d(i)*t(j);
end
end
%3---结束
min_poly = d(k); %由定理知,在A为n*n的矩阵中,A的最小多项式为A的第n个不变因子dn(lambda)
%4---求初等因子(通过不变因子得到初等因子)
%5---将不变因子的每一项分别进行因式分解
%(把每一项中因式分解中相同的元素相乘,不相同的元素分离,分别放在统一数组的不同位置)
u = size(d,2);
y = [];
for r = 1:u
a = d(r);
a = factor(a);
b = unique(a);
n = size(a,2);
m = size(b,2);
c= [];
for i = 1:m
k = 0;
for j = 1:n
if (b(i) == a(j))
k = k+1;
end
end
c = [c,b(i).^k];
end
y = [y,c];
end
%5--结束
%6---将上面不变因子因式分解又组合后的数组中的1剔除,便的到了初等因子
s = size(y,2);
for v = s:-1:1
if y(v) == 1
y(v) = [];
end
end
%6---结束
%4---结束
smith = diag(d);
j = jordan(A);
fprintf("smith标准型为:\n");
smith
fprintf("行列式因子为:\n");
h
fprintf("不变因子为:\n");
d
fprintf("初等因子为:\n");
y
fprintf("最小多项式为:\n");
min_poly
fprintf("jordan标准型为:\n");
j
%all---结束
2.用辗转相除法求两个多项式的最大公因式
%all--用辗转相除法求两个多项式的最大公因式
function g = gcd(a,b) %a、b分别为两个多项式的系数,g是a、b的最大公因式
for i=1:100
%1--将a和b的最高次数进行比较,将最高次数较高的多项式赋给a
sizei = size(a);
size1 = sizei(2);
sizei = size(b);
size2 = sizei(2);
if(size1<size2)
c = a;
a = b;
b = c;
end
%1--结束
%用多项式a除多项式b,得到商为q,余r
[q,r] = deconv(a,b);
sizei = size(r);
size3 = sizei(2);
if r(size3)~=0
r(r==0)=[];
end
if r == 0
g = b;
break;
end
a = b;
b = r;
end
g = g/g(1,1);
end
%all--结束
运行结果