工程和科學計算的許多基本方程都是建立在守恒定律的基礎之上的,比如質量守恒等,在數(shù)學上,可以建立起形如 [A]{x}= 的平衡方程。其中{x}表示各個分量在平衡時的取值,它們表示系統(tǒng)的狀態(tài)或響應;右端向量由無關系統(tǒng)性態(tài)的常數(shù)組成通常表示為外部激勵。矩陣A則表示為由系統(tǒng)各部分相互作用或耦合關系的參數(shù)組成的系數(shù)矩陣。在工程上則意味著[相互作用][響應]=[激勵]。
對于單個方程,可以采用前面介紹的一些求根法加以求解,然而事實上還有一些關系式是彼此相互耦合的,比如復雜電路的基爾霍夫定律。這就需要將這些關系式表示為一個線性代數(shù)方程組。下面就此問題介紹MATLAB求解線性代數(shù)方程組的一些方法,重點介紹高斯消元法。
目錄
一、取逆和“左除”
取逆
左除
二、克萊姆法則
代碼實現(xiàn):
問題求解:
三、高斯消元法
原理:
代碼實現(xiàn):
問題求解:
四、三對角方程組的求解
代碼實現(xiàn):
問題求解:
一、取逆和“左除”
對于形如 A*x=b的線性代數(shù)方程組,MATLAB提供了兩種直接求解的方法:取逆 和“左除”。
-
取逆
? ? ? ? MATLAB的矩陣取逆函數(shù)為inv(A)
? ? ? ? 故???x=inv(A)*b
-
左除
? ? ? ? x=A\b
二、克萊姆法則
學習過線性代數(shù)的同學應該對克萊姆法則并不陌生,這里不再贅述,只是講一下在MATLAB中的實現(xiàn):
問題:求解
代碼實現(xiàn):
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
b=[-0.01 0.67 -0.44]';
D=det(A);
A(:,1)=b;
x(1)=det(A)/D;
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
A(:,2)=b;
x(2)=det(A)/D;
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
A(:,3)=b;
x(3)=det(A)/D;
x
問題求解:
>> Clem
x =
-14.9000 -29.5000 19.8000
三、高斯消元法
對于小型方程,使用克萊姆法則還是很方便的,但工程上往往面對的是龐大的方程組問題,這個時候僅僅用克萊姆法則是萬萬不夠的。
高斯消元法盡管是求解聯(lián)立方程組最古老的方法之一,但直到今天依然是實際應用中最為重要的方法之一。
原理:
一般方程組(A*x=b):
步驟:向前消元-->向后回代
向前消元:第一階段是將A矩陣消為一個上三角矩陣。方法是將第一個方程左右同時乘以
然后用第二個方程去減它這樣就消掉了.
類似的,反復這樣進行,就可以將原方程組變換為新的“上三角方程組”。
向后回代:第二個階段是利用“上三角方程組”解出x。
首先解出然后將其帶入倒數(shù)第二個方程,求解,以此類推。
這樣就成功的解出了x。
然而,不知道大家發(fā)沒發(fā)現(xiàn),如果在執(zhí)行向前消元時遇到=0,或者很小很小,這樣就遇到了一個問題——“除數(shù)不可以為0”,這就需要每一次執(zhí)行的時候選出最大的數(shù)作為“主元”,將主元作為新的“除數(shù)”。
稱之前的高斯法叫樸素的高斯消元法,后者為選主元的高斯消元法。
代碼實現(xiàn):
function x = GaussPivot(A,b)
%%建立高斯消元法的實現(xiàn)代碼
%求解方程A*x=b
%步驟:
%(1)向前消元;
%(2)向后回代。
%%輸入:
%A=系數(shù)矩陣
%b=右向量
%%輸出:
%x=方程的解向量
[m,n]=size(A);
if m~=n,error("系數(shù)矩陣須為方陣");end
nb=n+1;
Aug=[A b];
%向前消元
for k=1:n-1
%選主元(max函數(shù)可以傳回最大值和最大值索引)
[big,i] = max(abs(Aug(k:n,k)));
ipr = i+k-1;
if ipr~=k
Aug([k,ipr],:) = Aug([ipr,k],:);%交換:將絕對值大的數(shù)作主元
end
for i=k+1:n
factor = Aug(i,k)/Aug(k,k);
Aug(i,k:nb) = Aug(i,k:nb)-factor*Aug(k,k:nb);
end
end
%向后回代
x = zeros(n,1);%創(chuàng)建解向量
x(n)=Aug(n,nb)/Aug(n,n);%先求出最后一個值
for i=n-1:-1:1
x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i);
end
end
問題求解:
問題:
%%高斯消元法
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
b=[-0.01 0.67 -0.44]';
x = GaussPivot(A,b)
?結果:
>> GaussPivot_test
x =
-14.9000
-29.5000
19.8000
?四、三對角方程組的求解
工程上經(jīng)常遇到形如如下的方程組:
求解步驟依然是向前消元-->向后回代,只不由于A的稀疏性,再使用高斯消元法就太消耗時間了,書中專門為其設計了代碼
代碼實現(xiàn):
function x = Tridiag(e,f,g,r)
%求解三對角方程組
% 由于三對角方程的系數(shù)矩陣稀疏,運算量與n成正比,而不是高斯消元的n^3
%%輸入:
%e =下對角線
%f = 主對角線
%g =上對角線
%r = 右向量
%%輸出:
%x=方程的解向量
n=length(f);
for k=2:n
factor=e(k)/f(k-1);
f(k)=f(k)-factor*g(k-1);
r(k)=r(k)-factor*r(k-1);
end
x(n)=r(n)/f(n);
for k= n-1:-1:1
x(k)=(r(k)-g(k)*x(k+1))/f(k);
end
問題求解:
就上述問題進行求解文章來源:http://www.zghlxwxcb.cn/news/detail-413963.html
e=[0,-1,-1,-1];
f=[2.04,2.04,2.04,2.04];
g=[-1,-1,-1,0];
r=[40.8,0.8,0.8,200.8];
x = Tridiag(e,f,g,r)
>> Tridiag_test
x =
65.9698 93.7785 124.5382 159.4795
聲明:文章來源于筆者學習【美】Steven C. CHapra所著,林賜譯 《工程于科學數(shù)值方法的MATLAB實現(xiàn)》(第4版)的筆記,如有謬誤或想深入了解,請翻閱原書。文章來源地址http://www.zghlxwxcb.cn/news/detail-413963.html
到了這里,關于MATLAB數(shù)值分析學習筆記:線性代數(shù)方程組的求解和高斯消元法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!