O código abaixo implementa o método de Newton, no formato de função. Porém existem alguns erros no programa. Descreva quais são esses erros e o que deve ser feito para saná-los.
- function newton(func,
)
- function
-
evstr(func)
- endfunction
- err=e
- while (err>e) & (iter
nmax
- x_antigo=x;
-
antigo-
/numderivative(
;
- iter=iter +1 ;
- err=abs(x-x_antigo)
-
12.end
13.if
then
- printf(13. printf(16.else
17. printf(
18.end
19.endfunction
12.end
13.if
Passo 1
Vamos dar uma olhada no que o exercício está pedindo. Temos um código que implementa o método de Newton para encontrar raízes de uma função. Porém, esse código contém alguns erros que precisamos identificar e corrigir. Para resolver isso, vamos precisar entender os conceitos básicos do método de Newton, como inicializar variáveis corretamente, usar a sintaxe adequada na linguagem de programação utilizada e garantir que todas as funções estejam chamadas corretamente.
Passo 2
Primeiro, vamos analisar a declaração da função:
function newton(func, $\mathbf{x0}, \mathbf{e}, \mathrm{nmax}$ )
Erro 1: As variáveis estão misturando notações em LaTeX com a sintaxe da linguagem. Em linguagens como MATLAB, não usamos símbolos de LaTeX para variáveis.
Correção: Remover os símbolos de formatação LaTeX e garantir que os nomes das variáveis estejam corretos. Por exemplo:
function newton(func, x0, e, nmax)
Passo 3
Dentro da função, temos a definição de outra função:
function y = f(x)
y = evstr(func)
endfunction
Erro 2: A função
evstr
não existe. Provavelmente, a intenção era usar eval
, que avalia uma string como uma expressão MATLAB.Correção: Substituir
evstr
por eval
:function y = f(x)
y = eval(func);
end
Além disso, é importante garantir que
func
seja uma string que represente a função matemática a ser avaliada, como 'x^2 - 2'
.Passo 4
Na linha 5, temos:
err = e
Erro 3: Inicializar o erro
err
diretamente com o valor da tolerância e
pode fazer com que o loop while
nunca execute, já que err
inicialmente não é maior que e
.Correção: Inicializar
err
com um valor maior que e
, por exemplo, err = inf
(infinito):err = inf;
Passo 5
Na linha 6, o loop
while
está assim:while (err > e) & (iter < nmax)
Erro 4: O operador lógico correto para “E” em MATLAB é
&&
, que é para operações de curto-circuito, ou &
para operação elemento a elemento. Além disso, a variável iter
não foi inicializada antes do loop.Correção: Inicializar
iter
antes do loop e usar &&
:iter = 0;
while (err > e) && (iter < nmax)
Passo 6
Dentro do loop, temos:
x_antigo = x;
x = x_antigo - f(x_antigo)/numderivative(f, x_antigo);
iter = iter +1;
err = abs(x - x_antigo)
disp(x)
Erro 5: A variável
x
não foi inicializada antes de ser usada. Além disso, a função numderivative
está escrita incorretamente.Correção: Inicializar
x
com x0
antes do loop e corrigir o nome da função para numerical_derivative
ou conforme a função correta disponível. Supondo que haja uma função chamada numderivative
, mas é melhor utilizar uma função padrão ou definir a derivada.Exemplo de inicialização:
x = x0;
E corrigir a chamada da derivada:
x = x_antigo - f(x_antigo)/numderivative(f, x_antigo);
Certifique-se de que a função
numderivative
está definida corretamente ou utilize uma abordagem para calcular a derivada numericamente, por exemplo:h = 1e-5;
df = (f(x_antigo + h) - f(x_antigo)) / h;
x = x_antigo - f(x_antigo)/df;
Passo 7
Após o loop, temos uma estrutura
if-else
com vários erros de sintaxe:if (err <= e) then
printf(13. printf(16.else
printf(
end
endfunction
Erro 6: A sintaxe está incorreta. Em MATLAB, não usamos
then
e printf
é pouco comum, preferindo disp
ou fprintf
. Além disso, os números como printf(13
não fazem sentido.Correção: Reescrever a estrutura condicional corretamente. Por exemplo:
if (err <= e)
fprintf('A solução convergiu para x = %.5f após %d iterações.\n', x, iter);
else
fprintf('O método não convergiu após %d iterações.\n', iter);
end
Resposta
Após identificar e corrigir os erros no código, a versão corrigida da função
newton
ficaria assim:function newton(func, x0, e, nmax)
% Define a função anônima a partir da string
f = @(x) eval(func);
% Inicializa as variáveis
x = x0;
err = inf;
iter = 0;
% Loop do método de Newton
while (err > e) && (iter < nmax)
x_antigo = x;
% Calcula a derivada numericamente
h = 1e-5;
df = (f(x_antigo + h) - f(x_antigo)) / h;
% Atualiza o valor de x
x = x_antigo - f(x_antigo)/df;
% Incrementa o contador de iterações
iter = iter + 1;
% Calcula o erro
err = abs(x - x_antigo);
% Exibe o valor atual de x
disp(x);
end
% Verifica se convergiu ou não
if (err <= e)
fprintf('A solução convergiu para x = %.5f após %d iterações.\n', x, iter);
else
fprintf('O método não convergiu após %d iterações.\n', iter);
end
end
Agora, o código está devidamente corrigido e funcional, implementando corretamente o método de Newton para encontrar raízes de uma função.
Exercícios relacionados
Mostre que a equação
é equivalente às seguintes equações:
Destas, considere as seguintes iterações do método do ponto fixo:
a)
b)
Use o método do ponto fixo, para verificar se cada um dos processos iterativos acima converge ou não, construindo uma tabela de valores de e verificando se o critério de parada
é atingido.
a)
b)
Use o método do ponto fixo, para verificar se cada um dos processos iterativos acima converge ou não, construindo uma tabela de valores de
Teste o programa acima para a função
, definida por
e exprima suas conclusões com base nos resultados encontrados.
a) Descreva como podemos usar o método de Newton, para criar um esquema computacional para o cálculo do inverso de um número
com base em operações apenas de multiplicação e soma/subtração.
b) Escolha um valor irracional para e use o esquema anterior para o cálculo aproximado de
com 5 casas decimais de precisão.
b) Escolha um valor irracional para
A seguinte tabela relaciona calor específico da água e temperatura:
temp.
|
calor específico |
---|---|
20 | 0.99907 |
25 | 0.99852 |
30 | 0.99826 |
35 | 0.99818 |
40 | 0.99828 |
45 | 0.99849 |
50 | 0.99878 |
Resolver os itens abaixo usando interpolação com polinômio de grau 2 :