VIII. PARA LA COMPUTADORA

LA CONSTRUCCIÓN de un fractal, la posibilidad de utilizarlo para producir, almacenar, analizar o transmitir una imagen se simplifica considerablemente haciendo uso de la computadora. De hecho, el efecto y la utilidad que ha demostrado tener la geometría fractal no se hubieran manifestado sin las facilidades de cálculo y representación gráfica que proporciona el trabajo en computadora; parecen estar hechos el uno para el otro. Los fractales se generan a través de procesos en los que una misma operación se repite un sinnúmero de veces, y eso es precisamente lo que una computadora sabe hacer mejor.

La calidad de la visualización de una estructura fractal en el monitor de una computadora depende de la resolución de la pantalla aunque, en un sentido estricto, jamás obtendremos una representación exacta que reproduzca el detalle de la figura a toda escala. Sin embargo, la tecnología moderna ya permite generar imágenes cuya resolución va más allá de lo que podemos distinguir con nuestros ojos.

La mayoría de los métodos desarrollados para construir imágenes fractales se basan en procedimientos muy sencillos que en cualquier lenguaje computacional se expresan en unos cuantos renglones; de ahí la sorpresa que provoca observar la complejidad de la imagen que hacen surgir en la pantalla.

Sin duda alguna, la manera más fácil de entender qué es un fractal y convencerse de su enorme utilidad, es aceptar el reto de construirlo. Por ello hemos incluido en este capítulo un conjunto de instrucciones y programas para la computadora que permiten generar la mayoría de las figuras de este libro. Si se sabe BASIC, el camino está prácticamente andado, si no, recomendamos copiar directamente los programas y trabajar con ellos. Estamos dispuestos a apostar que no habrá nadie que se arrepienta.

EN EL PAÍS DE LAS MARAVILIAS

Conjuntos de Julia

El conjunto de Julia correspondiente a un valor determinado de la constante c se genera computacionalmente a través de la aplicación de la iteración zn+1 = zn2+c a cada uno de los puntos de una red definida en una región adecuada del plano complejo. Para hacerlo es necesario escribir la operación de interés en términos de sus partes real e imaginaria. Esto es:

zn+1= (an+1,bn+1)              zn=(an, bn)              c=(Cr, Ci),

donde utilizamos la representación tipo coordenadas para cada término de la iteración. Al sustituir resulta:

zn+1=zn2 + c= (an, bn) (an, bn) + (Cr, Ci) = (an+1, bn+1)

y si multiplicamos y sumamos:

(an+1,bn+1)= (an2- bn2 + Cr, 2an bn+ Ci).

Cuando se igualan dos números complejos, necesariamente se cumple que sus partes reales y sus partes imaginarias son iguales entre sí, es decir:

Real

an+1 = an2- b2n+ Cr

Imaginaria

bn+1 = 2an bn + Ci

Con esto se logra convertir la iteración de números complejos zn+1 = zn2 + c, en dos iteraciones de números reales que son más fáciles de manejar.

Para iniciar la búsqueda de prisioneros y escapistas es necesario dar los valores de Cr y Ci que se quieran, y seleccionar un punto (ao, bo) para hacer la prueba. Aplicando la iteración sobre él se analizan las características de la órbita para determinar la naturaleza del atractor al que se dirige. Es evidente que si el atractor está en el infinito, jamás podremos alcanzarlo. Afortunadamente, puede demostrarse (Peitgen, 1984) que si el resultado de una iteración es un número complejo cuya distancia al origen r es mayor que dos, la órbita se escapará hacia infinito; la distancia r se calcula a través del teorema de Pitágoras, r= a² + b² (Figura 32). Esto permite distinguir entre puntos prisioneros y escapistas.

[MCT 53]

Figura 32. La distancia R es una medida del tamaño del número complejo z= (a,b) . Por el teorema de Pitágoras, R²=a²+b².

En forma práctica: se aplica el mapeo; se analiza el valor de r, para el numero obtenido; si r>2, el punto no se pinta en la pantalla y se selecciona un nuevo valor inicial; si r<2 se aplica de nuevo el mapeo sobre el resultado y se repite el análisis anterior. Si después de un número N de iteraciones (por ejemplo, 100) la distancia al origen de la órbita (r) sigue siendo menor que dos, se considera que el punto es prisionero (pertenece al cuerpo del conjunto de Julia) y se le grafica con un color que lo distinga. En un lenguaje computacional como el BASIC, el siguiente programa genera en la pantalla de un monitor monocromático el cuerpo del conjunto de Julia asociado a la constante compleja c=(Cr, Ci) que se seleccione:

REM "Conjuntos de Julia"

KEY 0FF: CLS

INPUT "Dame la constante compleja c ", Cr, Ci

CLS: SCREEN 1

WINDOW (-2, -2)-(2, 2)

LINE (-2, -2)-(2, 2), , B

Paso = 200: N =100

Delta = 4/Paso

ao = -2: bo = -2

REM "Se construye una red en el plano complejo"

FOR J = 1 TO Paso

FOR K = 1 TO Paso

a = ao + J * Delta

B = bo + K * Delta

i= 0: RR = O

REM "Se hace la iteración en cada punto"

WHILE (i < N AND RR < 4)

an = a * a - B * B + Cr

B = 2 * a * B + Ci

a = an

RR = a * a + B * B

i = i+1

WEND

REM "Se dibujan los prisioneros"

IF i < N THEN 10

PSET (ao + J * Delta, bo + K * Delta) 10

NEXT K

10 NEXT J

END

 

El detalle de la frontera (conjunto de Julia) de las figuras obtenidas con este programa (Figuras 8 y 9) mejora al incrementar el número de puntos sobre el que se aplica el mapeo (variable Paso), así como utilizando monitores con más alta resolución (SCREEN).

Si se cuenta con una paleta de color; el programa puede modificarse para asignar distintos colores a regiones del plano complejo, fuera del cuerpo del conjunto de Julia, cuyas órbitas presenten diferente rapidez de escape medida como N-i (valores pequeños de i implican que el límite r=2 se rebasa con rapidez al aplicar la iteración). En la siguiente tabla se presentan algunos de los muchos valores de c para los que el conjunto de Julia muestra características interesantes (Peitgen, 1986)

La lista, por supuesto, no agota el número de posibilidades, y es tan sólo un reto al lector que desee adentrarse en este reino de fantasía:

c
Figura

(-0.12,0.57)

(0.12,0.66)

(0.12,0.74)

(-0.25,0.74)

(-0.194+0.6557)

(-0.75 + 011)

(-0.745+0.1130)

(-1.25 0)

(-01565+1.0322)

(0.32,0.043)

8(a)

8(b)

8(c)

8(d)

8(e)

8(f)

9(a)

9(b)

9(c)

9(d)


El conjunto de Mandelbrot puede generarse con relativa facilidad si se toman en cuenta dos principios básicos:

a) Todo valor de c que pertenece al conjunto genera una órbita que no se dispara a infinito al aplicar la iteración zn+1=zn2 +c al punto z0(0,0).

b) Toda órbita de iteración cuya distancia al origen r exceda de dos, escapará a infinito.

Con base en esto, basta analizar el comportamiento de la iteración cuadrática aplicada al punto zo= (0,0) para distintos valores de c, y graficar sobre el plano complejo aquellas c en las que el origen se comporta como prisionero. Esto puede hacerse sistemáticamente a través de un programa de cómputo sencillo, cuya estructura en BASIC sea como la siguiente:

REM "Conjunto de Mandelbrot"

KEY 0FF: CLS

SCREEN 1

WINDOW (-2.4, -1.25)-(0.8, 1.25)

LINE (-2.4, 0)-(0.8, 0): LINE (0, -1.25)-(0, 1.25)

LINE (-2.4, -1.25)-(0.8, 1.25), , B

Paso = 200: N = 100

Deltr = 3.2/Paso: Delti = 2.5/Paso

REM "Se seleccionan las constantes c a visitar"

Cr = -2.4

FOR J = 1 TO Paso

Cr = Cr + Deltr

Ci = -1.25

FOR K= 1 TO Paso

Ci = Ci + Delti

ao = O

bo = O

i= O: RR = O

REM "Se hace la iteración en zo = (0, 0)"

WHILE (i < N AND RR < 4)

an = ao * ao - bo * bo + Cr

bo = 2 * ao * bo + Ci

ao = an

RR = ao * ao + bo * bo

i=i+1

WEND

REM "Se dibujan los puntos del conjunto"

IF i < N THEN 10

PSET (Cr, Ci)

NEXT K

NEXT 3

END

 

En este programa se recorre el intervalo de valores de la constante c comprendido entre -2.4 y 0.8 en su parte real, y de -1.25 a 1.25 en su parte imaginaria. Todo valor de c que pertenece al conjunto de Mandelbrot se dibuja en el plano complejo representado en la pantalla. La estructura del conjunto se muestra en la figura 10. De nuevo es importante señalar que los detalles del conjunto se hacen más notorios al incrementar el valor de la variable. Paso (número de valores de c visitados) o la resolución del monitor. Las ilustraciones más famosas del conjunto de Mandelbrot se han realizado en monitores de color de alta resolución, asignando diferentes colores a valores de c fuera del conjunto, de acuerdo con la rapidez de divergencia o escape a infinito de sus órbitas (controlado por la variable i; ver las láminas).

A diferencia de los conjuntos de Julia, de los cuales existe uno para cada valor del parámetro complejo c, el conjunto de Mandelbrot es único. Sin embargo, en él está contenida toda la complejidad de cualquier conjunto de Julia imaginable. Por ello, analizar los detalles de su contorno puede ser una experiencia inolvidable. Para demostrarlo, recomendamos aquí algunas zonas dignas de exploración, e invitamos al lector a hacer sus propios descubrimientos en este mundo fascinante (Peitgen, 1986).

WINDOW
Figura
(-0.670,0.47) -
(-0.365,0.69) 11 (a)
(-0.575,0.585) -
(-0.505,0.635) 11(b)
(-0.750,0.105) -
(-0.740,0115) 11(c)
(-0.7459,0.1119) -
(-0.7444,0.1134) 11(d)
(-0.745538,0.11288) -
(-0.745054,0.113236) 11(e)
(-0.7454356,0.1130037) -
(-0.7454215,0.1130139) 11(f)

En estos casos es necesario modificar un poco el programa anterior para considerar los nuevos límites del WINDOW, los valores de inicio de Cr y Ci que correspondan, así como el tamaño del intervalo por recorrer en el eje real y en el eje imaginario (indicados en las variables Deltr y Delti). En la medida que el WINDOW es más pequeño resulta recomendable tomar cada vez valores mayores de N.

UN MUNDO DE IMÁGENES

Ping-pong fractal

Los principios en los que se basa el método del ping-pong fractal son realmente sencillos. Para utilizarlo sólo es necesario construir la tabla del conjunto de transformaciones de afinidad que generan el collage de la figura de base sobre la que se desea trabajar. El resto consiste en establecer un mecanismo de selección azarosa de cada uno de los algoritmos correspondientes, para aplicarlos iteradamente a partir de un punto arbitrario inicial. En un lenguaje simple como BASIC estas ideas pueden plasmarse en un programa corto como el que se lista a continuación, escrito para el caso particular de la hoja de helecho fractal (Figura 15 (b)), cuya tabla de transformaciones se encuentra en el capitulo "Un mundo de imágenes":

REM "Imagen de una hoja de helecho fractal"

CLS: SCREEN 1

WINDOW (-3, 0)-(3.5, 11)

pl = 0.005: p2 = 0.0975:

f = 3.1416/180

x = 0: y = O

d = RND

x = r * COS(A * f) * x - s * SIN (B * f) * y + h

y = r * SIN(A * f) * x + s * COS (B * f) * y + k

PSET(x, y)

n=n+1

IF n > 20000 THEN 5

REM "Se selecciona al azar cada transformación"

IF d < p1 THEN 2

IF d > p1 AND d < p1 + p2 THEN 3

IF d > p1 + p2 AND d < p1 + p2 + p3 THEN 4

r = 0.85: 5 = 0.85: h = 0

k = 1.6: A = -1.5: B = -1.5

GOTO 1

r = 0: s = 0.16: h = 0

k = 0: A = 0: B = 0

GOTO 1

r = 0.3: s = 0.37:h =0

k = 0.44: A = 135:B = -40

GOTO 1

r = 0.3: 5 = 0.34:h =0

k = 1.6: A = 45: B= 45

GOTO 1

END

1
 
2
3
 
4
 
5

Como puede verse, la elección de cada transformación de afinidad se hace de acuerdo con el valor aleatorio de la variable d, considerando la probabilidad de visita de cada área pi. Las características del lenguaje de programación utilizado, obligan a manejar las variables angulares A y B en radianes, por lo que se introduce el factor de transformación f. La nitidez de la figura obtenida puede mejorarse ya sea utilizando un monitor de alta resolución o incrementando el número total de iteraciones que en nuestro caso se ha limitado a 20 000.

En caso de contar con una paleta de color, la imagen puede enriquecerse por la asignación de colores o tonos distintos de acuerdo con la frecuencia de incidencia en cierta región de la pantalla.

Debe ser claro que el fractal generado en la computadora no es, en el estricto sentido matemático, un verdadero fractal. La posibilidad de tener detalle a toda escala está restringida por el tamaño de los puntos desplegados en el monitor, de manera que hay un límite en la repetición de la forma original. Aun así, el método es muy útil para construir excelentes representaciones del caso ideal.

La estructura de este programa puede servir para reproducir el fractal que se desee, con tal de cambiar los valores de r, s, h, k, A y B que correspondan a cada transformación, las probabilidades de visita pi , y cuando se requiera, incluir las transformaciones de afinidad adicionales que sean necesarias.

JUEGOS NATURALES

Agregación limitada por difusión

Para simular el crecimiento de un agregado fractal por el método de agregación limitada por difusión (DLA), lo primero que hay que hacer es elegir el tipo de celda con la que se va a trabajar. Si la celda es circular; hay que colocar una partícula semilla en el origen de una malla regular; si la celda es rectangular, que es el caso que aquí ilustraremos, se coloca una línea de semillas en la base de la malla para representar al electrodo.

El cálculo se inicia añadiendo una partícula en una posición aleatoria alejada de la base, y se permite que inicie su movimiento siguiendo una caminata al azar. Si al hacer su recorrido casualmente visita un sitio adyacente a alguna semilla, pasa a formar parte del cúmulo y una nueva partícula se introduce al sistema. Esta recorre su camino azarosamente hasta toparse y adherirse al agregado en crecimiento. El proceso se repite con un número N de partículas, estableciendo condiciones a la frontera que aseguran el reemplazo de toda partícula que en su trayectoria aleatoria rebase los límites impuestos al sistema.

El siguiente programa en BASIC permite crecer un agregado fractal en una celda rectangular donde se depositan 900 partículas:

REM "DLA para una celda rectangular"

KEY 0FF: RANDOMIZE TIMER
CLS: SCREEN 1

WINDOW (-40, -36)-(40, 36)

LINE (-35, -35)-(35, 35), , B

LINE (-30.5, -28.3)-(30.5, -27.7), 3, BF

REM "Condiciones iniciales"

N = 900: Con = 0

WHILE Con <= U

REM "Definición de posición aleatoria"

x = -30 + INT(61 * RND): y = 28

LINE (x - 0.4, y - 0.4)-(x + 0.4, y + 0.4), , BF

C=0

REM "Análisis del estado de sitios vecinos"
10
IF (POINT(x + 1, y) <> 0 OR POINT(x - 1, y) <> 0 OR

POINT(x, y + 1) <> 0 OR POINT(x, y - 1) <> 0) THEN

C = 1 ELSE C = O

IF C = 1 THEN 30

LINE (x - 0.4, y - 0.4)-(x + 0.4, y + 0.4), 0, BF

REM "Cálculo de nueva posición al azar"

Sel = RND

IF (Sel <= 1/3 AND POINT(x+1, y) = 0) TEEN x = x + 1

IF (Sel >= 1/3 AND Sel <=2/3 AND

POINT(x - 1, y) = 0) THEN x = x - 1

IF (Sel >= 2/3 AND POINT(x, y-1) = 0) THEN y = y - 1

LINE (x - 0.4, y - 0.4)-(x + 0.4, y + 0.4), , BF

REM "Condición a la frontera"

IF (x < -33 OR x > 33 OR y < -33 OR y > 33 ) THEN 20

GOTO 10

20

LINE (x - .4, y - .4)-(x + .4, y + .4), 0, BF

GOTO 40

30

Con = Con + 1

40

WEND

END

La agregación por DLA es un proceso relativamente lento, por lo que no hay que desesperar antes de ver completo el depósito (Figura 23(b)). El programa anterior puede modificarse con relativa facilidad para trabajar en una celda circular o incluir la posibilidad de que las partículas reboten antes de adherirse (Talanquer, 1991). Esto es de utilidad para analizar cómo cambia la estructura y su dimensión fractal.

HUELLAS EN EL TIEMPO

Sobrepoblaciones

El comportamiento temporal de la dinámica poblacional que corresponde a la relación:

Ni+1= aNi (1-Ni )

puede generarse fácilmente en la computadora. Para ello hay que construir un programa en el que, dados los valores del parámetro a y la población inicial N0, se calculen las poblaciones sucesivas N1, N2, N3,..., y se grafiquen como función del tiempo. En BASIC (Cortés, 1992):

REM "Comportamiento temporal de la población"

INPUT "Dame el parámetro de crecimiento a (0-4)", a

INPUT "Dame la población inicial No (0-1)", No

CLS: SCREEN 2

WINDOW (-5, -0.1)-(105, 1.1)

LINE (0, 0)-(0,1): LOCATE 2, 2: ?"N"

LINE (100, 0)-(0,0): LOCATE 22, 75:?"t"

REM "Cálculo del comportamiento temporal"

FOR i=0 TO 100

LINE -(i, No)

No = a * No * (i - No)

NEXT i

END

Las gráficas que se generan son como las de la figura 28 y corresponden a un análisis en el que se realizan 100 iteraciones. Para obtener el diagrama de bifurcaciones (Figura 29), la iteración debe hacerse para varios valores sucesivos de a, graficando para cada uno de ellos los distintos valores que alcanza la población en las últimas iteraciones (si se hacen 100 por ejemplo, basta tomar las últimas 25):

REM "Diagrama de bifurcaciones"

INPUT "Dame la población inicial No (0-1)", No

CLS: SCREEN 2

WINDOW (2.75, -0.1)-(4.1, 1.1)

LINE (2.8, 0)-(4, 1)9 , B

LOCATE 2, 2: PRINT "N": LOCATE 23, 77: PRINT "a"

REM "Cálculo y representación gráfica"

FOR a = 2.8 TO 4 STEP 0.002

FOR i = 1 TO 100

No = a * No * (1 - No)

IF i > 75 THEN PSET (a, No)

NEXT i

NEXT a

END

Si se desea utilizar la computadora como microscopio y hacer ampliaciones, basta cambiar los límites de la instrucción WINDOW, y el intervalo de valores a que se recorre.

AUTÓMATA CELULAR

Recordemos que el autómata celular cuyo comportamiento nos interesa investigar está definido en una malla unidimensional en la que cada celda puede tomar uno de dos valores posibles: 0 o 1. La regla de evolución temporal que se ha elegido se resume en una tabla como la siguiente, en la que se establece cuál será el nuevo estado de cada celda, como función de la suma de los valores que tenían ella y sus dos primeros vecinos en la etapa anterior:

SUMA
0
1
2
3
NUEVO ESTADO
0
1
1
0

El programa de computadora por construir debe entonces analizar cuánto vale la suma en cada una de las celdas, y con base en ello cambiar su estado. Después de actualizar a todo el sistema se elige un código de color: 1-negro, 0-blanco, por ejemplo, y se dibuja el resultado. El proceso se repite tantas veces como se quiera, desplegando en la pantalla, una tras otra, la estructura que se tiene en cada etapa:

 

REM "Autómata celular"

DIM Vieja(105), Nueva(105)

CLS: SCREEN 2

WINDOW (0, -100)-(100, 0)

j = -1

REM "Condiciones iniciales al azar"

FOR i = 1 TO 100

 

Vieja(i) = IIT (2 * RND)

IF Vieja(i) = 1 THEN

 

LINE (i, j)-(i + 1, j + 1), , BF

 

 

10

NEXT i

REM "Nuevos estados"

FOR i = 2 TO 99

 

Sum = Vieja(i) + Vieja(i + 1) + Vieja(i - 1)

IF Sum = 0 THEN Nueva(i) = 0

IF Sum = 1 THEN Nueva(i) = 1

IF Sum = 2 THEN Nueva(i) = 1

IF Sum = 3 THEN Nueva(i) = 0

 

NEXT i

Nueva(1) = Nueva(99)

Nueva(100) = Nueva(2)

j = j - 1

REM "Actualización"

FOR i = 1 TO 100

 

IF Nueva(i) = 1 THEN

 

LINE (i, j)-(i + 1, j + 1), , BF

 

Vieja(i) = Mueva(i)

 

NEXT i

IF j >= -100 THEN 10

END

Es interesante modificar el programa anterior para alterar las condiciones iniciales o la regla de evolución del autómata. Algunos de los patrones que caracterizan al sistema se presentan en la figura 31 y muestran la estructura alcanzada después de 100 etapas.

InicioAnteriorPrevioSiguiente