El Mapeo Logístico

La serie de fibonacci es un intento bastante elemental de modelar el crecimiento de una población. Sin embargo, tiene el gran problema de que está diseñada pensando que existen una cantidad inagotable de recursos que permiten el crecimiento: alimento, espacio, etcétera. Desde luego, esto no es así en el mundo real; las poblaciones nunca crecen de manera infinita, y es previsible un freno cuando los recursos escasean o cuando ataca una epidémia. Un intento más refinado de modelar una población es el Mapeo Logístico.

Xn+1 = k*Xn( 1 – Xn )

Esta aplicación es, al menos algorítmicamente, bastante simple. Si quisiéramos hacer las cosas fáciles y trabajar con un modelo de caricatura, este resultaría perfecto. Su gráfica es la de una parábola que se abre hacia abajo. En el inicio esta gráfica se parece a la gráfica de la serie de fibonacci, tanto como puede parecerse una recta a una parábola, localmente todo es plano. Ahora, mientras que la población de conejos crece indiscriminadamente en el modelo de fibonacci, la aplicación logística llega a un máximo y de ahí empieza a descender, algo que está más cercano a la realidad en cuanto a modelar poblaciones se refiere. Cuando se acaban los recursos y el espacio se limita, el ritmo de crecimiento disminuye e incluso la población se reduce. Es difícil imaginar un modelo más simple. Sin embargo, con toda su sencillez, el mapeo logístico contiene una característica esencial que la hace muy diferente de la serie de fibonacci: no es lineal.

Es necesario hacer algunas acotaciones en este punto. La ecuación de arriba contiene un parámetro k, que llamaremos de crecimiento o de fertilidad; la rapidez con la que se reproduzcan los conejos dependerá de esa constante. Pero también dependerá del número de individuos que haya originalmente. Así que para hacer las cosas divertidas se restringirá los valores que puede tomar Xo al intervalo (0, 1) y los de k al intervalo (1, 4). ¿Por qué restringir a esos valores el rango de validez de la aplicación? Para contestar esta pregunta es necesario ver geométricamente qué es lo que hace la aplicación logística. El primer factor del lado derecho (k*Xn) “estira” o comprime, dependiendo del parámetro de fertilidad, el valor inicial; esto sería un aburrido crecimiento lineal si no fuera por el segundo factor, que puede disminuir o hacer más grande, o incluso negativo, el valor final. Si Xn es mayor que 1, entonces, la siguiente población de conejos tendrá un número negativo de miembros, lo cual implica su extinción, este caso no nos interesa; obviamente tampoco supondremos que se inicia con una población negativa. Así pues, es conveniente tomar a Xn con un valor inicial entre 0 y 1. Esto a su vez impone que el valor de k no pueda ser mayor que 4. ¿Por qué? Porque el punto máximo de la población se alcanza en 0.5, y el valor de este máximo es k/4. Para valores mayores que 4, la aplicación rapidamente tiende a infinito, en tanto que para los valores entre 0 y 4 el valor de la población regresa nuevamente al segmento 0-1. La mitad del segmento unitario es estirado o comprimido y la segunda mitad se mapea en el orden inverso. Cabe aclarar también, que, aunque Robert May propuso esta aplicación como un modelo poblacional, su aplicación va más allá y en principio no necesitamos hacer referencia a conejos ni tenemos que justificar que los intervalos de Xo y k sean los elegidos. Se toman esos porque ahí ocurren cosas extraordinarias.

¿Hacia donde evoluciona la aplicación logística? Si el sistema se deja “correr” sin límites, ¿se estabiliza después de varias (muchas) generaciones ? Para averiguar esto podemos iniciar con un par de valores para nuestros parámetros, digamos Xo =0.2 y k =1.5.

La serie de valores que encontramos son los siguientes :

  1. 0.32
  2. 0.4352
  3. 0.491602
  4. 0.499859
  5. 0.5
  6. 0.5
  7. 0.5

Con 0.5 repitiéndose por siempre.

Resultó fácil. Esto se puede intentar con una calculadora de bolsillo e incluslo con papel y lápiz y un poco de paciencia. Con el valor fijo de k se puede probar con otros valores para Xo, El comportamiento es el mismo. Después de algunos ciclos, que no deberán ser muchos, se llega a un punto muerto, 0.5. Si ahora ponemos k = 2.5 entonces todos los valores de Xo acaban en 0.6. De hecho, todos los valores de k comprendidos entre 0 y 3 tienen un comportamiento “aburrido”, por usar un adjetivo. A esta zona se le llama el régimen de estado estacionario. Otra forma de ver esto es mediante la figura que se muestra a continución. Cualquier punto en el diagrama converge hacia un único valor.

Mapeo Logístico en estado estacionario.

Mapeo Logístico en estado estacionario.

La gráfica anterior muestra los puntos de la tabla de arriba. Finalmente se alcanza el estado estacionario después de pocas iteraciones. Sin embargo, no todos puntos en el estado estacionario convergen rápidamente. En el límite cuando k se acerca a 3, la convergencia se hace cada vez más y más lenta. Para ahorrar el trabajo de teclear una y otra entrada miles de veces en una calculadora electrónica, se puede usar un programa como el mostrado aquí en C++.

# include<iostream>
using namespace::std;

enum {contador = 2};

int main()

{ 
long double EquisNmasUno, EquisN = 0.3, k = 2;
int n;

for ( n = 1; n <= contador; n++ )
 {
 EquisNmasUno = k*EquisN*( 1 - EquisN );
 cout << EquisNmasUno <<endl;
 EquisN = EquisNmasUno;
 }

return 0;
} 

Utilizando este código pruebo con el valor de k = 2.99, y Xo = .7 para obtener el valor 0.665552 después de miles de iteraciones. Ignoro, por la precisión de mi computadora, si es ese el valor exacto o si aún está variando el valor hacia un punto fijo. Sin embargo, lo que es seguro es que no habrá un comportamiento distinto. El sistema tiende a quedarse quieto.

Para valores de k mayores a 3, y menores a 3.58, más o menos, el sistema ya no tiende a estar en un sólo punto, se mueve de manera cíclica entre dos o mas valores de manera infinita. Con el programa anterior pruebo el valor k = 3.2 y Xo = 0.4, después de 100 iteraciones obtengo los valores:

  1. 0.513045
  2. 0.799455
  3. 0.513045
  4. 0.799455

repitiéndose de manera infinita. ¿Qué está pasando? Para hacer las cosas más claras, es conveniente mostrar en una gráfica la manera en que los puntos se mueven en la aplicación.

Mapeo Logístico en el régimen periódico.

Después de algunas iteraciones la aplicación se estabiliza en los dos ciclos que se obtuvieron con el programa. Pero en la zona de periodicidad no sólo aparece un par de de ciclos. Sea por caso el valor de k = 3.53 y Xo = 0.03. Usando de nueva cuenta el programa anterior, después de unos cien ciclos se obtiene

Gráfica 3

Cuatro periódos en la aplicación logística para k = 3.53

Si ahora se toma un valor de k = 3.59, lo que se obtiene es lo que se muestra en la figura siguiente.

Figura.

Esto es, los ciclos se han duplicado tanto que en realidad están apareciendo una gran cantidad de ellos sin control. De pronto se ha perdido el orden y la periodicidad de las etapas anteriores y en realidad no puede decirse que el sistema regrese a un valor anterior, sino que todos los valores de Xn+1 son nuevos. A partir del valor de k = 3.58, aproximadamente hasta k = 4, la aplicación logística está en la llamada zona caótica. Todos los puntos han sido alcanzados o, cuando menos, se pasará tan cerca de ellos como se quiera, siempre que se deje tiempo evolucionar al sistema un tiempo suficiente. Abajo se muestra la gráfica del valor final al que converge la aplicación logística contra el valor k del parámetro de fertilidad. Para hacer esta gráfica, en lugar de cncontrar los resultados con una calculadora, se usa un programa cuyo código aparece aquí escrito en C++. Este programa itera n veces la aplicación y desecha esos números, que representan fluctuaciones alrededor de los puntos a los que finalmente converge. Finalmente se toman los últimos 20, que se presumen bastante cercanos o exactamente los puntos finales. La calidad de la gráfica depende también de las variaciones en el parámetro k. Estos incrementos se han hecho bastante chicos.

 # include<iostream>
 using namespace::std;

 #include<iomanip>
 using std::setprecision; 

 enum {contador = 10000};

 int main()

 {
   long double  EquisNmasUno, EquisN = 0.51, k = 3.81;
   int n;

   for (double k = 3.8282; k <= 3.8285; k += 0.0000001 )
   {       // Abre primer for
   EquisN = 0.51;

   for ( n = 1; n <= contador; n++ )
   {
      EquisNmasUno = k*EquisN*( 1 - EquisN );
      EquisN = EquisNmasUno;
   }

   for ( int m = 1; m <= 200; m++ )
   {    // Abre for 

      EquisNmasUno = k*EquisN*( 1 - EquisN );
      EquisN = EquisNmasUno;
      cout <<  setprecision(10) << k << " " << EquisNmasUno <<endl;
   }    // Abre for

   } // Cierra for anidado

 return 0;

 }

Gráfica Nítida

La higuera de Feigenbaum con una alta resolución.

La figura fue hecha a partir de varios miles de puntos, se puede variar los incrementos en k en el programa o incrementar el contador n en el primer ciclo for anidado para obtener una resolución un poco más baja. Se ha hecho con gran fidelidad para poner en evidencia que a pesar de haber entrado en zonas donde se alcanzan todos los valores del rango (0, 1), existen zonas de periodicidad (zonas blancas dentro de zonas rojas). En particular hay una zona periódica cerca de 3.8. Para analizarla mejor en la gráfica de abajo se hace un zoom a la zona (3.815, 3.86). Este acercamiento se logra haciendo más pequeña la variación de k en el ciclo inicial del programa de arriba.

Primer acercamiento a la higuera de Feingenbaum.

El acercamiento hace evidente que en 0.5 y a partir de k= 3.84 hay una figura bastante parecida a la original presentada arriba. Para salir de dudas, de nuevo es posible hacer un acercamiento a la figura. Abajo se presenta la zona ampliada. Se trata de una imagen especular de la original. Y si se observa bien, cerca de 3.854, aparece otra zona de estabilidad en la cual se observa una bifurcación parecida a la que hemos encontrado. La memoria de mi máquina no permite hacer otro acercamiento, porque GNUPLOT, que es el programa que uso para graficar, no puede manejar tantos puntos que se producen, sin embargo, es seguro que la figura se va repitiendo una y otra vez al infinito.

Zoom a la Higuera de Feigenbaum

Grafiga

Acercamiento a la higuera

Acercamiento

Segundo Zoom

Segundo acercamiento a la higuera de Feigenbaum

Hasta aquí un bosquejo breve de todo lo que surge a partir de la aplicación logística. Sin embargo, ha sido muy general. Lo principal es entender que se trata de algo más complejo de lo que se piensa a primera vista. En su viaje a través de todos los valores de k, el mapeo sufre una gran cantidad de transformaciones. Saliendo de una estabilidad esperada, pasa por sucesivas duplicaciones, no tan esperadas, hasta llegar a zonas de aparente desorden dentro de las cuales hay ventanas con un poco de orden… y así de manera infinita. El destino final de ese viaje es el caos determinista. ¿Qué es el caos? Baste por ahora decir que es simplimente ese destino en donde aparecen todos los ciclos. Uno de los caminos para llegar a ese destino se llama duplicación de periódos. Por este camino transitan muchos fenómenos, algunos más complejos que otros. Para entender al caos determinista, vale mucho la pena revisar la forma en que se llega a él a través de ésta ruta.

Volvamos a la Figura 1. En ella se muestra la gráfica de la primera iteración contra Xo, como función de k.

# include<iostream>
usingnamespace::std;

int main()

 {

longdouble EquisNmasUno, EquisN = 0.5, k = 3.5;
longdouble X;
int n;
int contador = 4;

for ( X = 0; X <= 1; X += 0.001 )
 { // Abre primer for

 EquisN = X; 
// No se puede usar EquisN como controlador del
// ciclo for porque esta variable es modificada
// en el cuerpo del ciclo.

for ( n = 1; n <= contador; n++ )
 { // Abre for anidado
 EquisNmasUno = k*EquisN*( 1 - EquisN );
 EquisN = EquisNmasUno;
 } // Cierra for anidado

// Esta es la salida al archivo de datos
 cout << X << " " << EquisNmasUno << endl;

 } 
//Cierra primer for
return0;

 } 

Las siguientes figuras muestran algunos puntos de bifurcación de la aplicación logística.

Cuatro Iteraciones de la aplicación logística.

Esta es la gráfica de la segunda iteración de la aplicación logística.

Segunda Iteración de la Aplicación Logística

Esta gráfica es un acercamiento de la anterior

Espacio

r1″ src=”https://masejerciciosresueltos.files.wordpress.com/2011/03/graficarr1.jpg&#8221; alt=”Gráfica que muestra la primera bifurcación.de la aplicación logística. ” width=”640″ height=”448″ />

Primera bifurcación.de la aplicación logística, r < r1

l