MATLAB基础篇——线性代数应用

MATLAB基础篇——基础语法介绍了有关矩阵的基本运算和线性代数中的一些基本问题。这里我们再讨论如下问题:1.求向量组的极大线性无关组;2.化二次型为标准形;3.判断二次型的正定性;4.解线性方程组

向量组的极大线性无关组

通过向量组的秩来讨论向量组的线性相关性。由于矩阵的秩=行秩=列秩,所以求向量组的秩相当于求由向量组作为列(行)向量构建的矩阵的秩——通过rank函数,再利用rref函数可以得到该矩阵的标准阶梯形矩阵,从而得到向量组的极大线性无关组,及其他向量用该极大线性无关组的表示


a1=[2 1 3 2];
a2=[3 2 -2 -3];
a3=[1 0 8 7];
a4=[-3 -2 3 4];
a5=[-7 -4 0 3];
A=[a1;a2;a3;a4;a5]';  %转置作为列向量
rank(A)
rref(A)   

% 秩为3
ans =

     3

% a1' ,a2',a4'作为极大线性无关组,a3=2*a1-a2,a5=-2*a1+3*a2+4*a4
ans =

     1     0     2     0    -2
     0     1    -1     0     3
     0     0     0     1     4
     0     0     0     0     0

化二次型为标准形

线代里面,我们学习到化二次型 f = x T A x f=x^TAx f=xTAx为标准形 f = y T B y f=y^TBy f=yTBy的过程就是二次型的实对称矩阵 A A A正交相似化的过程,二次型标准形的系数就是 A A A的特征值 λ 1 , . . . , λ n \lambda_1,...,\lambda_n λ1,...,λn,即 B = d i a g ( λ 1 , . . . , λ n ) B=diag(\lambda_1,...,\lambda_n) B=diag(λ1,...,λn),由 A A A的特征值构成的对角阵,而该线性变换 x = P y x=Py x=Py中的 P P P为特征值对应的特征向量,所以该问题转化为求实对称矩阵 A A A的特征值和特征向量——通过eig函数

%eig(A),e=eig(A) 得到A的特征值构成的列向量
%[P,E]=eig(A) P为特征向量作为列向量构成的矩阵,E为对角线元素为特征值的对角阵
%注意,若A为实对称矩阵,则得到的特征向量矩阵是正交矩阵

clear
clc
A=[-5 2 2;2 -6 0;2 0 -4];  %二次型的实对称矩阵
[P,E]=eig(A);
syms y1 y2 y3
y=[y1;y2;y3];
x=P*y; %线性变换(正交变换)
f1=x'*A*x; %原二次型
f2=y'*E*y;  %标准二次型

二次型的正定性

在线性代数的学习中,可以知道二次型的正定性判断可以通过二次型的实对称矩阵的特征值或者顺序主子式来判断。

二次型的分类:

正定性定义特征值顺序主子式
正定 ∀ \forall x≠0,f= x T A x > 0 x^TAx>0 xTAx>0 ∀ λ k \forall \lambda_k λk>0 ∀ A k \forall A_k Ak>0
负定 ∀ \forall x≠0,f= x T A x < 0 x^TAx<0 xTAx<0 ∀ λ k \forall \lambda_k λk<0 ∀ A k \forall A_k Ak>0, k k k为偶, ∀ A k \forall A_k Ak<0, k k k为奇
半正定 ∀ \forall x≠0,f= x T A x ≥ 0 x^TAx≥0 xTAx0 ∀ λ k \forall \lambda_k λk≥0 ∀ A k \forall A_k Ak≥0
半负定 ∀ \forall x≠0,f= x T A x ≤ 0 x^TAx≤0 xTAx0 ∀ λ k \forall \lambda_k λk≤0 ∀ A k \forall A_k Ak≥0, k k k为偶, ∀ A k \forall A_k Ak≤0, k k k为奇
不定 ∀ \forall x≠0,存在f>0,也存在f<0<0,>0不满足其他类型即是不定

clear
clc
A=[2 0 0;0 3 2;0 2 3];
%特征值法
e=eig(A)
if all(e>0)
    fprintf('正定');
elseif all(e<0)
    fprintf('负定');
elseif all(e>=0)
    fprintf('半正定');
elseif all(e<=0)
    fprintf('半负定');
else
    fprintf('不定');
end

%顺序主子式
Ak=[];
for i=1:length(A)
    Ak(i)=det(A(1:i,1:i));
end
Ak  %   2     6    10都大于0,为正定


%改进版
clear
n=length(A);
d=zeros(1,n);
for i=1:n
    d(i)=det(A(1:i,1:i));
end
d
c1=zeros(1,3);%记录偶顺序主子式>0,<0,=0
c2=zeros(1,3);%记录奇顺序主子式
for i=1:n
    if mod(i,2)==0
        if d(i)>0
            c1(1)=c1(1)+1;
        elseif d(i)<0
            c1(2)=c1(2)+1;
        else
            c1(3)=c1(3)+1;
        end
    else
         if d(i)>0
            c2(1)=c2(1)+1;
        elseif d(i)<0
            c2(2)=c2(2)+1;
        else
            c2(3)=c2(3)+1;
        end
    end   
end
c1
c2
if c1(1)+c2(1)==n
    disp('正定')
elseif c1(1)==fix(n/2) & c2(2)==n-fix(n/2)
    disp('负定')
elseif c1(1)+c1(3)+c2(1)+c2(3)==n
    disp('半正定')
elseif c1(1)+c1(3)==fix(n/2) & c2(2)+c2(3)==n-fix(n/2)
    disp('半负定')
else
    disp('不定')
end


解线性方程组

在线性代数的学习中,我们知道方程组解的情况及其判断,设 A A A为线性方程组的系数矩阵, B B B为线性方程组的增广矩阵,方程组变量个数为n(讨论的是方程个数 ≤ n ≤n n)则对于方程组 A x = b Ax=b Ax=b
c a s e 1 : case1: case1 R ( A ) = R ( B ) = n R(A)=R(B)=n R(A)=R(B)=n,有唯一解,
c a s e 2 : case2: case2 R ( A ) = R ( B ) < n R(A)=R(B)<n R(A)=R(B)<n,有无穷多个解,
c a s e 3 : case 3: case3 R ( A ) ≠ R ( B ) R(A)≠R(B) R(A)=R(B),无解
则求线性方程组解的问题转化为求方程组系数矩阵及增广矩阵的秩的问题
对于 c a s e 1 , A case1,A case1,A满秩,直接利用 x = A x=A x=A \ b b b i n v ( A ) ∗ b inv(A)*b inv(A)b 得到解
对于 c a s e 2 case2 case2, 可以利用 r r e f ( B ) rref(B) rref(B)得到阶梯形方程组的增广矩阵,进一步得到方程的基础解系


clear
clc
A=[1 -2 3 1 1;1 1 -1 -1 -2;2 -1 1 0 -2;2 2 5 -1 1];
b=[7;2;7;18];
B=[A b];
n=length(A);
RA=rank(A);RB=rank(B);
if RA==RB
    if RA==n
        fprintf('有唯一解')
        x=A\b
    else
        fprintf('有无穷多个解')
        d=rref(B)
    end
else
    fprintf('无解');
end


% 求解结果
有无穷多个解
d =

     1     0     0     0    -2     3
     0     1     0     0    -1     1
     0     0     1     0     1     2
     0     0     0     1    -2     0

当一个齐次线性方程组有无穷多个解时,可以利用null函数求其基础解系,null返回的矩阵的列向量组即为方程组的基础解系,而有无穷多个解的非齐次方程组可以利用pinv函数求得一个特解,再利用null求相应齐次方程组的基础解系,从而得到非齐次方程组的通解

%齐次方程组
clear
clc
A=[1 1 1 4 -3;2 1 3 5 -5;1 -1 3 -2 -1;3 1 5 6 -7]; %齐次方程组系数矩阵
if rank(A)==length(A)
    fprintf('有唯一解,即零解')
else
    fprintf('有无穷多个解,即有非零解')
    K=null(A,'r')
    %把解表示成x=k_1x_1+k_2x_2+...+k_nx_n
    syms k 
    x=0;
    for i=1:length(A)-rank(A)
        k(i)=strcat('k',num2str(i));
        x=x+k(i)*K(:,i);
    end
    x
end

%结果
x =
 
 2*k3 - k2 - 2*k1
   k1 - 3*k2 + k3
               k1
               k2
               k3
% 非齐次方程组
clear
clc
A=[1 5 -1 -1;1 -2 1 3;3 8 -1 1;1 -9 3 7];
b=[-1;3;1;7];
B=[A b];
RA=rank(A);
RB=rank(B);
n=length(A(1,:));
if RA==RB
    if RA==n
        fprintf('有唯一解')
        x=A\b;
    else
        fprintf('有无穷多个解')
        r=pinv(A)*b;  %特解
        K=null(A,'r'); %齐次方程组的基础解系
        %把解表示成x=r+k_1x_1+k_2x_2+...+k_nx_n
        syms k 
        x=r;
        for i=1:length(K(1,:))
            k(i)=strcat('k',num2str(i));
            x=x+k(i)*K(:,i);
        end
        x
    end
else
    fprintf('无解')
end
  • 0
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yun_gao_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值