怎么⽤matlab分解因式,MATLAB因式分解
4.1  因式分解
本节介绍线性代数的⼀些基本操作,包括⾏列式、逆和秩,LU分解和QR分解,以及范数等。其中LU分解和QR分解都是使⽤对⾓线上⽅或者下⽅的元素均为0的三⾓矩阵来进⾏计算。使⽤三⾓矩阵表⽰的线性⽅程组,可以通过向前或者向后置换很容易地得出结果。
4.1.1  ⾏列式、逆和秩
在MATLAB中,⽤户可以通过以下命令来计算矩阵A的⾏列式、逆和矩阵的秩。
(1)det(A):求⽅阵A的⾏列式。
(2)rank(A):求矩阵A的秩,即A中线性⽆关的⾏数和列数。
(3)inv(A):求⽅阵A的逆矩阵。如果A是奇异矩阵或者近似奇异矩阵,则会给出⼀个错误信息。
(4)pinv(A):求矩阵A的伪逆。如果A是m×n的矩阵,则伪逆的尺⼨为n×m。对于⾮奇矩阵A来说,有pinv(A)=inv(A)。
(5)trance(A):求矩阵A的迹,也就是对⾓线元素之和。
下⾯⽤具体⽰例对矩阵⾏列式、逆和秩作简要的说明。
【例4-1】  矩阵的⾏列式计算⽰例。
det函数可以⽤来计算矩阵的⾏列式。
>> A1=[1 2;3 4]          %  创建矩阵A1
1    2
3    4
>> A2=[1 2;3,6]          %  创建矩阵A2
1    2
3    6
>> A3=[1 2;3 4;5 6]      %  创建矩阵A3
1    2
3    4
5    6
>> det1=det(A1)          %  求⽅阵A1的⾏列式
>> det2=det(A2)          % 求⽅阵A2的⾏列式
>> det3=det(A3)          %  注意⾮⽅阵的⾏列式没有意义
Error using ==> det
Matrix must be square.
>> det_1=det(A1')        %  实数矩阵的⾏列式和它的转置的⾏列式相同
>> det_2=det(A2')
>> det_3=det(A3')
Error using ==> det
Matrix must be square.
本例使⽤det函数计算A3的⾏列式时返回了错误信息,提醒⽤户A3必须是是⽅阵才可以调⽤det函数。
【例4-2】  矩阵的逆计算⽰例。
本例在上例创建的矩阵基础上进⾏演⽰。
>> inv1=inv(A1)
-2.0000    1.0000
1.5000  -0.5000
>> inv2=inv(A2)              %  A2⾏列式为0,不存在逆矩阵
Warning: Matrix is singular to working precision.
Inf  Inf
Inf  Inf
>> inv3=inv(A3)              %  ⾮⽅阵不存在逆矩阵
Error using ==> inv
Matrix must be square.
>> detinv1=det(inv(A1))      %  A1的逆矩阵的⾏列式就等于1/det(A1)
>> 1/det(A1)
【例4-3】  使⽤pinv函数计算矩阵的伪逆⽰例。
>> pinv1=pinv(A1)  % A1的逆矩阵和它的伪逆是⼀样的
-2.0000    1.0000
1.5000  -0.5000
>> pinv2=pinv(A2)
0.0200    0.0600
0.0400    0.1200
>> pinv3=pinv(A3)
-1.3333  -0.3333    0.6667
1.0833    0.3333  -0.4167
本例调⽤pinv函数计算了矩阵A1、A2、A3的伪逆。因为矩阵A2⾏列式为0,矩阵A3不是⽅阵,所以不能求矩阵A2和A3的逆,但是可以求这两个矩阵的伪逆。
【例4-4】  使⽤rank函数求解矩阵的秩⽰例。
>> rank1=rank(A1)
>> rank2=rank(A2)
>> rank3=rank(A3)
>> rank_1=rank(A1')
>> rank_2=rank(A2')
>> rank_3=rank(A3')
从本例中可以看出矩阵的秩和它的转置的秩相同。
通过上⾯的这4个例⼦,可以总结出以下规律。
(1)只有⽅阵的⾏列式才有意义。
(2)只有⽅阵的逆才有意义,但如果⽅阵的⾏列式为0,该⽅阵则不存在逆矩阵。
(3)如果⽅阵的逆矩阵存在,它的伪逆和逆相同。
(4)如果⽅阵的逆矩阵存在,它的逆矩阵的⾏列式det(A-1)等于1/det(A)。
(5)矩阵的秩和它的转置的秩相同。
(6)实数矩阵的⾏列式和它的转置矩阵的⾏列式相同。
4.1.2  Cholesky因式分解
分解法是将原⽅阵分解成⼀个上三⾓形矩阵(或是以不同次序排列的上三⾓阵)和⼀个下三⾓形矩阵,这样的分解法⼜称为三⾓分解法,它主要⽤于简化⼤矩阵⾏列式值的计算过程、求逆矩阵和求解联⽴⽅程组。需要注意的是:这种分解法所得到的上下三⾓阵并不是唯⼀的,可以到多个不同的上下三⾓阵对,每对三⾓阵相乘都会得到原矩阵。
对线性系统的求解,MATLAB依据系数矩阵A的不同,⽽相应地使⽤不同的⽅法。如有可能,MATLAB会先分析矩阵的结构。例如A是对称且正定的,则使⽤Cholesky分解。
如果没有到可以替代的⽅法,则采⽤⾼斯消元法和部分主元法,主要是对矩阵进⾏LU因式分解或LU分解。这种⽅法就是令A=LU,其中A是⽅阵,U是⼀个上三⾓矩阵,L是⼀个带有单位对⾓线的下三⾓矩阵。
Cholesky因式分解是把⼀个对称正定矩阵A分解为⼀个上三⾓矩阵R和其转置矩阵的乘积,其对应的表达式为:A=R'R。从理论上说,并不是所有的对称矩阵都可以进⾏Cholesky因式分解,只有正定矩阵才可以。
Pascal矩阵就是⼀个有趣的例⼦。下⾯以Pascal矩阵为例,说明Cholesky因式分解的使⽤⽅法。
【例4-5】  Cholesky因式分解⽰例。
>> A = pascal(6)            % 创建Pascal矩阵
1    1    1    1    1    1
1    2    3    4    5    6
1    3    6    10    15  21
1    4  10    20    35  56
1    6  21    56  126  252
矩阵A的元素是⼆项式系数,每⼀个元素都是上⽅和左⽅两个元素的和。在MATLAB中,进⾏Cholesky因式分解的是chol函数。矩阵A的Cholesky因式分解可以通过以下命令得到:
>> R = chol(A)
1    1    1    1    1    1
0    1    2    3    4    5
0    0    1    3    6  10
0    0    0    1    4  10
0    0    0    0    1    5
0    0    0    0    0    1
得到的矩阵R的元素同样也是⼆项式系数。
Cholesky因式分解允许线性⽅程组A x = b被R’Rx=b代替。在MATLAB环境中,这个线性⽅程组可以通过以下命令来求解:
>> x=R\(R'\b)
4.1.3  LU因式分解
LU分解法主要⽤于简化⼤矩阵⾏列式值的计算过程、求逆矩阵和求解联⽴⽅程组。需要注意的是:这种分解法得到的上下三⾓阵对并不是唯⼀的,可以到多个不同的上下三⾓阵对,每对三⾓阵相乘都会得到原矩阵。
在MATLAB中,求矩阵A的LU分解的调⽤函数是lu,调⽤格式如下:
[L,U]=lu(A)
另外,矩阵A的LU分解为线性系统A*x=b提供了以下表达式来快速求解:
【例4-6】  矩阵A的LU分解⽰例。
>> A=[5 2 0;2 6 2;5 6 7]
5    2    0
2    6    2
5    6    7
>> [L,U]=lu(A)              %  分解所得L是带有单位对⾓线的下三⾓矩阵,U是上三⾓矩阵
1.0000        0        0
0.4000  1.0000        0
1.0000    0.7692    1.0000
5.0000    2.0000        0
0    5.2000    2.0000
0        0    5.4615
>> L*U                          %  验证结果
5    2    0
2    6    2
5    6    7
【例4-7】  矩阵A的LU分解实例。
>> A=[1 2 3;4 5 6;7 8 9];
>> [L,U]=lu(A);
>> B=[9 8 7;6 5 4; 3 2 1];
>> x=U\(L\B)
Warning: Matrix is close to singular or badlyscaled.
Results may be inaccurate. RCOND =1.e-017.
-27  -26  -17
42    41  24
-16  -16  -8
>> A*x          % 验证结果
9    8    7
6    5    4
3    2    1
4.1.4  QR因式分解
如果A是正交矩阵,那么它满⾜A’A=1。⼆维坐标旋转变换矩阵就是⼀个简单的正交矩阵:
矩阵的正交分解⼜称做QR分解,是将矩阵分解成⼀个单位正交矩阵和上三⾓形矩阵。假设A是m×n的矩阵,那么A就可以分解成:
其中Q是⼀个正交矩阵,R是⼀个维数和A相同的上三⾓矩阵,因此Ax=B可以表⽰为QRx=B或者等同于Rx=QB。这个⽅程组的系数矩阵是上三⾓的,因此容易求解。
在MATLAB中,⽤户可以调⽤函数qr来求QR因式分解,这个命令可⽤于分解m×n的矩阵,假设A是m×n的矩阵。qr函数常⽤调⽤格式有以下⼏种。
(1)[Q,R]=qr(A):求得m×m阶矩阵Q和m×n阶上三⾓矩阵R。Q和R满⾜A=QR。
(2)[Q,R,P]= qr(A):求得矩阵Q,上三⾓矩阵R和置换矩阵P。R的对⾓线元素按⼤⼩降序排列,且满⾜AP=QR。
(3)[Q,R]= qr(A,0):求矩阵A的QR因式分解。如果在m×n的矩阵A中⾏数⼩于列数,则给出Q的前n列。
(4)[Q1,R1]=gradelete(Q,R,j):求去掉矩阵A中第j列之后形成的矩阵的QR因式分解,矩阵Q和R是A的QR因⼦。
(5)[Q1,R1]=qrinset(Q,R,b,j):求在矩阵A的第j列前插⼊列向量b后形成的矩阵的QR因式分解,矩阵Q和R是A的QR因⼦。如果j=n+1,那么插⼊的⼀列放在最后。
【例4-8】  QR分解⽰例。已知魔⽅矩阵
对其进⾏QR分解。
⽤户只需要调⽤qr函数就可以实现对A进⾏QR分解。具体过程如下:
>> A=magic(3)
8    1    6
3    5    7
4    9    2
rank函数怎么用>> [Q,R]=qr(A)              %  QR分解
-0.8480    0.5223  0.0901
-0.3180  -0.3655  -0.8748
-0.4240  -0.7705    0.4760
-9.4340  -6.2540  -8.1620
0  -8.2394  -0.9655
0        0  -4.6314
>> Q*R                    %  验证结果