行列式因子、不变因子、初等因子、smith标准型、Jordan标准型、最小多项式的matlab实现

版权声明:<–本博客所有内容均为自己在学习工作中的总结、摘录等-- --转载请注明出处-- --如有侵权请联系删除–> 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--结束

运行结果
在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值