Método del punto fijo

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)
...

Ejemplo 1

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*}

Iteración 0

Raíz aproximada

\begin{equation*} x_{0} = 0 \end{equation*}

Error relativo

\begin{equation*} e_{r} = ? \end{equation*}

Iteración 1

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*}

Iteración 2

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*}

Iteración 3

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*}

Implementación no vectorizada

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)


i 	 x anterior      	 x actual        	 error relativo %
0 	 ??????????????? 	 0.000000000000000 	 ???????????????
1 	 0.000000000000000 	 1.000000000000000 	 100.00000000000
2 	 1.000000000000000 	 0.367879441171442 	 171.82818284590
3 	 0.367879441171442 	 0.692200627555346 	  46.85363946134
4 	 0.692200627555346 	 0.500473500563637 	  38.30914659333
5 	 0.500473500563637 	 0.606243535085597 	  17.44678968115
6 	 0.606243535085597 	 0.545395785975027 	  11.15662252538
7 	 0.545395785975027 	 0.579612335503379 	   5.90335081441
8 	 0.579612335503379 	 0.560115461361089 	   3.48086697962
9 	 0.560115461361089 	 0.571143115080177 	   1.93080393126
10 	 0.571143115080177 	 0.564879347391050 	   1.10886824205
11 	 0.564879347391050 	 0.568428725029061 	   0.62441911918
12 	 0.568428725029061 	 0.566414733146883 	   0.35556841380
13 	 0.566414733146883 	 0.567556637328283 	   0.20119651614
14 	 0.567556637328283 	 0.566908911921495 	   0.11425564022
15 	 0.566908911921495 	 0.567276232175570 	   0.06475156780
16 	 0.567276232175570 	 0.567067898390788 	   0.03673877244
17 	 0.567067898390788 	 0.567186050099357 	   0.02083120848
18 	 0.567186050099357 	 0.567119040057215 	   0.01181586888
19 	 0.567119040057215 	 0.567157044001298 	   0.00670077970
20 	 0.567157044001298 	 0.567135490206278 	   0.00380046662

x = 0.5671354902062784

Ejemplo 2

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*}

Iteración 0

Raíz aproximada

\begin{equation*} x_{0} = 1.85 \end{equation*}

Error relativo

\begin{equation*} e_{r} = ? \end{equation*}

Iteración 1

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*}

Iteración 2

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*}

Iteración 3

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)


i 	 x anterior      	 x actual        	 error relativo %
0 	 ??????????????? 	 1.850000000000000 	 ???????????????
1 	 1.850000000000000 	 0.952380952380952 	  94.25000000000
2 	 0.952380952380952 	 0.741176470588235 	  28.49584278156
3 	 0.741176470588235 	 0.704419889502762 	   5.21799307958
4 	 0.704419889502762 	 0.698392282958199 	   0.86306889289
5 	 0.698392282958199 	 0.697413664224847 	   0.14032112985
6 	 0.697413664224847 	 0.697255038220987 	   0.02275006922
7 	 0.697255038220987 	 0.697229333053386 	   0.00368675935
8 	 0.697229333053386 	 0.697225167738000 	   0.00059741323
9 	 0.697225167738000 	 0.697224492786874 	   0.00009680542
10 	 0.697224492786874 	 0.697224383417362 	   0.00001568642
11 	 0.697224383417362 	 0.697224365695060 	   0.00000254184
12 	 0.697224365695060 	 0.697224362823327 	   0.00000041188

x = 0.6972243628233274