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.
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 .
O que precisamos:
Conteúdo: métodos iterativos para resolver
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:
- A gente não usou o chute inicial
X0
. Precisamos começar comx = X0;
e guardar tambémx_antigo = X0;
. - Em MATLAB não existe
then
noif
. Devemos usar apenasif … end
. - Para exibir texto concatenado,
disp(Convergência ...)
está sem aspas e com+
. O jeito certo édisp(['Convergência atingida na iteração ' num2str(iter)]);
- A função termina com
endfunction
(Octave) ouend
(MATLAB). Vamos usarend
.
Passo 3
Com tudo isso em mente, reescrevemos a função completa, passo a passo:
- Cabeçalho e inicialização.
- Laço principal de 1 a
max_iter
. - Laço interno para atualizar
usando as somas à esquerda e à direita. - Teste de convergência com
norm(...,inf)
e mensagem adequada. - 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