Considere o código abaixo:
function , tol, max_iter)
;
;
x_antigo=x;
for iter=1:max_iter
for :n
sum1= ;
sum2= ;
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

Beleza, o enunciado pede pra reescrever a função MATLAB (que implementa o método iterativo de Gauss–Seidel ou Jacobi) corrigindo os erros vistos antes. O assunto é “programação em MATLAB”: assinatura de função, inicialização de variáveis, loops for, teste de convergência com norma-∞ e comando disp. A gente vai precisar:
  • Declarar direito a função e usar o chute inicial X0.
  • Inicializar x_old (antes estava sem inicialização).
  • Ajustar o disp pra concatenar texto com num2str.
  • Fechar todos os end direitinho.

Passo 2

Erros principais que tínhamos:
  1. A assinatura tinha X0 mas não usava;
  2. x_antigo = x; vinha antes de x existir;
  3. Usavam string(iter) em vez de num2str(iter) e concatenação de string do MATLAB;
  4. Faltava fechar a função com endfunction ou end;
  5. Teste de convergência não explicava que era norma-∞, mas isso a gente mantém.

Passo 3

Vamos corrigir cada ponto:
  • Receber x0 e usar como chute inicial em x e x_old.
  • Dentro do loop, calcular as somas sum1 e sum2 sempre usando o valor antigo de x (método de Jacobi puro) ou parcial (Gauss–Seidel), mas aqui vamos manter a versão Jacobi tradicional, usando x_old.
  • Testar if norm(x - x_old, inf) < tol onde .
  • Para avisar convergência:
    disp(['Convergência atingida na iteração ' num2str(iter)])
  • No fim, avisar "Número máximo de iterações atingido" se não convergir.

Resposta

function x = funcao(A, b, x0, tol, max_iter)
% número de equações
n = size(A,1);
% chute inicial
x = x0;
x_old = x0;
for iter = 1:max_iter  
    % atualização Jacobi: cada x(i) usa x_old  
    for i = 1:n  
        sum1 = A(i,1:i-1)*x_old(1:i-1);  
        sum2 = A(i,i+1:n)*x_old(i+1:n);  
        x(i) = (b(i) - sum1 - sum2)/A(i,i);  
    end  

    % critério de convergência: norma-infinito  
    if norm(x - x_old, inf) < tol  
        disp(['Convergência atingida na iteração ' num2str(iter)])  
        return  
    end  

    % prepara próxima iteração  
    x_old = x;  
end  

% se chegar aqui, não convergiu em max_iter  
disp('Número máximo de iterações atingido')  
end

Exercícios relacionados