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.
  1. function newton(func, )
  2. function
  3. evstr(func)
  4. endfunction
  5. err=e
  6. while (err>e) & (iter nmax
  7. x_antigo=x;
  8. antigo- /numderivative( ;
  9. iter=iter +1 ;
  10. err=abs(x-x_antigo)

  11. 12.end
    13.if then
  12. printf(13. printf(16.else

17. printf(

18.end

19.endfunction

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.
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.
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 :