Escrever em Scilab uma função que resolve uma equação f(x)=0 pelo método de Newton, conforme visto em sala. Escolha duas funções f1 e f2 e reparta seu algoritmo em dois casos, de modo similar ao feito no exercício 1.

Passo 1

Beleza, o enunciado pediu pra gente escrever em Scilab uma função que ache raiz de pelo método de Newton. A matéria aqui é “Método de Newton para soluções de equações não-lineares” e o que vamos precisar é:
  • Entender a fórmula iterativa do Newton
  • Saber programar uma função em Scilab
  • Escolher duas funções e com suas derivadas
  • Fazer o “split” em dois casos (um pra cada função)

Passo 2

Antes de codar, revisa a teoria:
O Método de Newton gera uma sequência
xk+1 ;=; xk ;-;f(xk)f'(xk)
A cada passo você avalia e no chute atual , faz essa conta e obtém um novo chute . Para parar, normalmente a gente verifica se ficou menor que uma tolerância ou se passou de um número máximo de iterações .

Passo 3

Agora vamos montar a função em Scilab. A assinatura vai ser algo como
function [raiz, iter] = newtonMetodo(caso, x0, tol, maxIt)
onde
  • caso indica se usamos ou ,
  • x0 é o chute inicial,
  • tol é a tolerância em ,
  • maxIt é o número máximo de iterações.
Dentro dela, a gente faz um if caso==1 then ... else ... end para definir:
  • Para o caso 1:
    , .
  • Para o caso 2:
    , .
Depois, implementamos o loop do Newton e saímos quando ou iter>maxIt.

Passo 4

Segue o código final em Scilab:
function [raiz, iter] = newtonMetodo(caso, x0, tol, maxIt)
    // Escolhe f e df conforme o caso
    if caso==1 then
        f  = function(x) x^2 - 2;    // f1(x)
        df = function(x) 2*x;        // f1'(x)
    else
        f  = function(x) exp(-x) - x;      // f2(x)
        df = function(x) -exp(-x) - 1;     // f2'(x)
    end

    x = x0;  // chute inicial
    for iter = 1:maxIt
        fx  = f(x);
        dfx = df(x);
        // evita divisão por zero
        if abs(dfx) < %eps then
            error("Derivada muito próxima de zero");
        end
        // passo de Newton
        x = x - fx/dfx;
        // critério de parada
        if abs(fx) < tol then
            break;
        end
    end
    raiz = x;
endfunction

Resposta

A função newtonMetodo acima resolve por Newton para dois casos diferentes, gerando a raiz aproximada em raiz e o número de iterações em iter.

Exercícios relacionados