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
A x = b
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
xi^(k+1) = 1aiil(bi - sumj=1^i-1 aij,xj^(k+1) - sumj=i+1^n aij,xj^(k)r),
para i=1,2,dots,n. O método converge com garantia prática quando A for estritamente diagonal dominante ou simétrica definida positiva.

Passo 3

Vamos construir uma interface em que o usuário informe:
1. A matriz A e o vetor b.
2. O chute inicial x^(0) (ou usar zeros).
3. A tolerância varepsilon para o critério |x^(k+1)-x^(k)|infty < varepsilon.
4. O número máximo de iterações Nmax.
Também verificamos se A é diagonal dominante e avisamos se não for.

Passo 4

Implementamos o loop de iteração:
1. Para cada iteração k=0,1,2,dots:
a. Atualizamos cada componente xi pela fórmula de Gauss–Seidel.
b. Calculamos o erro maxi |xi^(k+1)-xi^(k)|.
c. Se o erro for menor que varepsilon, interrompemos e exibimos convergência.
2. Se atingir Nmax sem convergir, avisamos que não convergiu no limite de iterações.

Passo 5

Vamos testar o programa com um exemplo simples:
A = 4 & 1 & 2 3 & 5 & 1 1 & 1 & 3, b = 473,
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);

if size(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: ');
if isempty(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--Seidel
    for i = 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;
    end
end

if err >= tol
    fprintf('\nNão convergiu em %d iterações. Último erro: %e\n', maxIter, err);
end

disp('Solução aproximada x:');
disp(x);

Exercícios relacionados