El método del punto fijo consiste en transformar una función $f(x) = 0$ en $x = g(x)$ y obtener la raíz en forma iterativa
\begin{equation} x_{i+1} = g(x_{i}) \end{equation}Algoritmo
x_0 es la raiz aproximada
x_1 = f(x_0)
x_2 = f(x_1)
x_3 = f(x_2)
...
Encontrar la raiz de
\begin{equation*} y = e^{-x} - x \end{equation*}Reemplazamos $y = 0$
\begin{equation*} 0 = e^{-x} - x \end{equation*}Despejando $x$
\begin{equation*} x = e^{-x} \end{equation*}Transformando en una función iterativa
\begin{equation*} x_{i+1} = e^{-x_{i}} \end{equation*}Raíz aproximada
\begin{equation*} x_{0} = 0 \end{equation*}Error relativo
\begin{equation*} e_{r} = ? \end{equation*}Raíz aproximada
\begin{equation*} x_{1} = e^{-0} = 1 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{1 - 0}{1}\bigg| \times 100\% = 100\% \end{equation*}Raíz aproximada
\begin{equation*} x_{2} = e^{-1} = 0.367879 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{0.367879 - 1}{0.367879}\bigg| \times 100\% = 171.83\% \end{equation*}Raíz aproximada
\begin{equation*} x_{3} = e^{-0.367879} = 0.692201 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{0.692201 - 0.367879}{0.692201}\bigg| \times 100\% = 46.85\% \end{equation*}Seudocódigo
function punto_fijo(f(x), x_0)
x_actual = x_0
error_permitido = 0.000001
while(True)
x_anterior = x_actual
x_actual = 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 punto_fijo(f(x), x_0)
x_actual = x_0
for 1 to maxima_iteracion do
x_anterior = x_actual
x_actual = f(x_anterior)
end for
mostrar x_actual
end function
In [1]:
from math import exp
def f(x):
# f(x) = exp(-x) - x
y = exp(-x)
return y
def punto_fijo(f, 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 = f(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]:
punto_fijo(f, 0)
Encontrar la raiz de
\begin{equation*} y = x^{2} - 5 x + 3 \end{equation*}Reemplazamos $y = 0$
\begin{equation*} 0 = x^{2} - 5 x + 3 \end{equation*}Despejando $x$
\begin{equation*} x = -\frac{3}{x - 5} \end{equation*}Transformando en una función iterativa
\begin{equation*} x_{i+1} = -\frac{3}{x_{i} - 5} \end{equation*}Raíz aproximada
\begin{equation*} x_{0} = 1.85 \end{equation*}Error relativo
\begin{equation*} e_{r} = ? \end{equation*}Raíz aproximada
\begin{equation*} x_{1} = -\frac{3}{1.85 - 5} = 0.952381 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{0.952381 - 1.85}{0.952381}\bigg| \times 100\% = 94.25\% \end{equation*}Raíz aproximada
\begin{equation*} x_{2} = -\frac{3}{0.952381 - 5} = 0.741176 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{0.741176 - 0.952381}{0.741176}\bigg| \times 100\% = 28.50\% \end{equation*}Raíz aproximada
\begin{equation*} x_{3} = -\frac{3}{0.741176 - 5} = 0.704420 \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{0.704420 - 0.741176}{0.704420}\bigg| \times 100\% = 5.22\% \end{equation*}
In [3]:
def g(x):
# f(x) = x**2 - 5*x + 3
y = -3 / (x - 5)
return y
In [4]:
punto_fijo(g, 1.85)