1)方程组Ax=b
用简单迭代法(Jacobi迭代法)和G-S迭代法分别解方程组。精确到小数点后5位,最大迭代次数N=100,说明是否收敛
Jacobi迭代代码如下
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
G_S迭代代码如下
G_S.m
function [v,sN,vChain]=G_S(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;
主函数
clc,clear
A = [1 2 -2
1 1 1
2 2 1];
b = [1
3
5];
[x k index] = Jacobi(A,b)
x0 = [0
0
0];
errorBound = 1e-5;
maxSp = 100;
[aa bb cc] = G_S(A,b,x0,errorBound,maxSp)
(2)方程组Ax=b
这只不过就是把上个问题中的主函数里面的矩阵和向量换成本题向量罢了