Desenvolva um programa amigável ao usuário em MATLAB para solução de sistemas algébricos lineares que utilizem Método de Gauss-Seidel.
Passo 1
O enunciado pede um programa em MATLAB, com interface amigável, que resolva sistemas lineares
pelo método iterativo de Gauss–Seidel. O conteúdo é Métodos Iterativos para Álgebra Linear e vamos precisar da fórmula de iteração de Gauss–Seidel e de critérios de convergência (tolerância e número máximo de iterações).
Passo 2
A base teórica é a iteração de Gauss–Seidel, dada por
para . O método converge com garantia prática quando for estritamente diagonal dominante ou simétrica definida positiva.
Passo 3
Vamos construir uma interface em que o usuário informe: . A matriz e o vetor . . O chute inicial (ou usar zeros). . A tolerância para o critério . . O número máximo de iterações .
Também verificamos se é diagonal dominante e avisamos se não for.
Passo 4
Implementamos o loop de iteração: . Para cada iteração :
a. Atualizamos cada componente pela fórmula de Gauss–Seidel.
b. Calculamos o erro .
c. Se o erro for menor que , interrompemos e exibimos convergência. . Se atingir sem convergir, avisamos que não convergiu no limite de iterações.
Passo 5
Vamos testar o programa com um exemplo simples:
chute inicial x^(0) = (0,0,0)^T, varepsilon=10^-6, Nmax=100. Deve convergir para a solução aproximada x approx (0,1,0)^T.
Resposta
% GaussSeidelUser.m% Programa amigável em MATLAB para resolver \(A \cdot x = b\) pelo método de Gauss--Seidel
clc; clear;
disp('\(====\) MÉTODO DE GAUSS--SEIDEL \(====\)');
A = input('Informe a matriz A (nxn): ');
b = input('Informe o vetor b (n\times 1): ');
n = size(A,1);
ifsize(A,2) ~= n || length(b) ~= n
error('Dimensões de A e b não compatíveis.');
end% Verificação de dominância diagonal
diagDom = all(2*abs(diag(A)) >= sum(abs(A),2));
if ~diagDom
warning('A não é estritamente diagonal dominante. Convergência não garantida.');
end% Chute inicial
x = input('Chute inicial \(x_0\) (n\times 1). Pressione Enter para zeros: ');
ifisempty(x)
x = zeros(n,1);
elif length(x) ~= n
error('Chute inicial com dimensão incorreta.');
end
tol = input('Tolerância (ex.: \(1e-6\)): ');
maxIter = input('Número máximo de iterações: ');
fprintf('\nIteração\tErro aproximado\n');
for k = 1:maxIter
x_old = x;
% Atualização Gauss--Seidelfori = 1:n
soma1 = A(i,1:i-1)*x(1:i-1);
soma2 = A(i,i+1:n)*x_old(i+1:n);
x(i) = (b(i) - soma1 - soma2)/A(i,i);
end
err = norm(x - x_old, Inf);
fprintf('%4d\t\t%e\n', k, err);
if err < tol
fprintf('\nConvergiu em %d iterações com erro %e.\n', k, err);
break;
endendif err >= tol
fprintf('\nNão convergiu em %d iterações. Último erro: %e\n', maxIter, err);
enddisp('Solução aproximada x:');
disp(x);