MATLAB入門學習-#6-Jacobi、Gauss-Seidel、SOR迭代法編程練習

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章