Escrever em Scilab uma função que resolve uma equação
pelo método de Newton, conforme visto em sala. Escolha duas funções
e
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
O Método de Newton gera uma sequência
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 usamosou , 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 por Newton para dois casos diferentes, gerando a raiz aproximada em
newtonMetodo
acima resolve
raiz
e o número de iterações em iter
.