MATLAB入門學習-#6-Jacobi、Gauss-Seidel、SOR迭代法編程練習
這三種迭代法是在數值分析課程裏學到的,都是求解線性方程組用的,相關的知識可以在數值計算方法的第三章裏面找,可以說已經把最核心的怎麼算和爲什麼這麼算給交代了,剩下的任務就僅僅是編程實現就完了。
畢竟自己也沒怎麼編過程序,更是很久以來第一次寫function,所以還是比較簡陋的,但是也能完成相應的操作。在此就僅僅是記錄一下自己學習matlab的歷程把…
1.Jacobi迭代法
function [B,g,x]=jacobi(A,b,times,x0)
%[B,g,x]=jacobi(A,b,times,x0)
%
%B爲jacobi迭代矩陣
%g爲jacobi變形後的b
%x爲方程組的解
%A爲係數矩陣
%b爲矩陣右側
%times爲迭代次數
%x0爲初始x
D=diag(diag(A));
c=size(A);
I=eye(c);
B=I-D\A; %使用左除或者右除要比使用inv計算快
g=D\b;
if vrho(B)>=1 %求B的譜
error('jacobi迭代法不收斂!');
end
i=1;
while i<=times
x=B*x0+g; %來自書上
x0=x;
disp(['第',num2str(i),'次']);
disp(x);
i=i+1;
end
2.Gauss-Seidel迭代法
function [M,x]=gauss_seidel(A,b,x0,times)
%[M,x]=gauss_seidel(A,b,x0,times)
%
%M爲jacobi迭代矩陣
%x爲方程組的解
%A爲係數矩陣
%b爲矩陣右側
%times爲迭代次數
%x0爲初始x0
D=diag(diag(A));
L=D-tril(A);
U=D-triu(A);
M=(D-L)\U;
if vrho(M)>=1 %求B的譜
error('jacobi迭代法不收斂!');
end
i=1;
while i<=times
x=((D-L)\U)*x0+(D-L)\b; %來自書上
x0=x;
disp(['第',num2str(i),'次']);
disp(x);
i=i+1;
end
3.SOR迭代法(鬆弛法)
function [M,x]=SOR(A,b,x0,times,w)
%[M,x]=SOR(A,b,x0,times,w)
%
%M爲jacobi迭代矩陣
%x爲方程組的解
%A爲係數矩陣
%b爲矩陣右側
%times爲迭代次數
%x0爲初始x0
%w爲參數因子
D=diag(diag(A));
L=D-tril(A);
U=D-triu(A);
M=(D-w.*L)\((1-w).*D+w.*U);
if vrho(M)>=1 %求B的譜
error('jacobi迭代法不收斂!');
end
i=1;
while i<=times
x=M*x0+(D-w.*L)\(w.*b); %來自書上
x0=x;
disp(['第',num2str(i),'次']);
disp(x);
i=i+1;
end