El método de Newton-Raphson o método de la tangente usa la derivada de la función
\begin{equation} x_{i+1} = x_{i} - \frac{1}{f'(x_{i})} f(x_{i}) \end{equation}Algoritmo
x_0 es la raiz aproximada
x_1 = x_0 - f(x_0)/f'(x_0)
x_2 = x_1 - f(x_1)/f'(x_1)
x_3 = x_2 - f(x_2)/f'(x_2)
...
Encontrar la raiz de
\begin{equation*} y = x^{3} - 2 x^{2} + x - 3 \end{equation*}su derivada es
\begin{equation*} y' = 3 x^{2} - 4 x + 1 \end{equation*}usar $x = 0$ como valor inicial
Raíz aproximada
\begin{equation*} x_{0} = 0 \end{equation*}Error relativo
\begin{equation*} e_{r} = ? \end{equation*}Calculando la ordenada y derivada del punto anterior
\begin{align*} f(x_{0}) &= f(0) = -3 \\ f'(x_{0}) &= f'(0) = 1 \end{align*}Raíz aproximada
\begin{equation*} x_{1} = x_{0} - \frac{f(x_{0})}{f'(x_{0})} = 0 - \frac{-3}{1} = 3 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{x_{1} - x_{0}}{x_{1}}\bigg| \times 100\% = \bigg|\frac{3 - 0}{3}\bigg| \times 100\% = 100\% \end{equation*}Calculando la ordenada y derivada del punto anterior
\begin{align*} f(x_{1}) &= f(3) = 9 \\ f'(x_{1}) &= f'(3) = 16 \end{align*}Raíz aproximada
\begin{equation*} x_{2} = x_{1} - \frac{f(x_{1})}{f'(x_{1})} = 3 - \frac{9}{16} = 2.4375 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{x_{2} - x_{1}}{x_{2}}\bigg| \times 100\% = \bigg|\frac{2.4375 - 3}{2.4375}\bigg| \times 100\% = 23.08\% \end{equation*}Calculando la ordenada y derivada del punto anterior
\begin{align*} f(x_{2}) &= f(2.4375) = 2.036865 \\ f'(x_{2}) &= f'(2.4375) = 9.074219 \end{align*}Raíz aproximada
\begin{equation*} x_{3} = x_{2} - \frac{f(x_{2})}{f'(x_{2})} = 2.4375 - \frac{2.036865}{9.074219} = 2.213033 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{x_{3} - x_{2}}{x_{3}}\bigg| \times 100\% = \bigg|\frac{2.213033 - 2.4375}{2.213033}\bigg| \times 100\% = 10.14\% \end{equation*}Seudocódigo
function newton_rahpson(f(x), f'(x), x_0)
x_actual = x_0
error_permitido = 0.000001
while(True)
x_anterior = x_actual
x_actual = x_anterior - f(x_anterior)/f'(x_anterior)
if x_raiz_actual != 0
error_relativo = abs((x_raiz_actual - x_raiz_anterior)/x_raiz_actual)*100
end if
if error_relativo < error_permitido
exit
end if
end while
mostrar x_actual
end function
o también
function newton_rahpson(f(x), f'(x), x_0)
x_actual = x_0
for 1 to maxima_iteracion do
x_anterior = x_actual
x_actual = x_anterior - f(x_anterior)/f'(x_anterior)
end for
mostrar x_actual
end function
In [1]:
def newton_rahpson(f, fx, x_0):
print("{0:s} \t {1:15s} \t {2:15s} \t {3:15s}".format('i', 'x anterior', 'x actual', 'error relativo %'))
x_actual = x_0
i = 0
print("{0:d} \t {1:15s} \t {2:.15f} \t {3:15s}".format(i, '???????????????', x_actual, '???????????????'))
error_permitido = 0.000001
while True:
x_anterior = x_actual
x_actual = x_anterior - f(x_anterior)/fx(x_anterior)
if x_actual != 0:
error_relativo = abs((x_actual - x_anterior)/x_actual)*100
i = i + 1
print("{0:d} \t {1:.15f} \t {2:.15f} \t {3:15.11f}".format(i, x_anterior, x_actual, error_relativo))
if (error_relativo < error_permitido) or (i>=20):
break
print('\nx =', x_actual)
In [2]:
def f(x):
# f(x) = x^3 - 2x^2 + x - 3
y = x**3 - 2*x**2 + x - 3
return y
def fx(x):
# f'(x) = 3x^2 - 4x + 1
y = 3*x**2 - 4*x + 1
return y
In [3]:
newton_rahpson(f, fx, 0)