Jacobi迭代法 Gauss-Seidel迭代法
按照演算法(Jacobi迭代法)編寫Matlab程式(Jacobi.m)
function [x, k, index]=Jacobi(A, b, ep, it_max)
% 求解線性方程組的Jacobi迭代法,其中
% A --- 方程組的係數矩陣
% b --- 方程組的右端項
% ep --- 精度要求。省缺為1e-5
% it_max --- 最大迭代次數,省缺為100
% x --- 方程組的解
% k --- 迭代次數
% index --- index=1表示迭代收斂到指定要求;
% index=0表示迭代失敗
if nargin <4 it_max=100; end
if nargin <3 ep=1e-5; end
n=length(A); k=0;
x=zeros(n,1); y=zeros(n,1); index=1;
while 1
for i=1:n
y(i)=b(i);
for j=1:n
if j~=i
y(i)=y(i)-A(i,j)*x(j);
end
end
if abs(A(i,i))<1e-10 | k==it_max
index=0; return;
end
y(i)=y(i)/A(i,i);
end
if norm(y-x,inf)<ep
break;
end
x=y; k=k+1;
end
用Jacobi迭代法求方程組
的解。
輸入:
A=[4 3 0;3 3 -1;0 -1 4];
b=[24;30;-24];
[x, k, index]=Jacobi(A, b, 1e-5, 100)
輸出:
x =
-2.9998
11.9987
-3.0001
k =
100
index =
0
2. 熟悉迭代法,並編寫程式
function [v,sN,vChain]=gaussSeidel(A,b,x0,errorBound,maxSp)
%Gauss-Seidel迭代法求解線性方程組
%A-係數矩陣 b-右端向量 x0-初始迭代點 errorBound-近似精度 maxSp-最大迭代次數
%v-近似解 sN-迭代次數 vChain-迭代過程的所有值
step=0;
error=inf;
s=size(A);
D=zeros(s(1));
vChain=zeros(15,3);%最多能記錄15次迭代次數
k=1;
fx0=x0;
for i=1:s(1)
D(i,i)=A(i,i);
end;
L=-tril(A,-1);
U=-triu(A,1);
while error>=errorBound & step<maxSp
x0=inv(D)*(L+U)*x0+inv(D)*b;
vChain(k,:)=x0';
k=k+1;
error=norm(x0-fx0);
fx0=x0;
step=step+1;
end
v=x0;
sN=step;
用Gauss-Seidel迭代法求解上題的線性方程組,取 。
輸入:
A=[4 3 0;3 3 -1;0 -1 4];
b=[24;30;-24];
x0=[0;0;0];
[v,sN,vChain]=gaussSeidel(A,b,x0,0.00001,11)
輸出:
v =
0.6169
11.1962
-4.2056
sN =
11
vChain =
6.0000 10.0000 -6.0000
-1.5000 2.0000 -3.5000
4.5000 10.3333 -5.5000
-1.7500 3.6667 -3.4167
3.2500 10.6111 -5.0833
-1.9583 5.0556 -3.3472
2.2083 10.8426 -4.7361
-2.1319 6.2130 -3.2894
1.3403 11.0355 -4.4468
-2.2766 7.1775 -3.2411
0.6169 11.1962 -4.2056