原文:http://www.cnblogs.com/JCSU/articles/1490363.html
?
一、用矩陣運(yùn)算法解線(xiàn)性方程組
?
1、矩陣運(yùn)算規(guī)則及MATLAB實(shí)例
?
(1)? 矩陣加(減)法:即兩矩陣對(duì)應(yīng)元素相加減,要求兩矩陣的階數(shù)必須相同。
??????C = A + B
?
(2)? 矩陣乘法:m×p階矩陣A與p×n階矩陣B的乘積C是一個(gè)m×n階的矩陣。元素C(i, j)的值為A矩陣的第i行和B矩陣的第j列對(duì)應(yīng)元素乘積的和。
??????A*B = C
????? 矩陣乘法一般不滿(mǎn)足交換律,即:A*B ≠ B*A
例:
>>?A=[1?2?3]
A?=
?????1?????2?????3
>>?B=[4;?5;?6]
B?=
?????4
?????5
?????6
>>?A*B?
%結(jié)果是一個(gè)標(biāo)量
ans?=
????32
>>?B*A?
%結(jié)果是一個(gè)矩陣
ans?=
?????4?????8????12
?????5????10????15
?????6????12????18
>>?
?
?
(3)? 矩陣求逆:矩陣的逆陣V定義為滿(mǎn)足V*A = I (I為與A同階的單位矩陣)。只有方陣才可以求逆,而且此方陣的行列式必須不為零,det(A) ≠ 0。如果det(A)?= 0,求逆時(shí)就會(huì)出現(xiàn)無(wú)窮大,此時(shí)的矩陣稱(chēng)為奇異的。
例:
>>?A
A?=
?????4?????8????12
?????5????10????15
?????6????12????18
>>?B
B?=
?????4?????8????12
?????6????10????15
?????7????12?????4
>>?det(A)?
%矩陣A的行列式為零
ans?=
?????0
>>?det(B)?
%矩陣B的行列式不為零
ans?=
???112
>>?inv(A)?
%對(duì)矩陣A求逆時(shí)出現(xiàn)無(wú)窮大(Inf)
Warning:?Matrix?is?singular?to?working?precision.
ans?=
???Inf???Inf???Inf
???Inf???Inf???Inf
???Inf???Inf???Inf
>>?inv(B)?
%對(duì)矩陣B求逆正常
ans?=
???-1.2500????1.0000?????????0
????0.7232???-0.6071????0.1071
????0.0179????0.0714???-0.0714
>>?
?
?
(4)? 矩陣轉(zhuǎn)置:矩陣的行列互換后構(gòu)成轉(zhuǎn)置矩陣。如果A是m×n階的,則AT是n×m階的。
例:
>>?A
A?=
?????4?????8????12
?????5????10????15
>>?B=A'
B?=
?????4?????5
?????8????10
????12????15
?
?
(5)? 矩陣分塊:矩陣A可以劃分成許多小矩陣。
例:
>>?A
A?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
>>?A1=A(1:3,?1:3)
A1?=
?????3????-4?????3
?????0????-6?????0
?????4????-3?????4
>>?A2=A(1:3,?4:5)
A2?=
?????2????-1
????-3????-3
?????2????-2
>>?A3=A(4,?1:4)
A3?=
?????1?????1?????1?????0
>>?A4=A(4,?5)
A4?=
????-1
>>?
?
?
(5)? 矩陣分解為向量:把矩陣沿行向或列向分解為單列或單行向量,常見(jiàn)的是分解為列向量。
其中:
?
?
(6)? 行向量左乘列向量:要求兩向量的長(zhǎng)度必須一致,結(jié)果為一個(gè)標(biāo)量。得出的是向量各分量的平方和。如果這些分量是正交的,則得出的是向量的長(zhǎng)度平方。它的平方根就是向量長(zhǎng)度,也稱(chēng)為向量的范數(shù)或2范數(shù)。
行向量左乘列向量得到的是
,在工程中具有這樣計(jì)算形式的問(wèn)題很多,比如用它計(jì)算兩個(gè)向量x和y之間的相關(guān)性。
?
(7)? 列向量左乘行向量:如果列向量的長(zhǎng)度為n,行向量的長(zhǎng)度為m,則相乘會(huì)得出一個(gè)n×m的矩陣,這種方法常常用來(lái)生成和計(jì)算一些復(fù)雜的大矩陣。
?
(8)? 矩陣乘法和冪次:A^2 = A*A,? A^n =? A*A*...*A。根據(jù)矩陣相乘內(nèi)階數(shù)必須相等,只有方陣才能乘方和冪次。
?
?
2、初等變換乘子矩陣的生成及MATLAB實(shí)例
?
本節(jié)通過(guò)將原矩陣左乘變換的單位矩陣實(shí)現(xiàn)矩陣的初等行變換:
(1) 行交換:將矩陣A的第 i , j 兩行互換位置。
%?行交換:交換矩陣A的第1行和第3行
%?步驟1:得到一個(gè)5階單位陣:E=eye(5)
%?步驟2:交換E的第1行和第3行得到矩陣
E1
%?步驟3:矩陣A左乘矩陣E1得到交換后
的矩陣
>>?A
A?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
>>?
E1?=
?????0?????0?????1?????0?????0
?????0?????1?????0?????0?????0
?????1?????0?????0?????0?????0
?????0?????0?????0?????1?????0
?????0?????0?????0?????0?????1
>>?E1*A
ans?=
?????4????-3?????4?????2????-2
?????0????-6?????0????-3????-3
?????3????-4?????3?????2????-1
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
>>?
?
寫(xiě)成函數(shù)E1gen(A,i,j):
function?E=E1gen(A,i,j)
n=size(A);
%求矩陣A的行數(shù)和列數(shù)
m=min(n);
%獲取矩陣行數(shù)和列數(shù)中的最小值
E=eye(m);
%產(chǎn)生單位對(duì)角陣
E(i,i)=0;?E(j,j)=0;?E(i,j)=1;?E(j,i)=1;
?
?
(2) 行乘數(shù):將矩陣A的第 i 行乘以 k 。
?
?
%?行乘數(shù):將矩陣A的第4行乘以5
%?步驟1:得到一個(gè)5階單位陣:E=eye(5)
%?步驟2:將單位陣E中的元素E(4,4)乘以5得到矩陣E2
%?步驟3:矩陣A左乘矩陣E2得到變換后
的矩陣
>>?A
A?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
>>?E2
E2?=
?????1?????0?????0?????0?????0
?????0?????1?????0?????0?????0
?????0?????0?????1?????0?????0
?????0?????0?????0?????5?????0
?????0?????0?????0?????0?????1
>>?E2*A
ans?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????5?????5?????5?????0????-5
????-2?????6????-2?????1?????3
>>?
?
寫(xiě)成函數(shù)E2gen(A,i,k):
?
function?E=E2gen(A,i,k)
n=size(A);
m=min(n);%獲取矩陣行數(shù)和列數(shù)中的最小值
E=eye(m);%產(chǎn)生單位對(duì)角陣
E(i,i)=k;
?
?
(3) 行相加:將矩陣的第 i 行乘以 k,加到第 j 行。
%?行乘數(shù)加到另一行:將矩陣A的第4行乘以2加到第5行
%?步驟1:得到一個(gè)5階單位陣:E=eye(5)
%?步驟2:將單位陣E中的元素E(5,4)乘以2得到矩陣E3
%?步驟3:矩陣A左乘矩陣E3得到變換后的矩陣
>>?A
A?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
>>?E3
E3?=
?????1?????0?????0?????0?????0
?????0?????1?????0?????0?????0
?????0?????0?????1?????0?????0
?????0?????0?????0?????1?????0
?????0?????0?????0?????2?????1
>>?E3*A
ans?=
?????3????-4?????3?????2????-1
?????0????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
?????0?????8?????0?????1?????1
>>?
?
寫(xiě)成函數(shù)E3gen(A,i,j,k):
?
function?E=E3gen(A,i,j,k)
n=size(A);
m=min(n);%獲取矩陣行數(shù)和列數(shù)中的最小值
E=eye(m);%產(chǎn)生單位對(duì)角陣
E(j,i)=k;
?
實(shí)例:
要消去下列矩陣的A(2,1),求乘子矩陣E3
A?=
?????3????-4?????3?????2????-1
?????6????-6?????0????-3????-3
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
?
在第二行加以第一行乘 -A(2,1)/A(1,1) = -2,故令E3 = E3gen(A,1,2,-2)
>>?E3=E3gen(A,1,2,-2)
E3?=
?????1?????0?????0?????0?????0
????-2?????1?????0?????0?????0
?????0?????0?????1?????0?????0
?????0?????0?????0?????1?????0
?????0?????0?????0?????0?????1
>>?E3*A
ans?=
?????3????-4?????3?????2????-1
?????0?????2????-6????-7????-1
?????4????-3?????4?????2????-2
?????1?????1?????1?????0????-1
????-2?????6????-2?????1?????3
>>?
?
綜上可知:
1、
行階梯生成等價(jià)于矩陣左乘
因此,整個(gè)行階梯形式U的生成過(guò)程,可以看作把原矩陣左乘以一系列的初等變換矩陣E1和E3。把這些初等矩陣的連乘積寫(xiě)成EX,則有:?U=EX*A,設(shè)其逆為L(zhǎng):
從而有 L*U=A?
就是說(shuō),A可以分解為一個(gè)準(zhǔn)下三角矩陣L和一個(gè)上三角(即行階梯)矩陣U的乘積。MATLAB提供了三角分解的函數(shù)lu,它的調(diào)用方法是:[L,U]=lu(A)
2、
lu分解是求行階梯的一個(gè)方法
用lu函數(shù)求出的U實(shí)際上就是A的行階梯形式(不是簡(jiǎn)化行階梯形式)。所以,求簡(jiǎn)化行階梯形式用rref函數(shù),而求行階梯形式可以用lu 函數(shù)。不過(guò),它和我們用消元運(yùn)算所得U的數(shù)據(jù)不一定相同,盡管得出的階次和階梯形狀相同。但因?yàn)樾须A梯形式可以有無(wú)數(shù)種,用不同步驟算出的結(jié)果也不同。只有變成簡(jiǎn)化行階梯形式,才能進(jìn)行比較,看它是不是惟一的。
?
?
3、行列式
(1) 行列式的幾何意義:
行列式的幾何意義是面積或體積,它的用途很單一,就是判斷奇異性,連正負(fù)號(hào)都不必關(guān)心。
(2) 行列式的計(jì)算方法:
計(jì)算行列式的最好方法還是行階梯法,可以利用lu分解
??????????????? [L,U] = lu(A)
把A分解為一個(gè)準(zhǔn)下三角矩陣L和一個(gè)上三角矩陣U的乘積。因?yàn)閐et(L) = 1,所以U和A的行列式相等。??
?????????????? det(A) = det(U)
而三角矩陣U的det(U)很好求。只要把U的主對(duì)角線(xiàn)元素連乘就可得到它的行列式。
?
實(shí)例:
>>?A
A?=
????10?????8?????6?????4?????1
?????2?????5?????8?????9?????4
?????6?????0?????9?????9?????8
?????5?????8?????7?????4?????0
?????9?????4?????2?????9?????1
>>?[L?U]=lu(A)
L?=
????1.0000??????????? 0?????????? 0?????????? 0??????????? 0
????0.2000???-0.7083????1.0000?????????? 0??????????? 0
????0.6000????1.0000??????????? 0?????????? 0??????????? 0
????0.5000???-0.8333????0.8000???-0.2953????1.0000
????0.9000????0.6667???-0.6588????1.0000??????????? 0
U?=
???10.0000????8.0000???? 6.0000???? 4.0000????1.0000
??????????? 0???-4.8000???? 5.4000???? 6.6000????7.4000
??????????? 0??????????? 0???10.6250??? 12.8750????9.0417
??????????? 0??????????? 0??????????? 0????? 9.4824????1.1235
??????????? 0??????????? 0??????????? 0???????????? 0???-1.2349
>>?du=diag(U)
du?=
???10.0000
???-4.8000
???10.6250
????9.4824
???-1.2349
>>?result=prod(du)
result?=
??5.9720e+003
>>?
?
用det求A的行列式值得到相同的結(jié)果:
>>?det(A)
ans?=
????????5972
>>?
?
?
?
4、矩陣的秩和矩陣求逆
?
矩陣的秩:
(1) 按定義,矩陣的秩是矩陣A中行列式不等于零的最高階子式的階次。是用以衡量聯(lián)立方程中有效方程數(shù)目的指數(shù)。
(2) 按照定義來(lái)計(jì)算矩陣的秩,可能遇到的問(wèn)題也是子矩陣的數(shù)量很大,每個(gè)矩陣的行列式計(jì)算又非常麻煩,其計(jì)算量也將是不可接受的天文數(shù)字。
(3) 計(jì)算矩陣的秩的最好方法是行階梯法,行階梯化簡(jiǎn)后非全為零的行數(shù)就是該矩陣的秩。用MATLAB函數(shù)r=rank(A)可以檢驗(yàn)A的秩,rank函數(shù)對(duì)A是否是方陣沒(méi)有要求,即可以有m≠n。
?
矩陣求逆:
(1) 對(duì)于n×n方陣A,當(dāng)r=n時(shí),稱(chēng)A是滿(mǎn)秩的,若r<n,必有det(A) = 0,稱(chēng)A是欠秩的或奇異的。奇異矩陣不可以求逆。?
(2) 矩陣求逆的最簡(jiǎn)單方法也是行階梯化簡(jiǎn),其方法是設(shè)定一個(gè)由A和I組成的增廣矩陣C = [A,I],求C的簡(jiǎn)化行階梯形式UC = rref([A,I]),得出UC = [I,V]。V就顯示出這個(gè)逆矩陣的內(nèi)容。
?
求逆實(shí)例:
>>?A=[3?0?3?-6;5?-1?1?-5;-3?1?4?-9;1?-3?4?-4]
A?=
?????3?????0?????3????-6
?????5????-1?????1????-5
????-3?????1?????4????-9
?????1????-3?????4????-4
>>?C=[A,eye(4)]
C?=
?????3?????0?????3????-6?????1?????0?????0?????0
?????5????-1?????1????-5?????0?????1?????0?????0
????-3?????1?????4????-9?????0?????0?????1?????0
?????1????-3?????4????-4?????0?????0?????0?????1
>>?UC=rref(C) %UC右邊四列就是矩陣A的逆
UC?=
????1.0000?????????0?????????0?????????0????0.2323???-0.0101???-0.1313???-0.0404
?????????0????1.0000?????????0?????????0????0.5354???-0.3131???-0.0707???-0.2525
?????????0?????????0????1.0000?????????0????0.5859???-0.4747???-0.1717????0.1010
?????????0?????????0?????????0????1.0000????0.2424???-0.2424???-0.1515????0.0303
>>?V=UC(:,5:8)
V?=
????0.2323???-0.0101???-0.1313???-0.0404
????0.5354???-0.3131???-0.0707???-0.2525
????0.5859???-0.4747???-0.1717????0.1010
????0.2424???-0.2424???-0.1515????0.0303
>>?
?
矩陣求逆命令:V=inv(A)
?
?
5、條件數(shù)—衡量奇異程度的量
(1) 在用數(shù)值方法計(jì)算矩陣的逆時(shí),由于計(jì)算中的誤差,人們不大可能得到理想的零合理想的全零行,所以矩陣是否奇異,并不是那么絕對(duì)的。
(2) 為了評(píng)價(jià)矩陣接近‘奇異’的程度,采用了‘條件數(shù)’(Condition Number)作為常用的衡量指標(biāo)。它永遠(yuǎn)大于1。其數(shù)值愈接近于1,計(jì)算誤差愈小。
(3) MATLAB中,條件數(shù)用cond(A)計(jì)算,它達(dá)到10的4次方以上時(shí),求逆的誤差就可能相當(dāng)可觀。像現(xiàn)在,條件數(shù)達(dá)到10的16次方(注:條件數(shù)是逆條件數(shù)RCOND的倒數(shù)),結(jié)果是根本不能用的。
?
6、用矩陣‘除法’解線(xiàn)性方程
?
(1) 如果m = n,則線(xiàn)性代數(shù)方程Ax = b中的A是方陣,設(shè)det(A)≠0,則它的逆陣存在。將上式左右同乘以inv(A) ,由于inv(A)*A = I,得到
X = inv(A)*b (1)
MATLAB創(chuàng)立了矩陣除法的概念,因?yàn)?inv(A)相當(dāng)于將A放到分母上去,所以可以把上式寫(xiě)成
X = A \ b????? (2)
‘\’就稱(chēng)為左除,因?yàn)閕nv(A)是乘在b的左方。
?
(2) 左除’\’解線(xiàn)性方程的擴(kuò)展
左除‘\’的功能遠(yuǎn)遠(yuǎn)超過(guò)了矩陣求逆函數(shù)inv,inv(A)函數(shù)要求A必須是方陣,所以(1)式只能用來(lái)解‘適定’方程,而(2)式并不要求A為方陣,在A是m×n階且m < n(欠定)時(shí),它只要求A與b的行數(shù)相等且A的秩為m。所以(2)式也可以用來(lái)解欠定方程,在下例中可以看出。此外,運(yùn)算符‘\’還能用來(lái)解超定方程。
?
例:左除’\’解欠定方程
>>?A=[3,4,3,2,1;0,6,0,3,3;4,3,4,2,2;1,1,1,0,1;2,6,2,1,3]
A?=
?????3?????4?????3?????2?????1
?????0?????6?????0?????3?????3
?????4?????3?????4?????2?????2
?????1?????1?????1?????0?????1
?????2?????6?????2?????1?????3
>>?b=[2;3;2;0;1]
b?=
?????2
?????3
?????2
?????0
?????1
>>??x=A\b
Warning:?Matrix?is?singular?to?working?precision.
x?=
???????NaN
???????NaN
???????Inf
????1.0000
????0.0000
>>?
?
得到x=inf,無(wú)解。改用行階梯方法找有效行。左除要求的是系數(shù)矩陣的行數(shù)與秩相同
>>?A
A?=
?????3?????4?????3?????2?????1
?????0?????6?????0?????3?????3
?????4?????3?????4?????2?????2
?????1?????1?????1?????0?????1
?????2?????6?????2?????1?????3
>>?b
b?=
?????2
?????3
?????2
?????0
?????1
>>?B=[A,b]
B?=
?????3?????4?????3?????2?????1?????2
?????0?????6?????0?????3?????3?????3
?????4?????3?????4?????2?????2?????2
?????1?????1?????1?????0?????1?????0
?????2?????6?????2?????1?????3?????1
>>?r=rank(B)
r?=
?????4
>>?[UB,ip]=rref(B)
UB?=
?????1?????0?????1?????0?????0?????0
?????0?????1?????0?????0?????0?????0
?????0?????0?????0?????1?????0?????1
?????0?????0?????0?????0?????1?????0
?????0?????0?????0?????0?????0?????0
ip?=
?????1?????2?????4?????5
>>?U0=UB(1:r,1:5)
U0?=
?????1?????0?????1?????0?????0
?????0?????1?????0?????0?????0
?????0?????0?????0?????1?????0
?????0?????0?????0?????0?????1
>>?d=UB(1:4,6)
d?=
?????0
?????0
?????1
?????0
>>?x=U0\d
x?=
?????0
?????0
?????0
?????1
?????0
>>?
?
其中,x是此欠定方程的一個(gè)特解。
?