????????進(jìn)行科學(xué)計(jì)算時(shí),最重要的一個(gè)問題是對(duì)聯(lián)立線性方程組求解。在矩陣表示法中,常見問題采用以下形式:給定兩個(gè)矩陣 A 和 b,是否存在一個(gè)唯一矩陣 x 使 Ax = b 或 xA = b?
????????考慮一維示例具有指導(dǎo)意義。例如,方程
????????7x = 21
????????是否具有唯一解?
????????答案當(dāng)然是肯定的。方程有唯一解 x = 3。通過除法很容易求得該解:
????????x = 21/7 = 3。
????????該解通常不是通過計(jì)算 7 的倒數(shù)求得的,即先計(jì)算 7
–1
= 0.142857...,然后將 7
–1 乘以 21。這將需要更多的工作,而且如果 7
–1 以有限位數(shù)表示時(shí),準(zhǔn)確性會(huì)較低。類似注意事項(xiàng)也適用于多個(gè)未知數(shù)的線性方程組;MATLAB 在解此類方程時(shí)不會(huì)計(jì)算矩陣的逆。
????????盡管這不是標(biāo)準(zhǔn)的數(shù)學(xué)表示法,但 MATLAB 使用標(biāo)量示例中常見的除法術(shù)語來描述常規(guī)聯(lián)立方程組的解。斜杠 / 和反斜杠 \ 這兩個(gè)除號(hào)分別對(duì)應(yīng) MATLAB 函數(shù)
mrdivide
和
mldivide。兩種運(yùn)算符分別用于未知矩陣出現(xiàn)在系數(shù)矩陣左側(cè)或右側(cè)的情況:
x = b/A
????????表示使用 mrdivide
獲得的矩陣方程 xA = b 的解。
x = A\b
????????表示使用 mldivide
獲得的矩陣方程 Ax = b 的解。
????????考慮將方程 Ax = b 或 xA = b 的兩端“除以”A。系數(shù)矩陣 A
始終位于“分母”中。
????????x = A\b 的維度兼容性條件要求兩個(gè)矩陣
A
和
b
的行數(shù)相同。這樣,解
x
的列數(shù)便與
b 的列數(shù)相同,并且其行維度等于
A
的列維度。對(duì)于
x = b/A
,行和列的角色將會(huì)互換。
????????實(shí)際上,Ax=b 形式的線性方程組比 xA=b 形式的線性方程組更常見。因此,反斜杠的使用頻率要遠(yuǎn)高于斜杠的使用頻率。本節(jié)其余部分將重點(diǎn)介紹反斜杠運(yùn)算符;斜杠運(yùn)算符的對(duì)應(yīng)屬性可以從以下恒等式推知:
(b/A)' = (A'\b').
????????系數(shù)矩陣 A
不需要是方陣。如果
A
的大小為 m×n,則有三種情況:
????????m = n
????????方陣方程組。求精確解。
????????m > n
????????超定方程組,即方程個(gè)數(shù)多于未知數(shù)個(gè)數(shù)。求最小二乘解。
????????m < n
????????欠定方程組,即方程個(gè)數(shù)少于未知數(shù)個(gè)數(shù)。使用最多 m 個(gè)非零分量求基本解。
1mldivide 算法
????????mldivide 運(yùn)算符使用不同的求解器來處理不同類型的系數(shù)矩陣。通過檢查系數(shù)矩陣自動(dòng)診斷各種情況。
????????線性方程組 Ax = b 的通解描述了所有可能的解??梢酝ㄟ^以下方法求通解:
????????1求對(duì)應(yīng)的齊次方程組 Ax = 0 的解。使用 null 命令通過鍵入
null(A) 來執(zhí)行此操作。這會(huì)將解空間的基向量恢復(fù)為 Ax = 0。任何解都是基向量的線性組合。
????????2求非齊次方程組 Ax = b 的特定解。然后,可將 Ax = b 的任何解寫成第 2 步中的 Ax = b 的特定解加上第 1 步中的基向量的線性組合之和。本節(jié)其余部分將介紹如何使用 MATLAB 求 Ax = b 的特定解,如第 2 步中所述。
2方陣方程組
????????最常見的情況涉及到一個(gè)方陣系數(shù)矩陣 A
和一個(gè)右側(cè)單列向量
b
。
2.1非奇異系數(shù)矩陣
????????如果矩陣 A 是非奇異矩陣,則解
x = A\b
的大小與
b
的大小相同。例如:
A = pascal(3);
u = [3; 1; 4];
x = A\u
x =
10
-12
5
????????可以確認(rèn) A*x
恰好等于
u。如果
A
和
b
為方陣并且大小相同,則
x= A\b
也具有相同大?。?
X =
19 -3 -1
-17 4 13
6 0 -6
????????可以確認(rèn) A*x
恰好等于
b。以上兩個(gè)示例具有確切的整數(shù)解。這是因?yàn)橄禂?shù)矩陣選為
pascal(3)
,這是滿秩矩陣(非奇異的)。
2.2奇異系數(shù)矩陣
????????如果方陣 A 不包含線性無關(guān)的列,則該矩陣為奇異矩陣。如果 A 為奇異矩陣,則 Ax = b 的解將不存在或不唯一。如果
A
接近奇異或檢測(cè)到完全奇異性,則反斜杠運(yùn)算符
A\b 會(huì)發(fā)出警告。如果 A 為奇異矩陣并且 Ax = b 具有解,可以通過鍵入以下內(nèi)容求不是唯一的特定解
????????pinv(A) 是 A 的偽逆。如果 Ax = b 沒有精確解,則
pinv(A)
將返回最小二乘解。例如:
A = [ 1 3 7 ;
-1 4 4?;
1 10 18 ] 為奇異矩陣,可以通過鍵入以下內(nèi)容進(jìn)行驗(yàn)證:
ans =
2
????????由于 A 不是滿秩,它有一些等于零的奇異值。對(duì)于
b =[5;2;12]
,方程 Ax = b 具有精確解:
ans =
0.3850
-0.1103
0.7066
????????通過鍵入以下內(nèi)容驗(yàn)證 pinv(A)*b
是否為精確解
ans =
5.0000
2.0000
12.0000
????????但是,如果
b = [3;6;0]
,則 Ax = b 沒有精確解。在這種情況下,
pinv(A)*b
會(huì)返回最小二
乘解。鍵入
ans =
-1.0000
4.0000
2.0000
????????則不會(huì)返回原始向量 b。通過得到增廣矩陣
[A b] 的簡(jiǎn)化行階梯形式,可以確定 Ax = b 是否具有精確解。為此,對(duì)于此示例請(qǐng)輸入
ans =
1.0000 0 2.2857 0
0 1.0000 1.5714 0
0 0 0 1.0000
????????由于最下面一行全部為零(最后一項(xiàng)除外),因此該方程無解。在這種情況下,pinv(A) 會(huì)返回最小二乘解。
3超定方程組
????????此示例說明在對(duì)試驗(yàn)數(shù)據(jù)的各種曲線擬合中通常會(huì)如何遇到超定方程組。在多個(gè)不同的時(shí)間值
t
對(duì)數(shù)量
y 進(jìn)行測(cè)量以生成以下觀測(cè)值??梢允褂靡韵抡Z句輸入數(shù)據(jù)并在表中查看該數(shù)據(jù)。
t = [0 .3 .8 1.1 1.6 2.3]';
y = [.82 .72 .63 .60 .55 .50]';
B = table(t,y)
B=6×2 table
t y
___ ____
0 0.82
0.3 0.72
0.8 0.63
1.1 0.6
1.6 0.55
2.3 0.5
????????嘗試使用指數(shù)衰減函數(shù)對(duì)數(shù)據(jù)進(jìn)行建模
?
????????上一方程表明,向量 y 應(yīng)由兩個(gè)其他向量的線性組合來逼近。一個(gè)是元素全部為 1 的常向量,另一個(gè)是帶有分量
exp(-t)
的向量。未知系數(shù)
c
1
和
c
2 可以通過執(zhí)行最小二乘擬合來計(jì)算,這樣會(huì)最大限度地減小數(shù)據(jù)與模型偏差的平方和。在兩個(gè)未知系數(shù)的情況下有六個(gè)方程,用 6×2 矩陣表示。
E = [ones(size(t)) exp(-t)]
E = 6×2
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
????????使用反斜杠運(yùn)算符獲取最小二乘解。
c = 2×1
0.4760
0.3413
????????也就是說,對(duì)數(shù)據(jù)的最小二乘擬合為
?
????????以下語句按固定間隔的 t
增量為模型求值,然后與原始數(shù)據(jù)一同繪制結(jié)果:
T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T,Y,'-',t,y,'o')
文章來源:http://www.zghlxwxcb.cn/news/detail-626809.html
????????E*c 與
y 不完全相等,但差值可能遠(yuǎn)小于原始數(shù)據(jù)中的測(cè)量誤差。如果矩形矩陣
A
沒有線性無關(guān)的列,則該矩陣秩虧。如果
A
秩虧,則
AX = B 的最小二乘解不唯一。如果A
秩虧,則
A\B
會(huì)發(fā)出警告,并生成一個(gè)最小二乘解。您可以使用
lsqminnorm 求在所有解中具有最小范數(shù)的解
X
。
4欠定方程組
????????本例演示了欠定方程組的解不唯一的情況。欠定線性方程組包含的未知數(shù)比方程多。MATLAB 矩陣左除運(yùn)算求基本最小二乘解,對(duì)于
m
×
n
系數(shù)矩陣,它最多有
m
個(gè)非零分量。
以下是一個(gè)簡(jiǎn)單的隨機(jī)示例:
R = [6 8 7 3; 3 5 4 1]
rng(0);
b = randi(8,2,1)
R =
6 8 7 3
3 5 4 1
b =
7
8
線性方程組
Rp = b
有兩個(gè)方程,四個(gè)未知數(shù)。由于系數(shù)矩陣包含較小的整數(shù),因此適合使用
format 命令以有理格式顯示解。通過以下命令可獲取特定解
p =
0
17/7
0
-29/7
????????其中一個(gè)非零分量為 p(2)
,因?yàn)?
R(:,2)
是具有最大范數(shù)的
R
的列。另一個(gè)非零分量為
p(4)
,因?yàn)?
R(:,4)
在消除
R(:,2) 后起控制作用。欠定方程組的完全通解可以通過
p
加上任意零空間向量線性組合來表示,可以使用
null 函數(shù)(使用請(qǐng)求有理基的選項(xiàng))計(jì)算該空間向量。
Z =
-1/2 -7/6
-1/2 1/2
1 0
0 1
????????可以確認(rèn) R*Z
為零,并且殘差
R*x - b
遠(yuǎn)遠(yuǎn)小于任一向量
x(其中x = p + Z*q)?
由于
Z
的列是零空間向量,因此
Z*q
是以下向量的線性組合:
????????為了說明這一點(diǎn),選擇任意 q
并構(gòu)造 x,計(jì)算殘差的范數(shù)。
q = [-2; 1];
x = p + Z*q;
format short
norm(R*x - b)
ans =
2.6645e-15
????????如果有無限多個(gè)解,則最小范數(shù)解具有特別意義。您可以使用 lsqminnorm 計(jì)算最小范數(shù)最小二乘解。該解具有
norm(p)
的最小可能值。
p =
-207/137
365/137
79/137
-424/137
5多右端線性方程組的求解
????????某些問題涉及求解具有相同系數(shù)矩陣 A
但具有不同右端
b
的線性方程組。如果可以同時(shí)使用不同的
b
值,則可以將
b
構(gòu)造為多列矩陣,并使用單個(gè)反斜杠命令求解所有方程組:
X = A\[b1 b2 b3 …]。但是,有時(shí)不同的
b 值并非全部同時(shí)可用,也就是說,您需要連續(xù)求解若干方程組。如果使用斜杠 (/) 或反斜杠 (\) 求解其中一個(gè)方程組,則該運(yùn)算符會(huì)對(duì)系數(shù)矩陣
A 進(jìn)行分解,并使用此矩陣分解來求解。然而,隨后每次使用不同的
b
求解類似方程組時(shí),運(yùn)算符都會(huì)對(duì)
A 進(jìn)行同樣的分解,而這是一次冗余計(jì)算。此問題的求解是預(yù)先計(jì)算
A
的分解,然后重新使用因子對(duì) b 的不同值求解。但是,實(shí)際上,以這種方式預(yù)先計(jì)算分解可能很困難,因?yàn)樾枰酪?jì)算的分解(LU、LDL、Cholesky 等)以及如何乘以因子才能對(duì)問題求解。例如,使用 LU 分解,您需要求解兩個(gè)線性方程組才能求解原始方程組 Ax = b:
[L,U] = lu(A);
x = U \ (L \ b);
????????對(duì)于具有若干連續(xù)右端的線性方程組,建議使用 decomposition 對(duì)象求解。借助這些對(duì)象,您可利用預(yù)先計(jì)算矩陣分解帶來的性能優(yōu)勢(shì),而不必了解如何使用矩陣因子。您可以將先前的 LU 分解替換為:
dA = decomposition(A,'lu');
x = dA\b;
????????如果您不確定要使用哪種分解,decomposition(A)
會(huì)根據(jù)
A 的屬性選擇正確的類型,類似于反斜杠的功能。
????????以下簡(jiǎn)單測(cè)試驗(yàn)證了此方法可能帶來的性能優(yōu)勢(shì)。該測(cè)試分別使用反斜杠 (\) 和 decomposition 對(duì)同一稀疏線性方程組求解 100 次。
n = 1e3;
A = sprand(n,n,0.2) + speye(n);
b = ones(n,1);
% Backslash solution
tic
for k = 1:100
x = A\b;
end
toc
Elapsed time is 9.006156 seconds.
% decomposition solution
tic
dA = decomposition(A);
for k = 1:100
x = dA\b;
end
toc
Elapsed time is 0.374347 seconds.
????????對(duì)于這個(gè)問題,decomposition
求解比單獨(dú)使用反斜杠要快得多,而語法仍然很簡(jiǎn)單。
6迭代法
????????如果系數(shù)矩陣 A 很大并且是稀疏矩陣,分解方法一般情況下將不會(huì)有效。迭代方法可生成一系列近似解。MATLAB 提供了多個(gè)迭代方法來處理大型的稀疏輸入矩陣。
7多線程計(jì)算
????????對(duì)于許多線性代數(shù)函數(shù)和按元素的數(shù)值函數(shù),MATLAB 軟件支持多線程計(jì)算。這些函數(shù)將自動(dòng)在多個(gè)線程上執(zhí)行。要使函數(shù)或表達(dá)式在多個(gè) CPU 上更快地執(zhí)行,必須滿足許多條件:
1 函數(shù)執(zhí)行的運(yùn)算可輕松劃分為并發(fā)執(zhí)行的多個(gè)部分。這些部分必須能夠在進(jìn)程之間幾乎不通信的情況下執(zhí)行。它們應(yīng)需要很少的序列運(yùn)算。
2數(shù)據(jù)大小足以使并發(fā)執(zhí)行的任何優(yōu)勢(shì)在重要性方面超過對(duì)數(shù)據(jù)分區(qū)和管理各個(gè)執(zhí)行線程所需的時(shí)間。例如,僅當(dāng)數(shù)組包含數(shù)千個(gè)或以上的元素時(shí),大多數(shù)函數(shù)才會(huì)加速。
3運(yùn)算未與內(nèi)存綁定;處理時(shí)間不受內(nèi)存訪問時(shí)間控制。一般而言,復(fù)雜函數(shù)比簡(jiǎn)單函數(shù)速度更快。如果啟用多線程,
inv
、
lscov
、
linsolve
和
mldivide 將會(huì)對(duì)大型雙精度數(shù)組(約 10,000 個(gè)元素或更多)大幅增加速度。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-626809.html
到了這里,關(guān)于matlab使用教程(6)—線性方程組的求解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!
本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!