Iteración de punto fijo

El método de iteración de punto fijo requiere el siguiente teorema para garantizar la convergencia a un resultado

Sea $g\in C[a,b]$ tal que $g(x)\in[a,b]$ para todas las $x$ en $[a,b]$. Suponga, además, que existe $g’$ en $(a,b)$ y que existe una constante $0<k<1$ con $$ |g’(x)|\leq k, \text{ para toda }x\in (a,b). $$ Entonces, para cualquier número $p_0$ en $[a,b]$, la sucesión definida por $$ p_n=g(p_{n-1}), \qquad n\geq 1, $$ converge al único punto fijo $p$ en $[a,b]$.

Bajo las condiciones del teorema el algoritmo siempre converge. Las cotas de error al aproximar $p_n$ al punto fijo están dadas por $$ |p_n-p|\leq k^n \max\{p_0-a,b-p_0\} $$ y $$ |p_n-p| \leq \dfrac{k^n}{1-k}|p_1-p_0|, \text{ para toda }n\geq 1. $$

Diagrama de flujo

Inicio
Inicio
Los datos
ingresados son
adecuados?
Los datos...
   Entrada: a, b,
 punto inicial p 
error, max. iteraciones
Entrada: a, b,...
k=k+1
k=k+1
x=g(p)
x=g(p)
k<kmax y 
|x-p|>eps
k<kmax y...
Fin
Fin
No
No
  El punto fijo es x
o no converge 
en kmax pasos 
El punto fijo es x...
No
No
p=x
p=x
Viewer does not support full SVG 1.1

Código

El siguiente codigo implementa el método de punto fijo en C++:

///////////////////////////////////////////////////////////////////////////////////
// Programa para hallar el punto fijo de una función g entre a y b.		 //
// El programa requiere un subprograma para la función g, los puntos 		 //
// a y b, la tolerancia de error eps, y el máximo número 			 //
// de iteraciones permitidas, kmax. 						 //
// El programa muestra una tabla con los valores de x y su evaluación en g.	 //
///////////////////////////////////////////////////////////////////////////////////
# include <iostream>
# include <iomanip>
# include <math.h> // para log x
using namespace std; // Para usar cout

long double f(long double x); // Declara la función f

int main(){
    int kmax;
    long double a, b, p, eps;
    cout << "Ingrese a, b, p, eps, kmax\n";
    cin >> a >> b >> p >> eps >> kmax;
    // Verificamos que los valores ingresados permitan usar el algoritmo
    while(b<a || isnan(f(a)) || isnan(f(b)) || f(a)<a || f(b)>b){
        if(b<a)
            cout << "Ingrese un intervalo de la forma (a,b) con a<b\n";
        else if(isnan(f(a)))
            cout << "La evaluacion en " << a << " no esta definida\n";
        else if(isnan(f(b)))
            cout << "La evaluacion en " << b << " no esta definida\n";
        else if(f(a)<a || f(b)>b)
            cout << "La funcion no satisface el Teorema  b\n";
        cout << "Ingrese nuevamente valores para a y b\n";
        cin >> a >> b;
    }
    cout << "Los valores ingresados son \n";
    cout << "a= " << a << "  b= " << b << " p= " <<p;
    cout << " eps = " << eps << "  kmax = " << kmax << endl;
    cout << "Los resultados son\n"; // Muestra el encabezado de la tabla
    cout << "k" << setw(16) << "x" << setw(22) << "f(x)\n";
    cout << 0 << setprecision(9) << setw(20) << p << setw(20) << f(p)
             << endl;
    int k=1;
    cout.setf(ios::fixed);
    while ((k<=kmax) && (fabs(f(p)-p)>eps)){
        // Muestra los valores de k, x, y, a, b
        cout << k << setprecision(9) << setw(20) << f(p) << setw(20) << f(f(p))
             << endl;
        k++; // incrementa el contador del ciclo
        if (fabs(f(f(p))-f(p))<=eps) cout << "El punto fijo de f es " << p; 
        p=f(p);
    };
    if (k>kmax) cout << "El metodo no converge en " << kmax << " pasos";
    return 0;
}
// El subprograma para ingresar la función f
long double f(long double x){
    return x-(x*x*x+4*x*x-10)/(3*x*x+8*x);
}
José Luis León Medina
José Luis León Medina
Investigador Posdoctoral CONAHCYT

Mis intereses en investigación se centran en el campo de la topología algebraica, en particular propiedades homotópicas como la complejidad topológica.