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:
A assinatura tinha X0 mas não usava;
x_antigo = x; vinha antes de x existir;
Usavam string(iter) em vez de num2str(iter) e concatenação de string do MATLAB;
Faltava fechar a função com endfunction ou end;
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')