Métodos Matemáticos
Método de Newton Raphson
O método de Newton Raphson é amplamente utilizado na Engenharia para busca de raízes
de funções porque:
✓ É de fácil implementação;
✓ Tem convergência quadrática (mais rápido).
O método se baseia na aproximação da raiz pela reta tangente à curva:
O Ponto 𝑥0 é o ponto inicial. Normalmente esse ponto é fornecido no enunciado. Caso
não seja, é aconselhado a plotar o gráfico da função para ter uma noção de onde se
encontra a raiz para, então, poder estimar um ponto inicial. O método cria uma sucessão
de pontos (𝑥0 , 𝑥1 , 𝑥2 , ⋯ , 𝑥𝑛 ) com o objetivo de se aproximar da raiz desejada (𝑥𝑛 ≅ 𝑐).
Para o ponto 𝑥0 do gráfico a equação da reta tangente é dada por:
𝑓(𝑥) = 𝑓(𝑥0 ) + 𝑓 ′ (𝑥0 )(𝑥 − 𝑥0 )
Note que a reta tangente de 𝑥0 intercepta o eixo 𝑥 em 𝑥1 , ou seja, se quisermos calcular
o valor de 𝑥1 , basta substituir 𝑥 por 𝑥1 na equação:
𝑓(𝑥1 ) = 𝑓(𝑥0 ) + 𝑓 ′ (𝑥0 )(𝑥1 − 𝑥0 )
De forma análoga, a reta tangente de 𝑥1 intercepta o eixo 𝑥 em 𝑥2 , de forma que:
𝑓(𝑥2 ) = 𝑓(𝑥1 ) + 𝑓 ′ (𝑥1 )(𝑥2 − 𝑥1 )
De um modo geral, para encontrar 𝑓(𝑥𝑛+1 ), precisamos da reta de 𝑥𝑛 :
𝑓(𝑥𝑛+1 ) = 𝑓(𝑥𝑛 ) + 𝑓 ′ (𝑥𝑛 )(𝑥𝑛+1 − 𝑥𝑛 )
Se 𝑥𝑛+1 é a raiz procurada, então 𝑓(𝑥𝑛+1 ) = 0. Substituindo na equação da reta tangente
de 𝑥𝑛 , encontramos uma relação de recorrência entre 𝑥𝑛+1 e 𝑥𝑛 :
𝑓(𝑥𝑛+1 ) = 0 = 𝑓(𝑥𝑛 ) + 𝑓 ′ (𝑥𝑛 )(𝑥𝑛+1 − 𝑥𝑛 )
Isolando 𝑥𝑛+1:
𝑓(𝑥𝑛 )
𝑥𝑛+1 = 𝑥𝑛 −
𝑓 ′ (𝑥𝑛 )
Note que o método apresenta uma desvantagem caso 𝑓 ′ (𝑥𝑛 ) = 0 (divisão por zero). Uma
outra desvantagem do método será apresentada mais adiante.
Um exemplo simples é o caso de uma função polinomial.
Exemplo: Calcule a raiz de 𝑓(𝑥) = 𝑥 2 − 3𝑥 + 2 com 𝑥0 = 0,7 e critério de parada
|𝑓(𝑥)| < 0,01. Utilize 4 casas decimais.
𝑓 ′ (𝑥) = 2𝑥 − 3
𝑥0 = 0,7; 𝑓(0,7) = 0,39
𝑓(𝑥0 ) 𝑓(0,7) 0,39
𝑥1 = 𝑥0 − ′
= 0,7 − ′ = 0,7 − = 0,9438
𝑓 (𝑥0 ) 𝑓 (0,7) −1,6
Verificando se 𝑓(𝑥1 ) satisfaz o critério de parada:
| 𝑓(𝑥1 )| = |𝑓(0,9438)| = 0,0594 > 0,01 (𝑁Ã𝑂 𝑠𝑎𝑡𝑖𝑠𝑓𝑎𝑧!)
Continuando (2ª iteração):
𝑓(𝑥1 ) 𝑓(0,9438) 0,0594
𝑥2 = 𝑥1 − ′
= 0,9438 − ′ = 0,9438 − = 0,9972
𝑓 (𝑥1 ) 𝑓 (0,9438) −1,1124
Verificando se 𝑓(𝑥2 ) satisfaz o critério de parada:
|𝑓(𝑥2 )| = 0,0028 < 0,01 (𝑂𝐾!)
Logo, 𝑥 = 0,9972 é a raiz procurada.
Obs. O valor exato da raiz é 𝑥 = 1, porém, o resultado encontrado depende do critério de
parada. Para obter uma raiz mais acurada podemos diminuir a tolerância do critério de
parada (10−3 , 10−4 , 𝑒𝑡𝑐. ).
Vamos agora, resolver pelo Matlab:
f =@(t) t.^2 - 3*t + 2;
df =@(t) 2*t - 3;
x = 0.7;
tol = 10^-2;
for i=1:20
x = x - f(x)/df(x);
if abs(f(x)) < tol
fprintf('Número de iterações: %d\n',i)
fprintf('Raiz: %f',x)
break
end
end
Devemos ter cuidado com a escolha do
ponto inicial. Vamos ver o gráfico dessa
função:
Note que as duas raízes são bem
definidas: 𝑟1 = 1 e 𝑟2 = 2. Suponha que
o ponto inicial escolhido seja 𝑥0 = 1,5.
Este ponto não vai gerar resultado
porque a inclinação da reta tangente é
zero (verifique essa informação
substituindo o ponto inicial por 1.5).
Exercício: Use o método de Newton-Raphson para calcular a raiz da função 𝑓(𝑥) =
sin(cos(√3𝑥)), tomando 𝑥0 = 0.7 e |𝑓(𝑥)| < 0.001
R: 0,8225
O método de Newton Raphson também pode ser utilizado para encontrar raízes de uma
equação.
Exemplo: Encontrar todas as raízes de:
𝑥 2 = 2𝑥
Precisamos de uma inspeção gráfica para ter uma noção de onde se localizam as raízes.
É importante adotar um domínio amplo o suficiente para visualizar todas as raízes. É
preciso ter cuidado também com as descontinuidades das funções, pois alguns gráficos
podem ficar distorcidos, prejudicando a análise.
A estratégia é transformar a equação em uma função de diferenças entre as funções
𝑓(𝑥) = 𝑥 2 − 2𝑥
f =@(t) t.^2 - 2.^t;
t = linspace(-2,5);
plot(t,f(t))
title('Inspeção gráfica')
grid
Pelo gráfico, verificamos a existência de 3 raízes, concentradas entre -2 e 5.
Note que fazer 𝑓(𝑥) = 0, ou seja, calcular as raízes de 𝑓, é equivalente a encontrar as
raízes da equação 𝑥 2 = 2𝑥 .
Matlab
vec = [-1 2.1 3.8]; % Vetor de pontos iniciais
tol = 10^-6;
cont = 0; % Contador para o vetor de raízes
for j=1:length(vec)
x = vec(j);
for i=1:20
x = x - f(x)/df(x);
if abs(f(x)) < tol
cont = cont + 1;
raizes(cont) = x; % Vetor de raízes
break
end
end
end
raizes
Podemos utilizar um algoritmo alternativo. Para isso, precisamos utilizar as propriedades
de função contínua.
Se uma função é contínua e cruza o eixo 𝑥, então existem duas possibilidades. Ou a função
vem de baixo do eixo e cruza para cima, ou é o contrário.
Qualquer que seja a possibilidade, o
produto das imagens de 𝑎 e 𝑏 deve ser,
obrigatoriamente, negativo:
𝑓(𝑎) ∗ 𝑓(𝑏) < 0
O programa precisa percorrer todo o
domínio que contenha as raízes da
equação.
Como não foi dado o ponto inicial, nem o critério de parada, a qualidade (acurácia) da
resposta vai depender da quantidade de pontos do comando linspace, pois esse vetor
define o domínio de 𝑓. O padrão do linspace são 100 pontos. Devemos notar, também,
que este método não fornece a posição exata da raiz, ou seja, apenas sabemos que ela está
contida no intervalo. Uma estratégia para arbitrar sua posição é tomar a média do
intervalo. Logicamente isso gera um erro, mas esse erro pode ser minimizado com um
aumento da quantidade de pontos do linspace.
Matlab
f = @(t) t.^2 - 2.^t;
t = linspace(-2,5);
cont = 0;
for i=1:length(t) - 1
if f(t(i))*f(t(i + 1)) < 0
cont = cont + 1;
raizes(cont) = (t(i) + t(i + 1))/2;
end
end
raizes
Com o aumento da partição do intervalo melhora a acurácia da solução. O programa é o
mesmo, só altera alinha em destaque:
t = linspace(-2,5,10000); % 10000 pontos