矩阵的逆及求逆矩阵的方法,可逆矩阵定理与判定方法,(非)奇异矩阵,方程Ax=b解法,Hilbert矩阵及其逆的求法,条件数(Condition Number)及其计算方法

  • Post author:
  • Post category:其他



矩阵的逆的定义

:一个



n

×

n

n\times n






n




×








n





的矩阵



A

A






A





是可逆的,如果存在一个



n

×

n

n\times n






n




×








n





的矩阵



C

C






C





使得:





C

A

=

I

,

A

C

=

I

CA=I, 且 AC=I






C


A




=








I


,







A


C




=








I







其中



I

=

I

n

I=I_n






I




=









I










n

























n

×

n

n\times n






n




×








n





的单位矩阵,此时矩阵



C

C






C





就是矩阵



A

A






A





的逆,矩阵



A

A






A





的逆记为矩阵



A

1

A^{-1}







A














1













。若矩阵



A

A






A





可逆,那么它的逆是唯一的。


奇异矩阵与非奇异矩阵:


不可逆矩阵有时也叫奇异矩阵,可逆矩阵有时也成为非奇异矩阵。


求矩阵逆的方法:






n

×

n

n\times n






n




×








n





的方阵



A

A






A





与同样是



n

×

n

n\times n






n




×








n





的单位矩阵



I

I






I





排在一起,构成增广矩阵



[

A

I

]

[A \qquad I]






[


A




I


]





,对此增广矩阵进行初等行变换,直到化简为



[

I

A

1

]

[I \qquad A^{-1}]






[


I





A














1










]





,这样矩阵



A

A






A





的逆



A

1

A^{-1}







A














1













就出现在增广矩阵右边。如果不能做如上化简,则表明矩阵



A

A






A





没有逆。



可逆矩阵定理

假设矩阵



A

A






A









n

×

n

n\times n






n




×








n





的方阵,以下命题是等价的,即它们同时为真或同时为假:




  1. A

    A






    A





    是可逆矩阵;




  2. A

    A






    A





    行等价于



    n

    n






    n





    阶单位阵(即



    A

    A






    A





    经过若干次初等行变换可以变成



    n

    n






    n





    阶的



    I

    I






    I





    );

  3. A有



    n

    n






    n





    个主元位置;

  4. 方程



    A

    x

    =

    0

    Ax=0






    A


    x




    =








    0





    仅有平凡解;




  5. A

    A






    A





    的各列线性无关;

  6. 线性变换



    x

    A

    x

    x|\rightarrow Ax






    x
















    A


    x





    是一对一的;





  7. R

    n

    R^n







    R










    n












    中任意



    b

    b






    b





    ,方程



    A

    x

    =

    b

    Ax=b






    A


    x




    =








    b





    至少有一个解;




  8. A

    A






    A





    的各列生成



    R

    n

    R^n







    R










    n












  9. 线性变换



    x

    A

    x

    x|\rightarrow Ax






    x
















    A


    x









    R

    n

    R^n







    R










    n












    映射到



    R

    n

    R^n







    R










    n












  10. 存在



    n

    ×

    n

    n\times n






    n




    ×








    n





    矩阵



    C

    C






    C





    使得



    C

    A

    =

    I

    CA=I






    C


    A




    =








    I





  11. 存在



    n

    ×

    n

    n\times n






    n




    ×








    n





    矩阵



    D

    D






    D





    使得



    A

    D

    =

    I

    AD=I






    A


    D




    =








    I








  12. A

    T

    A^T







    A










    T












    是可逆矩阵;




  13. A

    A






    A





    的列向量构成



    R

    n

    R^n







    R










    n












    的一个基;




  14. C

    o

    l

     

    A

    =

    R

    n

    Col\space A=R^n






    C


    o


    l




    A




    =









    R










    n















  15. d

    i

    m

    C

    o

    l

     

    A

    =

    n

    dimCol\space A=n






    d


    i


    m


    C


    o


    l




    A




    =








    n








  16. r

    a

    n

    k

    A

    =

    n

    rankA=n






    r


    a


    n


    k


    A




    =








    n








  17. N

    u

    l

    A

    =

    {

    0

    }

    NulA=\{0\}






    N


    u


    l


    A




    =








    {



    0


    }








  18. d

    i

    m

    N

    u

    l

     

    A

    =

    0

    dimNul\space A=0






    d


    i


    m


    N


    u


    l




    A




    =








    0






判断矩阵可逆的方法:


判断矩阵可逆的方法有很多,例如:

  1. 行列式判别法:若一个矩阵行列式不为零,则可逆;若行列式等于零,则不可逆。




  2. n

    ×

    n

    n\times n






    n




    ×








    n





    的矩阵



    A

    A






    A





    是可逆的,则对每一



    R

    n

    R^n







    R










    n












    中的



    b

    b






    b





    ,方程



    A

    x

    =

    b

    Ax=b






    A


    x




    =








    b





    有唯一解



    x

    =

    A

    1

    b

    x=A^{-1}b






    x




    =









    A














    1










    b







解方程



A

x

=

b

Ax=b






A


x




=








b





三种方法:

  1. 如果



    n

    ×

    n

    n\times n






    n




    ×








    n





    的矩阵



    A

    A






    A





    是可逆的,那么可以用MATLAB中的反斜杠求解:



    x

    =

    A

    \

    b

    x=A \backslash b






    x




    =








    A


    \


    b




A =
     1     2
     4     7

>> [n,n] = size(A)
n =
     2
n =
     2

>> b = rand(n,1)
b =
    0.5469
    0.9575
    
>> x1= A\b     //MATLAB中使用反斜杠“\”法直接求x
x1 =
   -1.9132
    1.2300
  1. (此方法通用性好)不论矩阵



    A

    A






    A





    是否可逆的,可以先把矩阵



    A

    A






    A





    和矩阵



    b

    b






    b





    构成增广矩阵



    [

    A

    b

    ]

    [A \qquad b]






    [


    A




    b


    ]





    ,再把此增广矩阵化简为简化阶梯阵即可。

>> C = [A b]
C =
    1.0000    2.0000    0.5469
    4.0000    7.0000    0.9575
    
>> rref(C)   // MATLAB中rref函数将矩阵化简为简化阶梯阵。
ans =
    1.0000         0   -1.9132
         0    1.0000    1.2300

可见,化简得到的简化阶梯阵最后一列



[

1.9132

1.2300

]

\begin{bmatrix}-1.9132\\1.2300\end{bmatrix}








[
















1


.


9


1


3


2








1


.


2


3


0


0




















]







即为方程的解,与方法1结果相同。

  1. 如果



    n

    ×

    n

    n\times n






    n




    ×








    n





    的矩阵



    A

    A






    A





    是可逆的,可以求矩阵



    A

    A






    A





    的逆



    A

    1

    A^{-1}







    A














    1













    ,则方程的解为:



    x

    =

    A

    1

    b

    x=A^{-1}b






    x




    =









    A














    1










    b




A =
     1     2
     4     7
     
>> Ai = inv(A)    //函数inv求矩阵A的逆
Ai =
    -7     2
     4    -1
     
>> x2 = Ai * b
x2 =
   -1.9132
    1.2300

可见解得的结果与上面两种方法相同。


关于Hilbert矩阵及其逆的求法:


该矩阵为方阵,中任意元素表示为



A

i

j

=

1

i

+

j

1

A_{ij}=\frac {1}{i+j-1}







A











i


j





















=




















i


+


j





1
















1
























。Hilbert矩阵是

高度病态

的,任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化,病态程度和阶数相关。

Hilbert矩阵(



H

H






H





)阶数越大,其病态程度越严重,使用浮点数计算来解方程



H

x

=

b

Hx=b






H


x




=








b





的误差就越大。

MATLAB里面有内置函数

invhilb(n)

来计算n阶Hilbert矩阵的逆,输出的解为

精确解

,如下:

>> H = hilb(5)   //生成5阶Hilbert矩阵
H =
       1              1/2            1/3            1/4            1/5     
       1/2            1/3            1/4            1/5            1/6     
       1/3            1/4            1/5            1/6            1/7     
       1/4            1/5            1/6            1/7            1/8     
       1/5            1/6            1/7            1/8            1/9 
       
>> invhilb(5)   //5阶Hilbert矩阵逆的精确解
ans =
      25           -300           1050          -1400            630       
    -300           4800         -18900          26880         -12600       
    1050         -18900          79380        -117600          56700       
   -1400          26880        -117600         179200         -88200       
     630         -12600          56700         -88200          44100      




病态矩阵与良态矩阵:

一个可逆矩阵是病态的(ill-conditioned),即中的某些元素稍作改变就会变成奇异矩阵(不可逆矩阵),矩阵的逆和以其为系数矩阵的方程组的解对微小的扰动十分敏感,这类矩阵叫病态矩阵,或接近奇异的矩阵。这类矩阵会给数值求解带来很大困难。

矩阵病态的反面是

良态

(well-conditioned),关于良态矩阵与病态矩阵的判断,可以使用

条件数

(Condition Number)作为依据,见下文。

在MATLAB中实现上面三种方法,对于求解存在该类矩阵的方程(如



A

x

=

b

Ax=b






A


x




=








b









A

A






A





为Hilbert矩阵),

精确度都是不太够的

,可能会有warning。

>> A = hilb(20)   //生成20阶的Hilbert矩阵
A =
  Columns 1 through 5
       1              1/2            1/3            1/4            1/5     
       1/2            1/3            1/4            1/5            1/6     
       1/3            1/4            1/5            1/6            1/7     
       1/4            1/5            1/6            1/7            1/8     
       1/5            1/6            1/7            1/8            1/9     
       1/6            1/7            1/8            1/9            1/10    
       1/7            1/8            1/9            1/10           1/11    
       1/8            1/9            1/10           1/11           1/12    
       1/9            1/10           1/11           1/12           1/13    
       1/10           1/11           1/12           1/13           1/14    
       1/11           1/12           1/13           1/14           1/15    
       1/12           1/13           1/14           1/15           1/16    
       1/13           1/14           1/15           1/16           1/17    
       1/14           1/15           1/16           1/17           1/18    
       1/15           1/16           1/17           1/18           1/19    
       1/16           1/17           1/18           1/19           1/20    
       1/17           1/18           1/19           1/20           1/21    
       1/18           1/19           1/20           1/21           1/22    
       1/19           1/20           1/21           1/22           1/23    
       1/20           1/21           1/22           1/23           1/24    
  Columns 6 through 10
       1/6            1/7            1/8            1/9            1/10    
       1/7            1/8            1/9            1/10           1/11    
       1/8            1/9            1/10           1/11           1/12    
       1/9            1/10           1/11           1/12           1/13    
       1/10           1/11           1/12           1/13           1/14    
       1/11           1/12           1/13           1/14           1/15    
       1/12           1/13           1/14           1/15           1/16    
       1/13           1/14           1/15           1/16           1/17    
       1/14           1/15           1/16           1/17           1/18    
       1/15           1/16           1/17           1/18           1/19    
       1/16           1/17           1/18           1/19           1/20    
       1/17           1/18           1/19           1/20           1/21    
       1/18           1/19           1/20           1/21           1/22    
       1/19           1/20           1/21           1/22           1/23    
       1/20           1/21           1/22           1/23           1/24    
       1/21           1/22           1/23           1/24           1/25    
       1/22           1/23           1/24           1/25           1/26    
       1/23           1/24           1/25           1/26           1/27    
       1/24           1/25           1/26           1/27           1/28    
       1/25           1/26           1/27           1/28           1/29    
  Columns 11 through 15
       1/11           1/12           1/13           1/14           1/15    
       1/12           1/13           1/14           1/15           1/16    
       1/13           1/14           1/15           1/16           1/17    
       1/14           1/15           1/16           1/17           1/18    
       1/15           1/16           1/17           1/18           1/19    
       1/16           1/17           1/18           1/19           1/20    
       1/17           1/18           1/19           1/20           1/21    
       1/18           1/19           1/20           1/21           1/22    
       1/19           1/20           1/21           1/22           1/23    
       1/20           1/21           1/22           1/23           1/24    
       1/21           1/22           1/23           1/24           1/25    
       1/22           1/23           1/24           1/25           1/26    
       1/23           1/24           1/25           1/26           1/27    
       1/24           1/25           1/26           1/27           1/28    
       1/25           1/26           1/27           1/28           1/29    
       1/26           1/27           1/28           1/29           1/30    
       1/27           1/28           1/29           1/30           1/31    
       1/28           1/29           1/30           1/31           1/32    
       1/29           1/30           1/31           1/32           1/33    
       1/30           1/31           1/32           1/33           1/34    
  Columns 16 through 20
       1/16           1/17           1/18           1/19           1/20    
       1/17           1/18           1/19           1/20           1/21    
       1/18           1/19           1/20           1/21           1/22    
       1/19           1/20           1/21           1/22           1/23    
       1/20           1/21           1/22           1/23           1/24    
       1/21           1/22           1/23           1/24           1/25    
       1/22           1/23           1/24           1/25           1/26    
       1/23           1/24           1/25           1/26           1/27    
       1/24           1/25           1/26           1/27           1/28    
       1/25           1/26           1/27           1/28           1/29    
       1/26           1/27           1/28           1/29           1/30    
       1/27           1/28           1/29           1/30           1/31    
       1/28           1/29           1/30           1/31           1/32    
       1/29           1/30           1/31           1/32           1/33    
       1/30           1/31           1/32           1/33           1/34    
       1/31           1/32           1/33           1/34           1/35    
       1/32           1/33           1/34           1/35           1/36    
       1/33           1/34           1/35           1/36           1/37    
       1/34           1/35           1/36           1/37           1/38    
       1/35           1/36           1/37           1/38           1/39    

>> b = rand(20,1)   //生成b向量
b =
     687/712   
     589/3737  
    6271/6461  
     581/607   
     614/1265  
    1142/1427  
     689/4856  
     407/965   
    1065/1163  
      61/77    
    1966/2049  
    3581/5461  
     489/13693 
     439/517   
     283/303   
    1481/2182  
     979/1292  
     541/728   
    1645/4194  
    1406/2145  
    
>> x1 = A\b  //反斜杠法求解x=A\b
Warning: Matrix is close to singular or badly scaled. Results may be
inaccurate. RCOND =  5.231543e-20.     //此处为Warning,
 
x1 =
-3424659463       
528255780716       
-19975903782848       
321018859628437       
-2688760131266522       
12761814815871434       
-34399090053517208       
45897097341921456       
-7254237859641766       
-37322034685407312       
-49284163552153728       
217508096052998944       
-205446702755182752       
64773453754244512       
-105964986075521504       
193373000517961920       
-30851727609549800       
-163776311038511840       
135720005301748528       
-33347024092943792 


R = rref([A b]); x3 = R(:,21) //方法2求解,化简阶梯阵的方法,此方法最通用,没有warning。
x3 =
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       0       
       1       
       0       
       0       
       0       
       0       
       0   

>> x2=inv(A)*b  //方法3求解,矩阵A的逆乘b
Warning: Matrix is close to singular or badly scaled. Results may be
inaccurate. RCOND =  9.542396e-20. 
 
x2 =
-3095618963       
478515839234       
-18128046963749       
291709089884240       
-2443748498671269       
11565944181737902       
-30772016457394916       
38422934259310336       
6062876912518655       
-64009870499747464       
-815625744960023       
161923881096513024       
-174734421275108320       
49731260512141016       
-57082196217625456       
111820626128154624       
24957912964649792       
-173285108058004640       
129261793086585504       
-30878300969326916 




误差讨论:

上面的Warning中的“

RCOND

”表示条件数的倒数(reciprocal),如果这个值很小,则表示条件数很大,也就是说矩阵求解的误差越大。

条件数很大的矩阵是病态矩阵,对矩阵中元素很小的扰动会对结果产生很大影响。上面对含有Hilbert矩阵的方程进行求解过程中得到的

RCOND = 9.542396e-20



RCOND = 5.231543e-20

都是很小的,表示条件数都非常大,所以,产生上面报警的计算是非常不精确的。

由于MATLAB中的反斜杠求解



A

x

=

b

Ax=b






A


x




=








b





(矩阵



A

A






A





是可逆方阵)算法是使用了部分主元法的LU分解法,使用部分主元法的算法计算量较小,且舍入误差较小。所以这种方法误差总体来说较小。

如果使用inv(A)先求A的逆,再x2=inv(A)*b的话,MATLAB先计算inv(A),也就是求解



A

x

=

e

i

Ax=e_i






A


x




=









e










i

























e

i

e_i







e










i





















是单位矩阵



I

I






I





中的每一列向量,这样每一列向量



e

i

e_i







e










i





















对应的解向量



x

x






x





求出后,拼合起来就是矩阵



A

A






A





的逆



A

1

A^{-1}







A














1













,最后计算



A

1

b

A^{-1}b







A














1










b





。可见此种计算方法的计算量很大,所以每步的误差积累更多,总体误差更大。

对于使用rref( )求增广矩阵的简化阶梯式的方法,由于这种算法不检测矩阵是病态还是良态(所以不会提示矩阵是否是近奇异的或者病态的),仅在小的矩阵中比较精确,矩阵很大则计算很慢,但是这并不是说这种方法就最精确,其误差和上述两种方法在一个量级,但是一般不使用这种方法。



关于条件数(Condition Number)

条件数越大,矩阵越接近于奇异。单位矩阵的条件数是1,奇异矩阵的条件数为无穷大。在极端情况下,矩阵计算程序可能无法区别奇异矩阵与病态矩阵。

当条件数很大时,矩阵计算可能产生很大的误差。

定义:矩阵



A

A






A





的条件数(Condition Number)为



A

 

A

1

||A||\space ||A^{-1}||












A

















A














1



















计算方法有很多种,如:矩阵



A

A






A





是可逆矩阵,其最大奇异值和最小奇异值之比



σ

1

σ

n

\frac {\sigma_1}{\sigma_n}



















σ










n

































σ










1








































就是矩阵



A

A






A





的条件数。

MATLAB中计算矩阵条件数的函数:cond( )。例如:

A =
    0.7060    0.8235    0.4387    0.4898    0.2760
    0.0318    0.6948    0.3816    0.4456    0.6797
    0.2769    0.3171    0.7655    0.6463    0.6551
    0.0462    0.9502    0.7952    0.7094    0.1626
    0.0971    0.0344    0.1869    0.7547    0.1190

>> cond(A)   //计算矩阵A的条件数
ans =
    7.4466



版权声明:本文为Zijie123pea原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。