迭代法是前面介紹的消元法的有效替代,線性代數(shù)方程組常用的迭代法有高斯-賽德爾方法和雅克比迭代法,下面會(huì)講到二者的不同之處,大家會(huì)發(fā)現(xiàn)兩者的實(shí)現(xiàn)原理其實(shí)類似,只是方法不同,本篇只重點(diǎn)介紹高斯-賽德爾方法。
原理:
看了我之前的筆記的同學(xué)應(yīng)該已經(jīng)對(duì)迭代法不再陌生了,無(wú)非就是首先取初始值,然后選取一個(gè)方法進(jìn)行迭代,直到滿足終止條件為止,簡(jiǎn)單概括為:
?高斯-賽德爾方法也是如此,首先猜測(cè)xi的初始值(i=1,2···n),一種簡(jiǎn)單的方法是xi=0.
把這些初始值(除了x1)帶入第一個(gè)方程,就可以解出x1的新值為把這個(gè)新的x1和其他初始值(除了x2)帶入第二個(gè)方程,解出新的x2,以此類推,直到第一個(gè)迭代過(guò)程結(jié)束,重復(fù)迭代直到下面的終止準(zhǔn)則成立(迭代過(guò)程收斂)
在高斯-賽德爾方法中,一旦計(jì)算出某個(gè)xi的新值,就會(huì)作為已知被代入到下一個(gè)方程中,二前文提到的雅克比迭代法則不是如此,該方法一一次迭代為單位進(jìn)行更新,也就是說(shuō),xi的新值不會(huì)馬上被代入到下一個(gè)方程中,而是等到本次迭代之后再帶入到下一次迭代,下面引用《工程于科學(xué)數(shù)值方法的MATLAB實(shí)現(xiàn)》(第4版)的一張圖說(shuō)明問(wèn)題
?左邊為高斯-賽德爾方法,右邊為雅克比迭代法。
?代碼實(shí)現(xiàn):
function x = GuessSeidel(A,b,es,maxit)
%%GuessSeidel:高斯-賽德爾方法求解線性方程組
% 高斯-賽德爾方法是一種迭代法,首先猜測(cè)各個(gè)xi的初始值(一個(gè)簡(jiǎn)單的方法是設(shè)各個(gè)xi為0)
%將這些初始值帶入到第一個(gè)方程解出x1,然后更新x1,將xi帶入第二個(gè)方程x2,更新x2
%依次迭代,直至數(shù)值解非常接近真實(shí)值為止
%判斷條件:對(duì)任意的i,有ea(i)=abs((x(i)-xold(i))/x(i))<=es
%即:max(ea)<=es
%%輸入
%A=系數(shù)矩陣
%b=右側(cè)矩陣
%es=終止準(zhǔn)則(default = 0.00001%)
%maxit=最大迭代次數(shù)(default = 50)
%輸出:
%x=解向量
%%代碼實(shí)現(xiàn)
%思路:解向量可以簡(jiǎn)單的表示為x=d-C*x
%其中di=b_i/a_ii,C的對(duì)角線元素為0。
if nargin<2,error('至少輸入系數(shù)矩陣和右側(cè)矩陣'),end
if nargin<4||isempty(maxit),maxit=50;end
if nargin<3||isempty(es),es=0.0000001;end
[m,n]=size(A);
if m~=n,error('系數(shù)矩陣必須為方陣'), end
%求解C
C = A;
for i = 1:n
C(i,i)=0;
x(i) = 0;%順便求初始x
end
x=x';
for i = 1:n
C(i,1:n) = C(i,1:n)/A(i,i);
end
%求解d
for i=1:n
d(i)=b(i)/A(i,i);
end
%開始迭代
iter=0;
while(1)
xold=x;%記錄上次的x
for i=1:n
x(i)=d(i) - C(i,:)*x;%求解并更新xi
if x(i)~=0
ea(i)=abs((x(i)-xold(i))/x(i));
end
end
iter = iter+1;
if max(ea)<=es || iter>=maxit,break, end
end
end
問(wèn)題求解:
問(wèn)題:
下面分別用了?高斯-賽德爾方法,逆矩陣法和高斯消元法求解該問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744939.html
%%使用高斯賽德爾方法求解一組線性方程組
A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10];
b=[7.85 -19.3 71.4]';
%下分別使用高斯賽德爾,逆矩陣法,選主元高斯法求解問(wèn)題
x_1=GuessSeidel(A,b,1e-1,20)
x_2=inv(A)*b
x_3=GaussPivot(A,b)
>> GuessSeidel_test
x_1 =
3.0000
-2.5000
7.0000
x_2 =
3.0000
-2.5000
7.0000
x_3 =
3.0000
-2.5000
7.0000
聲明:文章來(lái)源于筆者學(xué)習(xí)【美】Steven C. CHapra所著,林賜譯 《工程于科學(xué)數(shù)值方法的MATLAB實(shí)現(xiàn)》(第4版)的筆記,如有謬誤或想深入了解,請(qǐng)翻閱原書。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744939.html
到了這里,關(guān)于MATLAB數(shù)值分析學(xué)習(xí)筆記:線性代數(shù)方程組的求解和高斯-賽德爾方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!