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
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);
}