點選藍字關注我們
線性方程組的求解主要有兩種方法,分别是直接法和疊代法,本節也将圍繞這兩種方法去講解一些MATLAB在求解線性方程組的相關知識。
一、
線性方程組的直接解法
主要可以分為以下三種方法:
高斯( Gauss )消去法
列主元消去法
矩陣的三角分解法
高斯( Gauss )消去法是一個經典的直接法,由它改進得到的列主元消去法,是目前計算機上求解線性方程組的标準算法,其特點就是通過消元将一般線性方程組的求解問題轉化為三角方程組的求解問題。此外,還有矩陣的三角分解法等許多直接求解算法 。
1、利用左除運算符的直接解法
MATLAB 提供了一個左除運算符“\” 用于求解線性方程組,它使用列主元消去法,使用起來十分友善。對于線性方程組 Ax=b ,可以利用左除運算符反斜杠求解,b左除以A可獲得線性方程組的數值解x。
注:這裡的A和b是矩陣形式,且A裡面的系數寫法要與未知數對應。
例、用左除運算符求解下列線性方程組 。
>> A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
>> b=[13,-9,6,0]';
>> x=A\b
x = -66.5556
25.6667
-18.7778
26.5556
2、利用矩陣分解求解線性方程組
矩陣分解是設計算法的重要技巧,是指将一個給定的矩陣分解成若幹個特殊類型矩陣的乘積 ,進而将一個一般的矩陣計算問題轉化為幾個易求的特殊矩陣的計算問題 。通過矩陣分解方法求解線性方程組的優點是運算速度快,可以節省存儲空間 。
下面将主要去講解矩陣分解中的LU分解:
(1) LU 分解的基本思想:
矩陣的 LU分解就是将一個n階矩陣表示為一個下三角矩陣和一個上三角矩陣的乘積。線性代數中已經證明,隻要方陣是非奇異的,LU 分解總是可以進行的。如下圖
對于三角方程很容易求解,于是可以首先求解向量y使 Ly=b,再求解 Ux =y,進而達到求解線性方程組 Ax=b 的目的。
(2)matlab的LU分解函數
LU 分解函數是根據列主元LU分解算法定義的,具有較好的資料穩定性。lu函數有兩種調用格式:
[L,U]= lu (A) :産生一個上三角陣U和一個變換形式的下三角陣L,使之滿足A=LU 。注意,這裡的矩陣A必須是方陣。
[L,U,P]= lu (A) :産生一個上三角陣U和一個下三角陣L以及一個置換矩陣P,使之滿足 PA=LU 。同樣,矩陣A必須是方陣。
注:當使用第一種格式時,矩陣L往往不是一個下三角陣,但可以通過行交換成為一個下三角陣。
還是以上述的線性方程組為例:
>> A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
>> b=[13,-9,6,0]';
>> [L,U]=lu(A);
>> x=U\(L\b)
x =
-66.5556
25.6667
-18.7778
26.5556
>> [L,U,P]=lu(A);
>> x=U\(L\P*b)
x =
-66.5556
25.6667
-18.7778
26.5556
二、
線性方程組的疊代解法
疊代法是一種不斷用變量的原值推出它的新值的過程,是用計算機解決問題的一種基本方法 。如下面圖檔所示
介紹一種 線性方程組的疊代解法——雅可比(Jacobi)疊代法
對于線性方程組Ax=b,對于系數矩陣還是采取上述的矩陣分解的基本思想
求解公式為:x(k+1)=D(-1)*(L+U)*x(k)+D(-1)*b
matlab中沒有雅可比(Jacobi)疊代法的内置函數,是以此種方法需要自己程式設計實作,網上也有很多的代碼,大家可以去了解一下,下面是網上的一段雅可比(Jacobi)疊代法的代碼編寫
function [y,n]=jacobi(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
其中,A是系數陣,b是方程組右邊的常數,x0是疊代的初始值,ep是精度,在matlab 中将這段代碼寫入一個function,調用結果如下(以下面的方程組為例):
>> format long
>> A=[4,-2,-1;-2,4,3;-1,-3,3];
>> b=[1,5,0]';
>> [x,n]=jacobi(A,b,[0,0,0]',1.0e-6)
x =
0.970588483091126
0.852941039929380
1.176470992801838
n =
35
>> [L,U]=lu(A);
x=U\(L\b)
x =
0.970588235294118
0.852941176470588
1.176470588235294
可以看出兩種方法算出來的結果,很是接近。當然,除了此方法,還有很多的疊代方法去求解線性方程組,常見的有高斯——賽德爾(Gauss——Serdel)疊代法,附上連結
https://blog.51cto.com/592669550/932010
本節内容就到這裡結束了,
下節将推出非線性方程的求解,敬請期待!
關于MATLAB的學習:
大家可以關注我們的知乎專欄——資料可視化和資料分析中matlab的使用
歡迎大家加入我們的MATLAB學習交流群:
953314432
往期推薦
●Matlab多項式計算
●圖像進行中的代數運算及幾何變換
●資料預處理——噪聲值平滑處理
掃二維碼關注我們 發現更多精彩
出品:Asoul水雲天課堂工作室
一想到你在關注我就忍不住有點緊張