MATLAB矩陣運算(3)


1.3.9  特征值問題的QZ分解

函數  qz

格式  [AA,BB,Q,Z,V] = qz(A,B)       %A、B為方陣,產生上三角陣AA和BB,正交矩陣Q、Z或其列變換形式,V為特征向量陣。且滿足:Q*A*Z= AA 和Q*B*Z = BB。

[AA,BB,Q,Z,V] = qz(A,B,flag)   %產生由flag決定的分解結果,flag取值為:'complex':表示復數分解(默認),取值為'real':表示實數分解。

1.3.10  海森伯格形式的分解

如果矩陣H的第一子對角線下元素都是0,則H為海森伯格(Hessenberg)矩陣。如果矩陣是對稱矩陣,則它的海森伯格形式是對角三角陣。MATLAB可以通過相似變換將矩陣變換成這種形式。

函數  hess

格式  H = hess(A)      %返回矩陣A的海森伯格形式

[P,H] = hess(A)   %P為酉矩陣,滿足:A = PHP' 且P'P = eye(size(A))。

例1-75 

>> A=[-149 -50 -154;537 180 546;-27 -9 -25];

>> [P,H]=hess(A)

P =

   1.0000         0         0

        0   -0.9987    0.0502

        0    0.0502    0.9987

H =

-149.0000   42.2037 -156.3165

-537.6783  152.5511 -554.9272

       0    0.0728    2.4489

H的第一子對角元素是H(3,1)=0。

                                                                                                                           1.4  線性方程的組的求解

我們將線性方程的求解分為兩類:一類是方程組求唯一解或求特解,另一類是方程組求無窮解即通解。可以通過系數矩陣的秩來判斷:

若系數矩陣的秩r=n(n為方程組中未知變量的個數),則有唯一解;

若系數矩陣的秩r<n,則可能有無窮解;

線性方程組的無窮解 = 對應齊次方程組的通解+非齊次方程組的一個特解;其特解的求法屬於解的第一類問題,通解部分屬第二類問題。

1.4.1  求線性方程組的唯一解或特解(第一類問題)

這類問題的求法分為兩類:一類主要用於解低階稠密矩陣 —— 直接法;另一類是解大型稀疏矩陣 —— 迭代法。

1.利用矩陣除法求線性方程組的特解(或一個解)

方程:AX=b

解法:X=A\b

例1-76  求方程組 的解。

解:

>>A=[5  6  0  0  0

     1  5  6  0  0

     0  1  5  6  0   

     0  0  1  5  6

     0  0  0  1  5];

B=[1 0 0 0 1]';

R_A=rank(A)   %求秩

X=A\B    %求解

運行后結果如下

R_A =

      5

X =

    2.2662

   -1.7218

    1.0571

   -0.5940

    0.3188

這就是方程組的解。

或用函數rref求解:

>> C=[A,B]   %由系數矩陣和常數列構成增廣矩陣C

>> R=rref(C)   %將C化成行最簡行

R =

    1.0000         0         0         0         0    2.2662

         0    1.0000         0         0         0   -1.7218

         0         0    1.0000         0         0    1.0571

         0         0         0    1.0000         0   -0.5940

         0         0         0         0    1.0000    0.3188

則R的最后一列元素就是所求之解。

例1-77  求方程組 的一個特解。

解:

>>A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];

>>B=[1  4  0]';

>>X=A\B   %由於系數矩陣不滿秩,該解法可能存在誤差。

X =[ 0  0  -0.5333  0.6000]’(一個特解近似值)。

若用rref求解,則比較精確:

>> A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];

B=[1  4  0]';

>> C=[A,B];    %構成增廣矩陣

>> R=rref(C)

R =

    1.0000         0   -1.5000    0.7500    1.2500

         0    1.0000   -1.5000   -1.7500   -0.2500

         0         0         0         0         0

由此得解向量X=[1.2500  – 0.2500  0  0]’(一個特解)。

2.利用矩陣的LU、QR和cholesky分解求方程組的解

(1)LU分解:

LU分解又稱Gauss消去分解,可把任意方陣分解為下三角矩陣的基本變換形式(行交換)和上三角矩陣的乘積。即A=LU,L為下三角陣,U為上三角陣。

則:A*X=b        變成L*U*X=b

所以X=U\(L\b)   這樣可以大大提高運算速度。

命令  [L,U]=lu (A)

例1-78  求方程組 的一個特解。

解:

 

>>A=[4 2 -1;3 -1 2;11 3 0];

>>B=[2 10 8]';

>>D=det(A)

>>[L,U]=lu(A)

>>X=U\(L\B)

顯示結果如下:

D =

    0

L =

    0.3636   -0.5000    1.0000

    0.2727    1.0000         0

    1.0000         0         0

U =

   11.0000    3.0000         0

         0   -1.8182    2.0000

         0         0    0.0000

Warning: Matrix is close to singular or badly scaled.

         Results may be inaccurate. RCOND = 2.018587e-017.

> In D:\Matlab\pujun\lx0720.m at line 4

X =

    1.0e+016 *

       -0.4053

        1.4862

        1.3511

說明  結果中的警告是由於系數行列式為零產生的。可以通過A*X驗證其正確性。

(2)Cholesky分解

若A為對稱正定矩陣,則Cholesky分解可將矩陣A分解成上三角矩陣和其轉置的乘積,即:   其中R為上三角陣。

方程  A*X=b  變成 

所以                       

(3)QR分解

對於任何長方矩陣A,都可以進行QR分解,其中Q為正交矩陣,R為上三角矩陣的初等變換形式,即:A=QR

方程  A*X=b  變形成    QRX=b

所以                    X=R\(Q\b)

上例中  [Q, R]=qr(A)

X=R\(Q\B)

說明  這三種分解,在求解大型方程組時很有用。其優點是運算速度快、可以節省磁盤空間、節省內存。

1.4.2  求線性齊次方程組的通解

在Matlab中,函數null用來求解零空間,即滿足A·X=0的解空間,實際上是求出解空間的一組基(基礎解系)。

格式  z = null         % z的列向量為方程組的正交規范基,滿足 。

   % z的列向量是方程AX=0的有理基

例1-79  求解方程組的通解:

解:

>>A=[1  2  2  1;2  1  -2  -2;1  -1  -4  -3];

>>format  rat     %指定有理式格式輸出

>>B=null(A,'r')     %求解空間的有理基

運行后顯示結果如下:

B =

       2           5/3

       -2          -4/3

       1            0

       0            1

或通過行最簡行得到基:

>> B=rref(A)

B =

    1.0000         0   -2.0000   -1.6667

         0    1.0000    2.0000    1.3333

         0         0         0         0

即可寫出其基礎解系(與上面結果一致)。

寫出通解:

syms  k1  k2

X=k1*B(:,1)+k2*B(:,2)      %寫出方程組的通解

pretty(X)     %讓通解表達式更加精美

運行后結果如下:

X =

[  2*k1+5/3*k2]

[ -2*k1-4/3*k2]

[           k1]

[           k2]

% 下面是其簡化形式

    [2k1 + 5/3k2 ]

    [              ]

    [-2k1 - 4/3k2]

    [              ]

    [      k1      ]

    [              ]

    [      k2      ]

1.4.3  求非齊次線性方程組的通解

非齊次線性方程組需要先判斷方程組是否有解,若有解,再去求通解。

因此,步驟為:

第一步:判斷AX=b是否有解,若有解則進行第二步

第二步:求AX=b的一個特解

第三步:求AX=0的通解

第四步:AX=b的通解= AX=0的通解+AX=b的一個特解。

例1-80  求解方程組

解:在Matlab中建立M文件如下:

A=[1  -2  3  -1;3  -1  5  -3;2  1  2  -2];

b=[1  2  3]';

B=[A b];

n=4;

R_A=rank(A)

R_B=rank(B)

format rat

if R_A==R_B&R_A==n      %判斷有唯一解

   X=A\b

elseif R_A==R_B&R_A<n    %判斷有無窮解

   X=A\b      %求特解

   C=null(A,'r')    %求AX=0的基礎解系

else X='equition no solve'     %判斷無解

end

運行后結果顯示:

R_A =

      2     

R_B =

      3     

X =

equition no solve

說明  該方程組無解

例1-81  求解方程組的通解:

解法一:在Matlab編輯器中建立M文件如下:

A=[1  1  -3  -1;3  -1  -3  4;1  5  -9  -8];

b=[1 4 0]';

B=[A b];

n=4;

R_A=rank(A)

R_B=rank(B)

format rat

if R_A==R_B&R_A==n

   X=A\b

elseif R_A==R_B&R_A<n

   X=A\b

   C=null(A,'r')

else X='Equation has no solves'

end

運行后結果顯示為:

R_A =

      2

R_B =

      2

Warning: Rank deficient, rank = 2  tol =   8.8373e-015.

> In D:\Matlab\pujun\lx0723.m at line 11

X =

    0     

    0     

    -8/15   

    3/5    

C =

    3/2         -3/4    

    3/2          7/4    

    1            0     

    0            1  

所以原方程組的通解為X=k1 +k2 +

解法二:用rref求解

A=[1  1  -3  -1;3  -1  -3  4;1  5  -9  -8];

b=[1 4 0]';

B=[A b];

C=rref(B)    %求增廣矩陣的行最簡形,可得最簡同解方程組。

運行后結果顯示為:

C =

    1        0      -3/2      3/4      5/4

    0        1      -3/2     -7/4     -1/4

    0        0        0        0         0 

對應齊次方程組的基礎解系為: ,   非齊次方程組的特解為: 所以,原方程組的通解為:X=k1 +k2 + 。

1.4.4  線性方程組的LQ解法

函數  symmlq

格式  x = symmlq(A,b)   %求線性方程組AX=b的解X。A必須為n階對稱方陣,b為n元列向量。A可以是由afun定義並返回A*X的函數。如果收斂,將顯示結果信息;如果收斂失敗,將給出警告信息並顯示相對殘差norm(b-A*x)/norm(b)和計算終止的迭代次數。

symmlq(A,b,tol)                %指定誤差tol,默認值是1e-6。

symmlq(A,b,tol,maxit)           %maxit指定最大迭代次數

symmlq(A,b,tol,maxit,M)         %M為用於對稱正定矩陣的預處理因子

symmlq(A,b,tol,maxit,M1,M2)     %M=M1×M2

symmlq(A,b,tol,maxit,M1,M2,x0)   %x0為初始估計值,默認值為0。

[x,flag] = symmlq(A,b,…)   %flag的取值為:0表示在指定迭代次數之內按要求精度收斂;1表示在指定迭代次數內不收斂;2表示M為壞條件的預處理因子;3表示兩次連續迭代完全相同;4表示標量參數太小或太大;5表示預處理因子不是對稱正定的。

[x,flag,relres] = symmlq(A,b,…)     % relres表示相對誤差norm(b-A*x)/norm(b)

[x,flag,relres,iter] = symmlq(A,b,…)  %iter表示計算x的迭代次數

[x,flag,relres,iter,resvec] = symmlq(A,b,…)   %resvec表示每次迭代的殘差:norm(b-A*x0)

[x,flag,relres,iter,resvec,resveccg] = symmlq(A,b,…)   %resveccg表示每次迭代共軛梯度殘差的范數

1.4.5  雙共軛梯度法解方程組

函數  bicg

格式  x = bicg(A,b)   %求線性方程組AX=b的解X。A必須為n階方陣,b為n元列向量。A可以是由afun定義並返回A*X的函數。如果收斂,將顯示結果信息;如果收斂失敗,將給出警告信息並顯示相對殘差norm(b-A*x)/norm(b)和計算終止的迭代次數。

bicg(A,b,tol)                 %指定誤差tol,默認值是1e-6。

bicg(A,b,tol,maxit)            %maxit指定最大迭代次數

bicg(A,b,tol,maxit,M)          %M為用於對稱正定矩陣的預處理因子

bicg(A,b,tol,maxit,M1,M2)      %M=M1×M2

bicg(A,b,tol,maxit,M1,M2,x0)    %x0為初始估計值,默認值為0。

[x,flag] = bicg(A,b,…)   %flag的取值為:0表示在指定迭代次數之內按要求精度收斂;1表示在指定迭代次數內不收斂;2表示M為壞條件的預處理因子;3表示兩次連續迭代完全相同;4表示標量參數太小或太大。

[x,flag,relres] = bicg(A,b,…)       % relres表示相對誤差norm(b-A*x)/norm(b)

[x,flag,relres,iter] = bicg(A,b,…)    %iter表示計算x的迭代次數

[x,flag,relres,iter,resvec] = bicg(A,b,…)     %resvec表示每次迭代的殘差:norm(b-A*x0)

例1-83  調用MATLAB6.0數據文件west0479。

>> load west0479

>> A=west0479;    %將數據取為系數矩陣A。

>> b=sum (A,2);     %將A的各行求和,構成一列向量。

>> X=A\b;         %用“\”求AX=b的解。

>> norm(b-A*X)/norm(b)    %計算解的相對誤差。

ans =

  1.2454e-017

>> [x,flag,relres,iter,resvec] = bicg(A,b)    %用bicg函數求解。

x =  (全為0,由於太長,不顯示出來)

flag =

  1       %表示在默認迭代次數(20次)內不收斂。

relres =        %相對殘差relres = norm(b-A*x)/norm(b) =norm(b)/norm(b) = 1。

    1

iter =          %表明解法不當,使得初始估計值0向量比后來所有迭代值都好。

    0

resvec =  (略)               %每次迭代的殘差。

>> semilogy(0:20,resvec/norm(b),'-o')   %作每次迭代的相對殘差圖形,結果如下圖。

>> xlabel('iteration number')           %x軸為迭代次數。

>> ylabel('relative residual')           %y軸為相對殘差。

 

圖1-1  雙共軛梯度法相對誤差圖

1.4.6  穩定雙共軛梯度方法解方程組

函數  bicgstab

格式  x =bicgstab(A,b)

bicgstab(A,b,tol)

bicgstab(A,b,tol,maxit)

bicgstab(A,b,tol,maxit,M)

bicgstab(A,b,tol,maxit,M1,M2)

bicgstab(A,b,tol,maxit,M1,M2,x0)

[x,flag] = bicgstab(A,b,…)

[x,flag,relres] = bicgstab(A,b,…)

[x,flag,relres,iter] = bicgstab(A,b,…)

[x,flag,relres,iter,resvec] = bicgstab(A,b,…)

穩定雙共軛梯度法解方程組,調用方式和返回的結果形式和命令bicg一樣。

例1-84

>>load west0479;

>>A=west0479;

>>b=sum(A,2);

>>[x,flag]=bicgstab(A,b)

顯示結果是x的值全為0,flag=1。表示在默認誤差和默認迭代次數(20次)下不收斂。

若改為:

>>[L1,U1] = luinc(A,1e-5);

>>[x1,flag1] = bicgstab(A,b,1e-6,20,L1,U1)

即指定誤差,並用A的不完全LU分解因子L和U作為預處理因子M=L*U,其結果是x1的值全為0,flag=2表示預處理因子為壞條件的預處理因子。

若改為

>>[L2,U2]=luinc(A,1e-6);      %稀疏矩陣的不完全LU分解。

>>[x2,flag2,relres2,iter2,resvec2]=bicgstab(A,b,1e-15,10,L2,U2)

 %指定最大迭代次數為10次,預處理因子M=L*U。

>>semilogy(0:0.5:iter2,resvec2/norm(b),'-o')    %每次迭代的相對殘差圖形,見圖1-2。

圖1-2  穩定雙共軛梯度方法的相對誤差圖

>>xlabel('iteration number')

>>ylabel('relative residual')

結果為

x2=(其值全為1,略)

flag2 =

       0         %表示收斂

relres2 =

       2.8534e-016    %收斂時的相對誤差

iter2 =

     6        %計算終止時的迭代次數

resvec2 =       %每次迭代的殘差

1.4.7  復共軛梯度平方法解方程組

函數  cgs

格式  x = cgs(A,b)

cgs(A,b,tol)

cgs(A,b,tol,maxit)

cgs(A,b,tol,maxit,M)

cgs(A,b,tol,maxit,M1,M2)

cgs(A,b,tol,maxit,M1,M2,x0)

[x,flag] = cgs(A,b,…)

[x,flag,relres] = cgs(A,b,…)

[x,flag,relres,iter] = cgs(A,b,…)

[x,flag,relres,iter,resvec] = cgs(A,b,…)

調用方式和返回的結果形式與命令bicg一樣。

1.4.8  共軛梯度的LSQR方法

函數  lsqr

格式  x = lsqr(A,b)

lsqr(A,b,tol)

lsqr(A,b,tol,maxit)

lsqr(A,b,tol,maxit,M)

lsqr(A,b,tol,maxit,M1,M2)

lsqr(A,b,tol,maxit,M1,M2,x0)

[x,flag] = lsqr(A,b,…)

[x,flag,relres] = lsqr(A,b,…)

[x,flag,relres,iter] = lsqr(A,b,…)

[x,flag,relres,iter,resvec] = lsqr(A,b,…)

調用方式和返回的結果形式與命令bicg一樣。

例1-85

>>n = 100;

>>on = ones(n,1);

>>A = spdiags([-2*on 4*on -on],-1:1,n,n);   %產生一個對角矩陣

>>b = sum(A,2);

>>tol = 1e-8;    %指定精度

>>maxit = 15;   %指定最大迭代次數

>>M1 = spdiags([on/(-2) on],-1:0,n,n);

>>M2 = spdiags([4*on -on],0:1,n,n);       %M1*M2=M,即產生預處理因子

>>[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,[])

結果顯示

     x的值全為1

flag =

     0      %表示收斂

relres =

 3.5241e-009    %表示相對殘差

iter =

     12       %計算終止時的迭代次數

1.4.9  廣義最小殘差法

函數  qmres

格式  x = gmres(A,b)

gmres(A,b,restart)

gmres(A,b,restart,tol)

gmres(A,b,restart,tol,maxit)

gmres(A,b,restart,tol,maxit,M)

gmres(A,b,restart,tol,maxit,M1,M2)

gmres(A,b,restart,tol,maxit,M1,M2,x0)

[x,flag] = gmres(A,b,…)  

[x,flag,relres] = gmres(A,b,…)

[x,flag,relres,iter] = gmres(A,b,…)

[x,flag,relres,iter,resvec] = gmres(A,b,…)

除參數restart(缺省時為系數方陣A的階數n)可以給出外,調用方式和返回的結果形式與命令bicg一樣。

例1-86

>>load west0479;

>>A = west0479;

>>b = sum(A,2);

>>[x,flag] = gmres(A,b,5)

結果顯示flag=1,表示在默認精度和默認迭代次數下不收斂。

若最后一行改為

>>[L1,U1] = luinc(A,1e-5);

>>[x1,flag1] = gmres(A,b,5,1e-6,5,L1,U1)

結果flag1=2,說明該方法失敗,原因是U1的對角線上有0元素,構成壞條件的預處理因子。

若改為:

[L2,U2] = luinc(A,1e-6);

tol = 1e-15;

[x4,flag4,relres4,iter4,resvec4] = gmres(A,b,4,tol,5,L2,U2)

[x6,flag6,relres6,iter6,resvec6] = gmres(A,b,6,tol,3,L2,U2)

[x8,flag8,relres8,iter8,resvec8] = gmres(A,b,8,tol,3,L2,U2)

結果flag4=0,flag6=0,flag8=0表示參數restart分別取為4,6,8時收斂。

1.4.10  最小殘差法解方程組

函數  minres

格式  x = minres(A,b)

minres(A,b,tol)

minres(A,b,tol,maxit)

minres(A,b,tol.maxit,M)

minres(A,b,tol,maxit,M1,M2)

minres(A,b,tol,maxit,M1,M2,x0)

[x,flag] = minres(A,b,…)

[x,flag,relres] = minres(A,b,…)

[x,flag,relres,iter] = minres(A,b,…)

[x,flag,relres,iter,resvec] = minres(A,b,…)

[x,flag,relres,iter,resvec,resveccg] = minres(A,b,…)

這里A為對稱矩陣,這種方法是尋找最小殘差來求x。調用方式和返回的結果形式與命令bicg一樣。

例1-87

>>n = 100; on = ones(n,1);

>>A = spdiags([-2*on 4*on -2*on],-1:1,n,n);

>>b = sum(A,2);

>>tol = 1e-10;

>>maxit = 50;

>>M1 = spdiags(4*on,0,n,n);

>> [x,flag,relres,iter,resvec,resveccg] = minres(A,b,tol,maxit,M1,[],[])

結果顯示:

flag =

     0

relres =

 4.6537e-014

iter =

     49

resvec =(略)

resveccg =(略)

1.4.11  預處理共軛梯度方法

函數  pcg

格式  x = pcg(A,b)

pcg(A,b,tol)

pcg(A,b,tol,maxit)

pcg(A,b,tol,maxit,M)

pcg(A,b,tol,maxit,M1,M2)

pcg(A,b,tol,maxit,M1,M2,x0)

pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

[x,flag] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

[x,flag,relres] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

[x,flag,relres,iter] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

[x,flag,relres,iter,resvec] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)

調用方式和返回的結果形式與命令bicg一樣,這里A為對稱正定矩陣。

1.4.12  准最小殘差法解方程組

函數  qmr

格式  x = qmr(A,b)

qmr(A,b,tol)

qmr(A,b,tol,maxit)

qmr(A,b,tol,maxit,M)

qmr(A,b,tol,maxit,M1,M2)

qmr(A,b,tol,maxit,M1,M2,x0)

qmr(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,…)

[x,flag] = qmr(A,b,…)

[x,flag,relres] = qmr(A,b,…)

[x,flag,relres,iter] = qmr(A,b,…)

[x,flag,relres,iter,resvec] = qmr(A,b,…)

調用方式和返回的結果形式與命令bicg一樣,這里A為方陣。

例1-88

>>load west0479;

>>A = west0479;

>>b = sum(A,2);

>>[x,flag] = qmr(A,b)

結果顯示flag=1,表示在缺省情況下不收斂

若改為

>>[L1,U1] = luinc(A,1e-5);

>>[x1,flag1] = qmr(A,b,1e-6,20,L1,U1)

結果顯示 flag=2,表示是壞條件的預處理因子,不收斂。

若改為

>>[L2,U2] = luinc(A,1e-6);

>>[x2,flag2,relres2,iter2,resvec2] = qmr(A,b,1e-15,10,L2,U2)

>>semilogy(0:iter2,resvec2/norm(b),'-o')     %每次迭代的相對殘差圖形

>>xlabel('iteration number')

>>ylabel('relative residual')

結果為

x=(全為1,略)

flag2 =

      0    %表示收斂

relres2 =      %表示相對殘差

 2.8715e-016   

iter2 =           %計算終止時的迭代次數

      8

resvec2 =          %每次迭代的殘差

  1.0e+005 *

    7.0557

    7.1773

    3.4032

    1.7220

    0.0000

    0.0000

    0.0000

    0.0000

    0.0000

 

圖1-3  准最小殘差法相對誤差圖

                                                                                                                                       1.5  特征值與二次型

工程技術中的一些問題,如振動問題和穩定性問題,常歸結為求一個方陣的特征值和特征向量。

1.5.1  特征值與特征向量的求法

設A為n階方陣,如果數“ ”和n維列向量x使得關系式 成立,則稱 為方陣A的特征值,非零向量x稱為A對應於特征值“ ”的特征向量。

詳見1.3.5和1.3.6節:特征值分解問題。

例1-89  求矩陣 的特征值和特征向量

解:

>>A=[-2  1  1;0  2  0;-4  1  3];

>>[V,D]=eig(A)

結果顯示:

V =

   -0.7071   -0.2425    0.3015

        0          0    0.9045

   -0.7071   -0.9701    0.3015

D =

    -1     0     0

     0     2     0

     0     0     2

即:特征值-1對應特征向量(-0.7071  0  -0.7071)T

特征值2對應特征向量(-0.2425  0  -0.9701)T和(-0.3015  0.9045  -0.3015)T

例1-90  求矩陣 的特征值和特征向量。

解:

>>A=[-1 1 0;-4 3 0;1 0 2];

>>[V,D]=eig(A)

結果顯示為

V =

    0        0.4082   -0.4082

    0        0.8165   -0.8165

    1.0000   -0.4082    0.4082

D =

    2     0     0

    0     1     0

    0     0     1

說明  當特征值為1 (二重根)時,對應特征向量都是k (0.4082  0.8165  -0.4082)T,k為任意常數。

1.5.2  提高特征值的計算精度

函數  balance

格式  [T,B] = balance(A)   %求相似變換矩陣T和平衡矩陣B,滿足 。

B = balance(A)      %求平衡矩陣B

1.5.3  復對角矩陣轉化為實對角矩陣

函數  cdf2rdf

格式  [V,D] = cdf2rdf (v,d)   %將復對角陣d變為實對角陣D,在對角線上,用2×2實數塊代替共軛復數對。

例1-91

>> A=[1 2 3;0 4 5;0 -5 4];

>> [v,d]=eig(A)

v =

   1.0000            -0.0191 - 0.4002i  -0.0191 + 0.4002i

        0                  0 - 0.6479i        0 + 0.6479i

        0             0.6479             0.6479         

d =

   1.0000                  0                  0         

        0             4.0000 + 5.0000i        0         

        0                  0             4.0000 - 5.0000i

>> [V,D]=cdf2rdf(v,d)

V =

    1.0000   -0.0191   -0.4002

         0         0   -0.6479

         0    0.6479         0

D =

    1.0000         0         0

         0    4.0000    5.0000

         0   -5.0000    4.0000

1.5.4  正交基

命令  orth

格式  B=orth(A)   %將矩陣A正交規范化,B的列與A的列具有相同的空間,B的列向量是正交向量,且滿足:B'*B = eye(rank(A))。

例1-92  將矩陣 正交規范化。

解:

>>A=[4  0  0; 0  3  1; 0  1  3];

>>B=orth(A)

>>Q=B'*B

則顯示結果為

P =

    1.0000         0         0

         0    0.7071   -0.7071

         0    0.7071    0.7071

Q =

    1.0000         0         0

         0    1.0000         0

         0         0    1.0000

1.5.5  二次型

例1-93  求一個正交變換X=PY,把二次型

化成標准形。

解:先寫出二次型的實對稱矩陣

 

在Matlab編輯器中建立M文件如下:

A=[0 1 1 -1;1 0 -1 1;1 -1 0 1;-1 1 1 0];

[P,D]=schur(A)

syms y1 y2  y3 y4

y=[y1;y2;y3;y4];

X=vpa(P,2)*y         %vpa表示可變精度計算,這里取2位精度

f=[y1 y2 y3 y4]*D*y

運行后結果顯示如下:

P =

   780/989      780/3691       1/2       -390/1351 

   780/3691     780/989       -1/2        390/1351 

   780/1351    -780/1351      -1/2        390/1351 

      0            0           1/2       1170/1351 

D =

      1            0            0            0     

      0            1            0            0     

      0            0           -3            0     

      0            0            0            1     

X =

[ .79*y1+.21*y2+.50*y3-.29*y4]

[ .21*y1+.79*y2-.50*y3+.29*y4]

[ .56*y1-.56*y2-.50*y3+.29*y4]

[               .50*y3+.85*y4]

f =

y1^2+y2^2-3*y3^2+y4^2

即    f =

                                                                                                                                       1.6  秩與線性相關性

1.6.1  矩陣和向量組的秩以及向量組的線性相關性

矩陣A的秩是矩陣A中最高階非零子式的階數;向量組的秩通常由該向量組構成的矩陣來計算。

函數  rank

格式  k = rank(A)       %返回矩陣A的行(或列)向量中線性無關個數

k = rank(A,tol)    %tol為給定誤差

例1-94  求向量組 , , , , 的秩,並判斷其線性相關性。

>>A=[1 -2 2 3;-2 4 -1 3;-1 2 0 3;0 6 2 3;2 -6 3 4];

>>k=rank(A)

結果為

k =

     3

由於秩為3 < 向量個數,因此向量組線性相關。

1.6.2  求行階梯矩陣及向量組的基

行階梯使用初等行變換,矩陣的初等行變換有三條:

1.交換兩行  (第i、第j兩行交換)

2.第i行的K倍

3.第i行的K倍加到第j行上去

通過這三條變換可以將矩陣化成行最簡形,從而找出列向量組的一個最大無關組,Matlab將矩陣化成行最簡形的命令是rref或rrefmovie。

函數  rref或rrefmovie

格式  R = rref(A)         %用高斯—約當消元法和行主元法求A的行最簡行矩陣R

[R,jb] = rref(A)     %jb是一個向量,其含義為:r = length(jb)為A的秩;A(:, jb)為A的列向量基;jb中元素表示基向量所在的列。

[R,jb] = rref(A,tol)   %tol為指定的精度

rrefmovie(A)        %給出每一步化簡的過程

例1-95  求向量組a1=(1,-2,2,3),a2=(-2,4,-1,3),a3=(-1,2,0,3),a4=(0,6,2,3),a5=(2,-6,3,4)的一個最大無關組。

>> a1=[1  -2  2  3]';

>>a2=[-2  4  -1  3]';

>>a3=[-1  2  0  3]';

>>a4=[0  6  2  3]';

>>a5=[2  -6  3  4]';

A=[a1  a2  a3  a4  a5]

A =

     1    -2    -1     0     2

    -2     4     2     6    -6

     2    -1     0     2     3

     3     3     3     3     4

>> [R,jb]=rref(A)

R =

    1.0000         0    0.3333         0    1.7778

         0    1.0000    0.6667         0   -0.1111

         0         0         0    1.0000   -0.3333

         0         0         0         0         0

jb =

     1     2     4

>> A(:,jb)

ans =

     1    -2     0

    -2     4     6

     2    -1     2

     3     3     3

即:a1  a2  a4為向量組的一個基。

                                                                                                                                            1.7  稀疏矩陣技術

1.7.1  稀疏矩陣的創建

函數  sparse

格式  S = sparse(A)   %將矩陣A轉化為稀疏矩陣形式,即由A的非零元素和下標構成稀疏矩陣S。若A本身為稀疏矩陣,則返回A本身。

S = sparse(m,n)   %生成一個m×n的所有元素都是0的稀疏矩陣

S = sparse(i,j,s)   %生成一個由長度相同的向量i,j和s定義的稀疏矩陣S,其中i,j是整數向量,定義稀疏矩陣的元素位置(i,j),s是一個標量或與i,j長度相同的向量,表示在(i,j)位置上的元素。

S = sparse(i,j,s,m,n)         %生成一個m×n的稀疏矩陣,(i,j)對應位置元素為si,m = max(i)且n =max(j)。

S = sparse(i,j,s,m,n,nzmax)    %生成一個m×n的含有nzmax個非零元素的稀疏矩陣S,nzmax的值必須大於或者等於向量i和j的長度。

例1-96

>> S=sparse(1:10,1:10,1:10)

S =

   (1,1)        1

   (2,2)        2

   (3,3)        3

   (4,4)        4

   (5,5)        5

   (6,6)        6

   (7,7)        7

   (8,8)        8

   (9,9)        9

  (10,10)      10

>> S=sparse(1:10,1:10,5)

S =

   (1,1)        5

   (2,2)        5

   (3,3)        5

   (4,4)        5

   (5,5)        5

   (6,6)        5

   (7,7)        5

   (8,8)        5

   (9,9)        5

  (10,10)       5

1.7.2  將稀疏矩陣轉化為滿矩陣

函數  full

格式  A=full(S)   %S為稀疏矩陣,A為滿矩陣。

例1-97

>> S=sparse(1:5,1:5,4:8)

S =

   (1,1)        4

   (2,2)        5

   (3,3)        6

   (4,4)        7

   (5,5)        8

>> A=full(S)

A =

     4     0     0     0     0

     0     5     0     0     0

     0     0     6     0     0

     0     0     0     7     0

     0     0     0     0     8

1.7.3  稀疏矩陣非零元素的索引

函數  find

格式  k = find(x)   %按行檢索X中非零元素的點,若沒有非零元素,將返回空矩陣。

[i,j] = find(X)    %檢索X中非零元素的行標i和列標j

[i,j,v] = find(X)   %檢索X中非零元素的行標i和列標j以及對應的元素值v

例1-98  上例中

>> [i,j,v]=find(S)

則顯示為:

I =[ 1  2    3   4    5]’

j =[ 1  2    3   4    5]’

v =[4  5    6   7    8]’

1.7.4  外部數據轉化為稀疏矩陣

函數  spconvert

格式  S=spconvert(D)   %D是只有3列或4列的矩陣

說明:先運用load函數把外部數據(.mat文件或.dat文件)裝載於MATLAB內存空間中的變量T;T數組的行維為nnz或nnz+1,列維為3(對實數而言)或列維為4(對復數而言);T數組的每一行(以[i,j,Sre,Sim]形式)指定一個稀疏矩陣元素。

例1-99

>> D=[1  2  3;2  5  4;3  4  6;3  6  7]

D =

     1     2     3

     2     5     4

     3     4     6

     3     6     7

>> S=spconvert(D)

S =

   (1,2)        3

   (3,4)        6

   (2,5)        4

   (3,6)        7

>> D=[1 2 3 4; 2 5 4 0;3 4 6 9;3 6 7 4];

D =

     1     2     3     4

     2     5     4     0

     3     4     6     9

     3     6     7     4

>> S=spconvert(D)

S =

   (1,2)      3.0000 + 4.0000i

   (3,4)      6.0000 + 9.0000i

   (2,5)      4.0000         

   (3,6)      7.0000 + 4.0000i

1.7.5  基本稀疏矩陣

1.帶狀(對角)稀疏矩陣

函數  spdiags

格式  [B,d] = spdiags(A)    %從矩陣A中提取所有非零對角元素,這些元素保存在矩陣B中,向量d表示非零元素的對角線位置。

B = spdiags(A,d)     %從A中提取由d指定的對角線元素,並存放在B中。

A = spdiags(B,d,A)    %用B中的列替換A中由d指定的對角線元素,輸出稀疏矩陣。

A = spdiags(B,d,m,n)   %產生一個m×n稀疏矩陣A,其元素是B中的列元素放

在由d指定的對角線位置上。

例1-100

>>A = [11   0   13    0

         0   22    0   24

         0    0   33    0

        41    0    0   44

        0    52    0    0

        0     0   63    0

        0     0    0   74];

>>[B,d] = spdiags(A)

B =

    41    11     0

    52    22     0

    63    33    13

    74    44    24

d =

    -3      %表示B的第1列元素在A中主對角線下方第3條對角線上

     0      %表示B的第2列在A的主對角線上

     2      %表示B的第3列在A的主對角線上方第2條對角線上

例1-101

>> B=[1 2 3 4

      5 6 7 8

      9 10 11 12

      13 14 15 16];

>> d=[-2 0 1 3];

>> A=spdiags(B,d,4,4);

>> full(A)

ans =

     2     7     0    16

     0     6    11     0

     1     0    10    15

     0     5     0    14

2.單位稀疏矩陣

函數  speye

格式  S = speye(m,n)   %生成m×n的單位稀疏矩陣

S = speye(n)     %生成n×n的單位稀疏矩陣

3.稀疏均勻分布隨機矩陣

函數  sprand

格式  R = sprand(S)           %生成與S具有相同稀疏結構的均勻分布隨機矩陣

R = sprand(m,n,density)    %生成一個m×n的服從均勻分布的隨機稀疏矩陣,非零元素的分布密度是density。

R = sprand(m,n,density,rc)   %生成一個近似的條件數為1/rc、大小為m×n的均勻分布的隨機稀疏矩陣。

4.稀疏正態分布隨機矩陣

函數  sprandn

格式  R = sprandn(S)            %生成與S具有相同稀疏結構的正態分布隨機矩陣。

R = sprandn(m,n,density)    %生成一個m×n的服從正態分布的隨機稀疏矩陣,非零元素的分布密度是density。

R = sprandn(m,n,density,rc)   %生成一個近似的條件數為1/rc、大小為m×n的均勻分布的隨機稀疏矩陣。

5.稀疏對稱隨機矩陣

函數  sprandsym

格式  R = sprandsym(S)   %生成稀疏對稱隨機矩陣,其下三角和對角線與S具有相同的結構,其元素服從均值為0、方差為1的標准正態分布。

R = sprandsym(n,density)    %生成n×n的稀疏對稱隨機矩陣,矩陣元素服從正態分布,分布密度為density。

R = sprandsym(n,density,rc)   %生成近似條件數為1/rc的稀疏對稱隨機矩陣

R = sprandsym(n,density,rc,kind)   %生成一個正定矩陣,參數kind取值為kind=1表示矩陣由一正定對角矩陣經隨機Jacobi旋轉得到,其條件數正好為1/rc;kind=2表示矩陣為外積的換位和,其條件數近似等於1/rc;kind=3表示生成一個與矩陣S結構相同的稀疏隨機矩陣,條件數近似為1/rc ,density被忽略。

1.7.6  稀疏矩陣的運算

1.稀疏矩陣非零元素的個數

函數  nnz

格式  n = nnz(X)    %返回矩陣X中非零元素的個數

2.稀疏矩陣的非零元素

函數  nonzeros

格式  s = nonzeros(A)    %返回矩陣A中非零元素按列順序構成的列向量

例1-102

>>A =[ 2     7     0    16

      0     6    11     0

      1     0    10    15

      0     5     0    14];

>> s=nonzeros(A)

結果為:

s =[ 2  1  7  6  5  11  10  16  15  14]’

3.稀疏矩陣非零元素的內存分配

函數  nzmax

格式  n = nzmax(S)    %返回非零元素分配的內存總數n

4.稀疏矩陣的存貯空間

函數  spalloc

格式  S = spalloc(m,n,nzmax)   %產生一個m×n階只有nzmax個非零元素的稀疏矩陣,這樣可以有效減少存貯空間和提高運算速度。

5.稀疏矩陣的非零元素應用

函數  spfun

格式  f = spfun('function',S)   %用S中非零元素對函數'function'求值,如果'function'不是對稀疏矩陣定義的,同樣可以求值。

例1-103  4階稀疏矩陣對角矩陣

S =

   (1,1)        1

   (2,2)        2

   (3,3)        3

   (4,4)        4

f= spfun('exp',S)    %即指數e的非零元素方冪。

結果為

f =

   (1,1)       2.7183

   (2,2)       7.3891

   (3,3)      20.0855

   (4,4)      54.5982

6.把稀疏矩陣的非零元素全換為1

函數  spones

格式  R = spones(S)    %將稀疏矩陣S中的非零元素全換為1

1.7.7  畫稀疏矩陣非零元素的分布圖形

函數  spy

格式  spy(S)   %畫出稀疏矩陣S中非零元素的分布圖形。S也可以是滿矩陣。

spy(S,markersize)            % markersize為整數,指定點陣大小。

spy(S,'LineSpec')            %'LineSpec'指定繪圖標記和顏色

spy(S,'LineSpec',markersize)   %參數與上面相同

圖1-4  稀疏矩陣非零元素的分布圖形

例1-104

>> load west0479

>> A=west0479;

>> spy(A,'ro',3)

結果如圖1-4所示。

1.7.8  矩陣變換

1.列近似最小度排序

函數  colamd

格式  p = colamd(S)   %返回稀疏矩陣S的列的近似最小度排序向量p

2.列最小度排序

函數  colmmd

格式  p = colmmd(S)   %返回稀疏矩陣S的列的最小度排序向量p,按p排列后的矩陣為S(: , p)。

例1-105  比較稀疏矩陣S與排序后的矩陣S(: , p)

>> load west0479;

>> S=west0479;

>> p=colmmd(S);

>> subplot(2,2,1),spy(S)

>> subplot(2,2,2),spy(S(:,p))

>> subplot(2,2,3),spy(lu(S))

>> subplot(2,2,4),spy(lu(S(:,p)))

 

圖1-5  稀疏矩陣的排序圖

3.非零元素的列變換

函數  colperm

格式  j = colperm(S)   %返回一個稀疏矩陣S的列變換的向量。列按非0元素升序排列。有時這是LU分解前有用的變換:LU(S(:,j))。如果S是一個對稱矩陣,對行和列進行排序,有利於Cholesky分解:chol(S(j,j))

4.Dulmage-Mendelsohn分解

函數  dmperm

格式  p = dmperm (A)     %返回A的行排列向量p,這樣,如果A滿列秩,就使得A(p,:)是具有非0對角線元素的方陣。

[p,q,r] = dmperm(A)    %A為方陣,p為行排列向量,q為列排列向量,使得A(p,q)

是上三角塊形式,r為索引向量。

[p,q,r,s] = dmperm(A)   %A不是方陣,p,q,r含義與前面相同,s也是索引向量。

例1-106

>> A=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]

A =

    11     0    13     0

    41     0     0    44

     0    22     0    24

     0     0    63     0

>> [p,q,r]=dmperm(A)

p =

     3     2     1     4

q =

     2     4     1     3

r =

     1     2     3     4     5

>> A(p,q)

ans =

    22    24     0     0

     0    44    41     0

     0     0    11    13

     0     0     0    63

5.整數的隨機排列

函數  randperm

格式  p = randperm (n)   %對正整數1,2,3,…,n的隨機排列,可以用來創建隨機變換矩陣。

例1-107 

>> p=randperm(6)

p =

     3     4     6     5     1     2

6.稀疏對稱近似最小度排列

函數  symamd

格式  p = symamd(S)    %S為對稱正定矩陣,返回排列向量p。

7.稀疏逆Cuthill-McKee排序

函數  symrcm

格式  r = symrcm (S)   %返回S的對稱逆Cuthill-McKee排序r,使S的非0元素集中在主對角線附近。

8.稀疏對稱最小度排列

函數  symmmd

格式  p = symmmd(S)   %返回S的對稱最小度排列向量p,S為對稱正定矩陣。

例1-108

>> B = bucky+4*speye(60);

>>r = symrcm(B);

>>p = symmmd(B);

>>R = B(r,r);

>>S = B(p,p);

>>subplot(2,2,1), spy(R), title('B(r,r)')

>>subplot(2,2,2), spy(S), title('B(s,s)')

>>subplot(2,2,3), spy(chol(R)), title('chol(B(r,r))')

>>subplot(2,2,4), spy(chol(S)), title('chol(B(s,s))')

 

圖1-6  稀疏對稱最小度排列圖

1.7.9  稀疏矩陣的近似歐幾里得范數和條件數

命令  矩陣A條件數的1-范數估計值

函數  condest

格式  c = condest(A)       %計算方陣A的1-范數中條件數的下界值c

[c,v] = condest(A)   %方陣A的1-范數中條件數的下界值c和向量v,使得 ,即:

norm(A*v,1) = norm(A,1)*norm(v,1)/c。

命令  2-范數估計值

函數  normest

格式  nrm = normest(S)          %返回矩陣S的2-范數的估計值,相對誤差為10-6

nrm = normest(S,tol)       %tol為指定的相對誤差,而不用默認誤差10-6

[nrm,count] = normest(…)   %count為給出的計算范數迭代的次數

其條件數的計算與前面1.2.12相同。

1.7.10  稀疏矩陣的分解

命令  不完全的LU分解

函數  luinc

格式  [L,U] = luinc(X,'0')       %X為稀疏方陣;L為下三角矩陣的置換形式;U為上三角矩陣;'0'是一種分解標准。

[L,U,P] = luinc(X,'0')      %L為下三角陣,其主對角線元素為1;U為上三角陣,p為單位矩陣的置換形式。

[L,U] = luinc(X,options)   %options取值為:droptol表示指定的舍入誤差;milu表示改變分解以便於從上三角分解因子中抽取被去掉的列元素。ugiag為1表示用droptol值代替上三角因子中的對角線上的零元素,默認值為0。thresh為中心臨界值。

[L,U] = luinc(X,droptol)    %droptol表示指定不完全分解的舍入誤差

[L,U,P] = luinc(X,options)

[L,U,P] = luinc(X,droptol)

例1-109

>> S=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]

S =

    11     0    13     0

    41     0     0    44

     0    22     0    24

     0     0    63     0

>> S=sparse(S)

S =

   (1,1)       11

   (2,1)       41

   (3,2)       22

   (1,3)       13

   (4,3)       63

   (2,4)       44

   (3,4)       24

>> luinc(S,'0')

ans =

   (1,1)      41.0000

   (4,1)       0.2683

   (2,2)      22.0000

   (3,3)      63.0000

   (4,3)       0.2063

   (1,4)      44.0000

   (2,4)      24.0000

>> [L,U,p]=luinc(S,'0')

L =

   (1,1)       1.0000

   (4,1)       0.2683

   (2,2)       1.0000

   (3,3)       1.0000

   (4,3)       0.2063

   (4,4)       1.0000

U =

   (1,1)       41

   (2,2)       22

   (3,3)       63

   (1,4)       44

   (2,4)       24

p =

   (4,1)        1

   (1,2)        1

   (2,3)        1

   (3,4)        1

命令  稀疏矩陣的不完全Cholesky分解

函數  cholinc

格式  R = (X,droptol)      %稀疏矩陣X的不完全Cholesky分解,droptol為指定誤差。

R = cholinc(X,options)   %options取值為:droptol表示舍入誤差;michol表示如果michol=1,則從對角線上抽取出被去掉的元素。rdiag表示用droptol值代替上三角分解因子中的對角線上的零元素。

R = cholinc(X,'0')       %'0'是一種分解標准

[R,p] = cholinc(X,'0')    %不產生任何出錯信息,如果R存在,則p=0;如果R不存在,則p為正整數。

R = cholinc(X,'inf')      %進行Cholesky無窮分解

1.7.11  稀疏矩陣的特征值分解

函數  eigs

格式  d = eigs(A)          %求稀疏矩陣A的6個最大特征值d,d以向量形式存放。

d = eigs(A,B)       %求稀疏矩陣的廣義特征值問題。滿足AV=BVD,其中D為特征值對角陣,V為特征向量矩陣,B必須是對稱正定陣或Hermitian正定陣。

d = eigs(A,k)        %返回k個最大特征值

d = eigs(A,B,k)      %返回k個最大特征值

d = eigs(A,k,sigma)   %sigma取值:'lm' 表示最大數量的特征值;'sm' 最小數量特征值;對實對稱問題:'la'表示最大特征值;'sa'為最小特征值;對非對稱和復數問題:'lr' 表示最大實部;'sr' 表示最小實部;'li' 表示最大虛部;'si'表示最小虛部。

d = eigs(A,B,k,sigma)         %同上

d = eigs(A,k,sigma,options)     % options為指定參數:參見eigs幫助文件。

d = eigs(A,B,k,sigma,options)   %同上。以下的參數k、sigma、options相同。

d = eigs(Afun,n)            %用函數Afun代替A,n為A的階數,D為特征值。

d = eigs(Afun,n,B)   

d = eigs(Afun,n,k)

d = eigs(Afun,n,B,k)

d = eigs(Afun,n,k,sigma)

d = eigs(Afun,n,B,k,sigma)

d = eigs(Afun,n,k,sigma,options)

d = eigs(Afun,n,B,k,sigma,options)

[V,D] = eigs(A,…)   %D為6個最大特征值對角陣,V的列向量為對應特征向量。

[V,D] = eigs(Afun,n,…)

[V,D,flag] = eigs(A,…)   %flag表示特征值的收斂性,若flag=0,則所有特征值都收斂,否則,不是所有都收斂。

[V,D,flag] = eigs(Afun,n,…)

1.7.12  稀疏矩陣的線性方程組

參見1.4節的方程組求解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM