function [X] = GaussSeidel(A,B,n,erro)
[nla,nca]=size(A);
[nlb,ncb]=size(B);
norma=100;
teste=0;
soma=0;
soma1=0;
k=1;
j=1;
%testes
if(nla~=nca)
fprintf('Matriz A deve ser nxn');
X=0;
return;
end
if(nla~=nlb)
fprintf('O vetor independente b deve ter dimensão (nx1)');
X=0;
return;
end
if(nla<nlb)
fprintf('Sistema indeterminado');
X=0;
return;
end
%teste de convergência
for i=1:nla
for j=1:nla
if(i~=j)
soma1=soma1+A(i,j);
end
end
if (abs(A(i,i))>soma1)
teste=1;
else
teste=2;
end
soma1=0;
end
if(teste==1)
fprintf('Matriz convergirá');
%k será o numero de iterações
while ((k<n)&&(norma>erro))
if(k==1) %se for a primeira iteração, considerar que x0=0;
for i=1:nla
X(i,k)=B(i,k)/A(i,i);
end
end
%para as demais componentes X(i,k) é o vetor X(i) na iteração de número k
for i=1:nla
for j=1:nla
if(i~=j)&&(j<i)
soma=soma+(A(i,j)*X(j,k+1));
end
if(i~=j)&&(j>i)
soma=soma+(A(i,j)*X(j,k));
end
end
X(i,k+1)=(1/A(i,i))*(-soma+B(i,1));
soma=0;
end
%Cálculo da norma
%denominador
maior=abs(X(1,k+1));
for i=1:nla
if(abs(X(i,k+1))>maior)
maior=abs(X(i,k+1));
end
end
%numerador
for i=1:nla
D(i)=X(i,k+1)-X(i,k);
end
maior_D=abs(D(1));
for i=1:nla
if(abs(D(i))>maior_D)
maior_D=abs(D(i));
end
end
norma=maior_D/maior;
k=k+1;
end
X=X(:,k-1);
end
if (teste==2)
fprintf('Método nao converge');
end
end
评论0