Considere o código abaixo:
function x=funcao(A, b, X0, tol, max_iter)
n=size(A,1);
x=zeros(n,1);
x_antigo=x;
for iter=1:max_iter
for i=1:n
sum1= A(i,1:i-1)*x(1:i-1);
sum2= A(i,i+1:n)*x(i+1:n);
x(i)=(b(i)-sum1-sum2)/A(i,i);
end
if norm(x-x_antigo,inf)<tol then
disp(Convergência atingida na iteração +string(iter));
return
end
x_antigo=x;
end
disp(Número máximo de iterações atingido);
endfunction
Reescreva o código com as correções dos erros apresentados no item anterior.

Passo 1

O enunciado pede para reescrever uma função MATLAB/Octave que implementa o método de Gauss–Seidel, corrigindo erros de sintaxe e de lógica.
Conteúdo: métodos iterativos para resolver xi ;=;bi - sumj=1^i-1aij,xj - sumj=i+1^naij,xjaii .
O que precisamos:
  • Inicializar o vetor solução com um chute inicial .
  • Atualizar cada componente por
  • Verificar convergência via norma infinita e exibir mensagens corretamente em MATLAB.

Passo 2

Vamos listar e corrigir os erros:
  1. A gente não usou o chute inicial X0. Precisamos começar com x = X0; e guardar também x_antigo = X0;.
  2. Em MATLAB não existe then no if. Devemos usar apenas if … end.
  3. Para exibir texto concatenado, disp(Convergência ...) está sem aspas e com +. O jeito certo é
    disp(['Convergência atingida na iteração ' num2str(iter)]);
    
  4. A função termina com endfunction (Octave) ou end (MATLAB). Vamos usar end.

Passo 3

Com tudo isso em mente, reescrevemos a função completa, passo a passo:
  1. Cabeçalho e inicialização.
  2. Laço principal de 1 a max_iter.
  3. Laço interno para atualizar usando as somas à esquerda e à direita.
  4. Teste de convergência com norm(...,inf) e mensagem adequada.
  5. Se não convergir, repetir; senão, informar que chegou ao máximo de iterações.

Resposta

function x = funcao(A, b, X0, tol, max_iter)
  % número de equações
  n = size(A,1);
  % inicializa x com o chute inicial
  x = X0;
  x_antigo = X0;

  for iter = 1:max_iter
    % iteração de Gauss–Seidel
    for i = 1:n
      sum1 = A(i,1:i-1) * x(1:i-1);       % soma dos termos já atualizados
      sum2 = A(i,i+1:n) * x(i+1:n);       % soma dos termos ainda antigos
      x(i) = (b(i) - sum1 - sum2) / A(i,i);
    end

    % verifica convergência pela norma infinito
    if norm(x - x_antigo, inf) < tol
      disp(['Convergência atingida na iteração ' num2str(iter)]);
      return
    end

    % atualiza o vetor antigo
    x_antigo = x;
  end

  % se sair do for sem convergir
  disp('Número máximo de iterações atingido');
end

Exercícios relacionados