2.2.1 Punto fijo – Ejemplo01

Ejemplo 1:

f(x):e^{-x} - x = 0

Desarrollo: Al igual que los métodos anteriores, es conveniente determinar el rango donde la función es válida [a,b], revisar si hay cambio de signo para buscar una raiz. Para el ejemplo, el rango de estudio será [0,1], pues f(0)=1 es positivo y f(1)=-0.63 es negativo.

Para el punto fijo, se reordena la ecuación para para tener una ecuación con la variable independiente separada. Se obtiene por un lado la recta identidad y=x, por otro se tiene la función g(x) y se buscará la intersección entre las dos .

x = e^{-x} g(x) = e^{-x}

Se puede iniciar la búsqueda por uno de los extremos del rango [a,b]. Por ejemplo:

  • iniciando desde el extremo izquierdo a,
  • se determina el valor de b = g(a) ,
  • se determina la diferencia de aproximaciones como
    el error = |b-a|
  • se proyecta en la recta identidad, que sirve como el nuevo punto de evaluación
    a=b.
  • se repite el proceso para el nuevo valor de b, hasta que el error sea menor al tolerado.
  • En caso que el proceso no converge, se utiliza un contador de iteraciones máximo, para evitar tener un lazo infinito.

El proceso se resume en la gráfica, para una función g(x) que converge.


El algoritmo en python se presenta como una función para usarla fácilmente como un bloque en otros ejercicios. Se requiere la función gx, el punto inicial y la tolerancia, la variable de número de iteraciones máxima n es opcional.

# Algoritmo de punto fijo
# [a,b] son seleccionados desde
# la gráfica de la función
# error = tolera

import numpy as np
def puntofijo(gx,a,tolera, n = 15):
    """
    g(x) se obtiene al despejar una x de f(x)
    máximo de iteraciones predeterminado: n
    si no converge hasta n iteraciones
    la respuesta es NaN (Not a Number)
    """
    i = 1
    b = gx(a)
    tramo = abs(b-a)
    while(tramo>=tolera and i<=n):
        a = b
        b = gx(a)
        tramo = abs(b-a)
        i = i+1
    respuesta = b
    # Valida respuesta
    if (i>=n):
        respuesta = np.nan
    return(respuesta)


# PROGRAMA #######################
# INGRESO
fx = lambda x: np.exp(-x) - x
gx = lambda x: np.exp(-x)

a = 0 ; b = 1
tolera = 0.001
tramos = 101

# PROCEDIMIENTO
respuesta = puntofijo(gx,a,tolera)

# SALIDA
print(respuesta)

la respuesta obtenida del problema es

0.566908911921

Para obtener la gráfica básica se determinan los puntos para cada función fx y gx. Se añaden las siguiente instrucciones al algoritmo anterior:

# GRAFICA
# calcula los puntos para fx y gx
xi = np.linspace(a,b,tramos)
fi = fx(xi)
gi = gx(xi)
yi = xi

import matplotlib.pyplot as plt
plt.plot(xi,fi, label='f(x)')
plt.plot(xi,gi, label='g(x)')
plt.plot(xi,yi, label='y=x')

plt.axvline(respuesta)
plt.axhline(0, color='k')
plt.title('Punto Fijo')
plt.legend()
plt.show()

Scipy.optimize.fixed_point

El método del punto fijo se encuentra implementado en Scipy, que también puede ser usado de la forma:

>>> import scipy.optimize as opt
>>> opt.fixed_point(gx,a,xtol=0.001,maxiter=15)
array(0.5671432948307147)

el valor predeterminado de iteraciones si no se escribe es 500 y la tolerancia predeterminada es xtol=1e-08
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fixed_point.html


Tarea

  • Revisar lo que sucede cuando el valor inicial a esta a la derecha de la raiz.
  • Validar que la función converge, revisando que |g'(x)|<1, o que la función g(x) tenga pendiente menor a pendiente de la recta identidad.
  • Realizar el mismo ejercicio para
f(x) = x^{2}-x-2 = 0

en el rango [-1,2]
Realice sus observaciones y recomendaciones.