You are on page 1of 14

REPRESENTACION GRAFICA DE FRACTALES MEDIANTE UN PROGRAMA DE CALCULO SIMBOLICO

JUAN L. VARONA

Introduccion No es el propsito de este art o culo dar una visin general ni una teor sobre o a fractales, ni mostrar magn cos dibujos elaborados quin sabe cmo. Hay muchos e o libros que se dedican a distintos aspectos del estudio de fractales. Por citar unos pocos, mencionemos [6, 11], en los que podemos encontrar bastantes ideas intuitivas, as como grcos y explicaciones detalladas de cmo generarlos. Ms avanzado es a o a [7] (aunque tambin hace hincapi en los aspectos grcos) y, an ms, [8, 3]; en e e a u a particular, este ultimo analiza en profundidad la iteracin de funciones racionales, o una de las mayores fuentes de fractales. En espaol, un interesante libro que muestra n multitud de algoritmos y grcos es [2]; mucho ms contenido matemtico tiene [9]. a a a Queremos tambin citar [10], una traduccin de un clsico de Mandelbrot, uno de e o a los padres de la geometr fractal (sobre todo en el aspecto divulgador), y que, a adems, fue quien invent el trmino fractal. a o e En este art culo, simplemente, nos dedicaremos a mostrar cmo lograr represeno taciones grcas de fractales mediante uno de los potentes programas de clculo a a simblico disponibles actualmente. Veremos que es una tarea que implica cierta o actividad matemtica: no se podr, en general, tratar de programar, directamente, a a alguno de los algoritmos que denen el fractal. En pocas palabras, y sin profundidad, demos algunas ideas intuitivas de lo que se entiende normalmente por un fractal. Tcnicamente, los fractales son conjuntos cuya e dimensin de Hausdor es fraccionaria. Qu quiere esto decir? Centrndonos en o e a los que se pueden representar en el plano, y teniendo en cuenta que una recta (o una l nea curva) tiene dimensin 1, y el plano dimensin 2, un fractal ser un intrincado o o a subconjunto del plano que no llega a tener supercie no nula, pero que tampoco la longitud es util para medirlo, pues la longitud de cualquier trozo no trivial del fractal es innita. As ni la longitud (medida 1-dimensional) ni la supercie (medida , 2-dimensional) sirven como mtodo util para efectuar mediciones en el fractal; para e ello, puede ser necesario, por ejemplo, utilizar una medida (log 4/ log 3)-dimensional. (De todas formas, es bastante comn que, aunque sepamos que algn objeto es un u u fractal, desconozcamos cul es su dimensin.) En la prctica, los fractales suelen a o a tener estructuras que se repiten por doquier y a cualquier escala (autosimilitudes), ya sea de manera exacta o con un aspecto similar: si nos aproximamos al fractal y lo miramos de mucho ms cerca (como con un potente zoom de una cmara) a a volvemos a ver trozos del fractal que nos recuerdan lo ya observado antes. Y esto, tanto como queramos.
Este art culo aparecer publicado en La Gaceta de la Real Sociedad Matemtica Espaola, ao a a n n 2003.
1

J. L. VARONA

No me resisto a poner un ejemplo extra de la naturaleza. Quizs alguno se do a haya preguntado por qu en los datos sobre pa e ses no suele aparecer la longitud de su costa. Simplemente, porque no tiene sentido! Para medir la costa de un pa s tendr amos que establecer, en algn sentido, con qu detenimiento medimos. No es u e lo mismo medir slo aproximadamente en un mapa, dedicarse a medir con cuidado o la longitud de golfos y cabos, prestar atencin a los contornos rocosos, los granos o de arena, . . . ; dependiendo de nuestro afn, a bamos a obtener cantidades completamente diferentes. Tambin es un fractal la supercie de la tierra, con sus diferentes e elevaciones y depresiones (y, de hecho, se suelen utilizar estructuras fractales para lograr representaciones grcas realistas de montaas). As tampoco tendr sena n , a tido decir cul es la supercie de un pa pero esto tiene remedio: podemos medir a s, la proyeccin sobre la esfera de radio el de la tierra. o Las representaciones grcas de objetos fractales pueden tener gran belleza y a colorido. Esto, unido a la cada vez mayor disponibilidad y potencia de los actuales ordenadores, ha motivado el enorme inters por los fractales en las ultimas dcadas e e del siglo XX y ha impulsado, indudablemente, su estudio terico. Pero las bases de la o teor debidas a Julia, Fatou y Hausdor, son bastante anteriores, de comienzos del a, siglo XX (incluso a nales del siglo XIX ya hab anlisis abstractos de objetos que a a hoy llamamos fractales); lgicamente, ellos no pudieron ver ninguna representacin o o grca de los objetos con los que estaban tratando, ni, posiblemente, se imaginaron a su belleza plstica. En esa poca, la falta de herramientas que permitieran una a e representacin precisa hizo que este tema fuera considerado de inters puramente o e acadmico. e Como hemos sealado, en este art n culo, simplemente, nos dedicaremos a mostrar cmo lograr representaciones grcas de fractales mediante uno de los potentes proo a gramas de clculo simblico disponibles actualmente. Para ello, deberemos escribir a o pequeos mdulos de cdigo basados, lgicamente, en la denicin matemtica (y n o o o o a las propiedades) del fractal que queramos representar. Slo veremos unos pocos o ejemplos, pero los cambios requeridos para lograr dibujar otros tipos de fractales son, muchas veces, sencillos: bsicamente, modicar el algoritmo que dene el a fractal. No podemos pasar por alto que un lenguaje de programacin ordinario es, t o picamente, cientos de veces ms rpido; y la velocidad de cmputo siempre es importana a o te cuando hay que hacer muchos clculos. A este respecto, citemos que [6, 9] usan a BASIC, [7] Logo, y [2] C. Pero los dibujos son mucho ms sencillos de obtener si a empleamos un paquete informtico con amplias capacidades grcas, como Mathea a matica, Maple o Matlab; afortunadamente, la potencia de los ordenadores actuales nos permite hacerlo. Hemos elegido Mathematica [13], pero servir cualquier otro. a Slo dibujaremos fractales en el plano. Adems, nos centraremos en un slo tipo, o a o los relacionados con iteracin de funciones racionales o meromorfas. Pero existen o muchos otros que no analizaremos aqu algunos muy conocidos y de nombre lla, mativo: conjunto de Cantor (a veces designado como polvo de Cantor), copo de nieve de von Koch, tringulo y tapiz de Sierpiski, curvas de Hilbert y de Peano, a n esponja de Sierpiski-Menger; su descripcin est basada en sencillas manipulacion o a nes geomtricas que se repiten sin cesar, lo cual permite conocer su dimensin de e o Hausdor. Otras estructuras fractales estn relacionadas con el caos y los sistemas a dinmicos, como la aplicacin log a o stica y los atractores de Hnon, Pickover y Loe renz (conocidos, en general, como atractores extraos), por citar algunos. Tambin n e

REPRESENTACION GRAFICA DE FRACTALES

existen curvas dragn, biomorfos, rboles fractales, montaas, fractales aleatorios, o a n movimiento browniano, . . . , y podr amos seguir as durante mucho rato. Pueden encontrarse descripciones, algoritmos y representaciones grcas en [2, 6, 7, 9]. a Finalmente, es obligatorio que advirtamos al lector de que, si su unico inters e es lograr bonitos dibujos, existen multitud de programas especializados en ello, algunos de ellos joyas gratuitas. Estos programas pueden ser rpidos, ecaces y a altamente congurables; adems, a veces incorporan tcnicas de suavizado que dan a e un mejor aspecto a los grcos. Pero, a juicio del que escribe, no nos proporcionan a todo el control, exibilidad y capacidad de experimentacin que podemos conseguir o gracias a las capacidades grcas y de programacin incorporadas en los potentes a o programas de clculo. No citaremos ninguno de ellos; quien desee alguno, tiene todo a Internet a su disposicin para encontrarlos. Por supuesto, tambin podemos hallar o e preciosas imgenes con fractales de todo tipo, previamente representados por ala guna otra persona (aunque, en general, sin que nosotros podamos saber cmo, ni o qu signicado matemtico tienen sus magn e a cos colores, ni siquiera a qu estruce tura fractal corresponden). El conjunto de Mandelbrot El conjunto de Mandelbrot, que denotaremos como M, es, sin duda, el conjunto fractal ms conocido. Los primeros dibujos suyos son debidos a Brooks y Matelski a en 1978, en conexin con grupos discretos; poco despus, fue Mandelbrot quien o e comenz a ocuparse de l. Para describirlo matemticamente, basta denir su como e a plementario: para cada punto c del plano complejo C, decimos que c M si el / proceso iterativo 2 z0 = c, zn = zn1 + c produce una sucesin {zn } tal que |zn | . Como curiosidad, comentemos o n=0 algunas propiedades topolgicas: M es compacto, simplemente conexo y conexo; o este ultimo es un notable resultado probado por Douady y Hubbard en 1982. Pero no haremos ms hincapi en ello, sino que nuestro objetivo es poder dibujarlo. a e En primer lugar, observemos que su denicin directa no nos sirve para represeno tar grcamente M: podr a amos necesitar innitas iteraciones. Pero llega en nuestra ayuda una importante propiedad (cuya demostracin es bastante sencilla): si, a paro tir de z0 = c, aparece un zn con |zn | 2, entonces c M. As en la prctica, no / , a representamos M, sino algo parecido: jamos un nmero mximo de iteraciones y, u a para cada punto c C, suponemos que c est en M si, al iterar partiendo de c, a an no ha aparecido ningn zn de mdulo 2 o mayor. u u o Por otra parte, segn la denicin, el conjunto de Mandelbrot es, slo, un subu o o conjunto del plano. Es decir, un punto del plano est en M o no lo est. As a a , podr amos pintar en negro los puntos de M y en blanco el resto. Pero esto, obviamente, no introduce ningn colorido. Cmo lograrlo? De nuevo acudimos para ello u o a la propiedad antes descrita: a un punto c le asignamos el color negro cuando hemos decidido que est en M; en caso contrario, le asignamos un color o un nivel de a gris distinto dependiendo del nmero de iteraciones que han sido efectuadas hasta u que ha aparecido un |zn | 2. Veamos como programar Mathematica para llevar a cabo esta tarea. El mtodo e iterativo lo denimos mediante el siguiente bloque de cdigo: o iterMandel[x_, y_, maxIter_] := Block[{c, z, contador}, c = x + I*y; z = c; contador = 0;

J. L. VARONA

While[(Abs[z] < 2.0) && (contador < maxIter), z = z*z + c; contador++ ]; Return[contador] ] Obsrvese que esta rutina devuelve como resultado el nmero de itee u raciones efectuadas; si slo nos interesase saber si un punto est o o a no en el conjunto de Mandelbrot, cambiar amos Return[contador] por If[contador >= maxIter, Return[1.0], Return[0.0]]. Entonces, tras jar maxIter, para dibujar el conjunto de Mandelbrot bastar que a utilicemos la orden DensityPlot aplicada a la funcin iterMandel (en realidad, o como queremos que M aparezca en negro, representaremos -iterMandel). Elegiremos un cuadrado del plano, que aqu caracterizamos mediante su centro y longitud del lado. Adems, permitiremos elegir la resolucin (nmero de puntos) empleada a o u para dibujar M (lgicamente, una mayor resolucin requiere ms tiempo de clculo o o a a y ms consumo de memoria; la orden // Timing tiene como objetivo, unicamente, a mostrarnos el tiempo empleado). As denimos , mandelbrot[centro_, lado_, maxIter_, resolucion_] := Block[ {xxMin = centro[[1]]-lado/2, xxMax = centro[[1]]+lado/2, yyMin = centro[[2]]-lado/2, yyMax = centro[[2]]+lado/2}, DensityPlot[-iterMandel[x, y, maxIter], {x, xxMin, xxMax}, {y, yyMin, yyMax}, PlotPoints -> resolucion, Mesh -> False, PlotRange -> {-maxIter, 0}, ColorFunction -> GrayLevel ] ] // Timing De este modo, por ejemplo, mandelbrot[{-0.5, 0.0}, 3, 30, 400] genera el dibujo mostrado en la gura 1.
1.5 -0.05 1 -0.1 0.5 0 -0.5 -1 -1.5 -2 -0.15 -0.2 -0.25 -0.3

-1.5

-1

-0.5

0.5

-0.95 -0.9 -0.85 -0.8 -0.75 -0.7

Figura 1. Conjunto de Mandelbrot.

Figura 2. Detalle.

En la prctica, para lograr mucha mayor velocidad, es conveniente que usea mos una versin previamente compilada de la funcin iterMandel. Esto permite a o o

REPRESENTACION GRAFICA DE FRACTALES

Mathematica evaluarla mucho ms rpidamente (en nuestro ejemplo, el tiempo se a a divide, aproximadamente, por un factor 10). El cdigo alternativo para ello es el o siguiente: iterMandel = Compile[ {{x, _Real}, {y, _Real}, {maxIter, _Integer}}, Block[{c = x + I*y, z = x + I*y, contador = 0}, While[(Abs[z] < 2.0) && (contador < maxIter), z = z*z + c; contador++ ]; Return[contador] ] ] En el conjunto de Mandelbrot, el fractal es su frontera; se desconoce su dimensin de Hausdor. Como es caracter o stico de todos los fractales, la frontera tiene multitud de recovecos. Si nos acercamos a ella, siguen apareciendo extraas formas, n muchas de ellas semejantes al conjunto original. Para hacerlo con nuestro programa, basta tomar las coordenadas de un punto1 cercano a la frontera e indicar el tamao n deseado para el lado del nuevo cuadrado que se debe representar. Por supuesto, esto podemos hacerlo tantas veces como deseemos. Como ejemplo, en la gura 2 hemos representado mandelbrot[{-0.82, -0.19}, 0.3, 40, 400]. Si jamos maxIter y resolucion, y elegimos un centro y un lado iniciales, podr amos denir una funcin zoom[centro_, factor_] que se encargara de automatizar el proceso, calo culando el nuevo lado y llamando ella misma a la funcin mandelbrot que realiza o el dibujo. As bastar con que, cada vez, le suministrramos las coordenadas del , a a punto cuyo entorno queremos observar con ms detalle. a En este art culo slo mostramos guras en escala de grises pero, en un ordenador, o no es dif generar dibujos en color que son, indudablemente, mucho ms llamaticil a vos. Para conseguir grcos coloreados, hay que indicarle a la funcin mandelbrot a o que lo haga. Para ello, en lugar de asignar ColorFunction -> GrayLevel, que proporciona niveles de gris (y que, en realidad, ni siquiera es necesario, pues es la opcin o que DensityPlot toma por defecto), hay que utilizar otra funcin de color. As a o , cada punto le asignar amos un color dependiente del nmero de iteraciones efecu tuadas, es decir, del valor contador devuelto por iterMandel. Aqu dos tcnicas , e usuales son las siguientes: (a) utilizar un nmero jo k de colores y asignar el color u segn sea el valor de contador mdulo k; (b) introducir un degradado continuo u o (variando con contador) entre dos colores extremos. Con Mathematica, podemos denir la funcin de color a medida (ms adelante, en este mismo art o a culo, hay un ejemplo; y tambin en [12]) pero, en todo caso, un mtodo sencillo de obtener e e colores (sin preocuparnos cules) es usar ColorFunction -> Hue. a Es sencillo representar proyecciones en tres dimensiones del conjunto de Mandelbrot: asignamos la altura en funcin del nmero de iteraciones realizadas. Un o u programa que lleva a cabo esta tarea es el siguiente: mandelbrot3D[centro_, lado_, maxIter_, resolucion_] := Block[
1En Mathematica, para conocer las coordenadas de un punto de un grco se procede del a siguiente modo: Tras seleccionar el grco, con la tecla control (en un PC) o comando (en un a Macintosh) pulsada, hacemos clic con el ratn en el punto deseado. As sus coordenadas apareo , cen escritas en la parte inferior izquierda de la ventana; adems, se pueden copiar utilizando el a correspondiente comando del men de Mathematica. u

J. L. VARONA

{xxMin = centro[[1]]-lado/2, xxMax = centro[[1]]+lado/2, yyMin = centro[[2]]-lado/2, yyMax = centro[[2]]+lado/2}, Plot3D[iterMandel[x, y, maxIter], {x, xxMin, xxMax}, {y, yyMin, yyMax}, PlotPoints -> resolucion, Mesh -> False, Boxed -> False, Axes -> False, PlotRange -> {0, maxIter} ] ] // Timing En la gura 3 podemos ver mandelbrot3D[{0.1, -0.75}, 0.6, 25, 200]. Aunque no lo mostraremos aqu tambin son espectaculares las proyecciones del con, e junto de Mandelbrot sobre la supercie de una esfera (la esfera de Riemann). La imaginacin de los matemticos ha dado lugar a numerosas ideas que han proporo a cionado magn cos grcos. a

Figura 3. Conjunto de Mandelbrot en 3 dimensiones. Existen muchos fractales basados en ligeras modicaciones de la denicin del o conjunto de Mandelbrot, y que dan lugar a grcos distintos; por ejemplo, cama biando z 2 por otra potencia de z (vase [1]). Recientemente, en [4] se ha descrito y e estudiado una nueva modicacin. Con nuestros programas, podemos explorarlos o sin dicultad. Conjuntos de Julia Denotemos C al conjunto C con el punto del innito, esto es, la esfera de Riemann, con su mtrica habitual. Dada una funcin f : C C , para cada e o z0 C podemos denir el mtodo iterativo zn = f (zn1 ) = f n (z0 ), donde f n e denota f compuesta consigo mismo n veces. Intuitivamente, describamos qu es el conjunto de Julia de f , que denotaremos e J(f ). Al tomar dos puntos iniciales prximos, z0 z0 , nos podemos preguntar si, o tras efectuar iteraciones partiendo de ellos, los sucesivos valores zn y zn tambin e permanecen prximos (es decir, zn zn ?). Si la respuesta es negativa decimos que o z0 est en el conjunto de Julia de f ; y si es armativa, que z0 est en el conjunto de a a Fatou de f . As en J(f ) el mtodo iterativo es sensible a las condiciones iniciales: , e

REPRESENTACION GRAFICA DE FRACTALES

aparece caos. Aunque no nos preocuparemos de ello en lo que sigue, con rigor matemtico, el conjunto de Fatou de f es el subconjunto abierto maximal de C a en el que la familia de funciones {f n } es equicontinua; y el conjunto de Julia de n=0 f es su complementario en C . Salvo para funciones f muy sencillas (por ejemplo, transformadas de Mbius o f (z) = (az + b)/(cz + d), ad bc = 0), el conjunto de Julia suele ser no vac o. Habitualmente, adems, es un fractal (esto no siempre es as por ejemplo, si f (z) = a : z 2 , J(f ) es la circunferencia unidad; y lo mismo para f (z) = z 2 , con || = 1). Esto es cierto, en particular, para cada funcin cuadrtica fc (z) = z 2 + c con o a c C \ {0}. Veamos, en primer lugar, cmo representar grcamente los correspono a dientes conjuntos de Julia Jc = J(fc ). En realidad, es imposible que conozcamos Jc exactamente, luego en la prctica dibujaremos algo relacionado con ellos. a No es dif comprobar que, para z0 sucientemente grande, la sucesin {zn } cil o n=0 converge a innito (recordemos que estamos usando la mtrica de C ). Todos e estos puntos, que pertenecen al conjunto de Fatou (el complementario al de Julia), decimos que estn en la componente del innito, F . As lo que intentaremos a , representar es el complementario de F . Se puede demostrar que la frontera de este conjunto es, precisamente, el conjunto de Julia. En otras palabras,
n Jc = J(fc ) = Fr{z : fc (z) }.

(Debemos recalcar que esta propiedad no es cierta para funciones y conjuntos de Julia J(f ) cualesquiera, pero s cuando la funcin f es un polinomio.) o Los conjuntos de Julia asociados a las funciones fc (z) = z 2 + c estn muy relaa cionados con el conjunto de Mandelbrot: Jc es conexo si y slo si c M (de hecho, o esto se toma, a veces, como denicin alternativa del conjunto de Mandelbrot). o Cuando c M, Jc es totalmente disconexo y sin puntos aislados. / De nuevo, nuestro objetivo es representar los conjuntos de Julia Jc con Mathe n matica. En realidad, dibujaremos el conjunto relleno Jc = {z : fc (z) }, no su frontera. Puede comprobarse que Jc {z : |z| mc } con mc = 1/2 + 1/4 + |c|. n As para cada punto z, si |fc (z)| es bastante grande (mayor que mc ), entonces , z Jc . Pero, por otra parte, y como nos ocurr con M, podr / a amos necesitar in nitas iteraciones para poder asegurar que z Jc . As que, en la prctica, nos a tendremos que contentar con un nmero mximo de iteraciones y ver si en ese u a nmero de iteraciones ha aparecido ya un valor sucientemente grande. Realmente, u no es necesario que usemos mc como valor de escape; podr amos haber cogido otro nmero mayor. u Como es habitual, para cada punto z procedemos del siguiente modo: le asignamos color negro si, en el nmero de iteraciones prejado, no se ha alcanzado u n ningn |fc (z)| > mc ; en otro caso, distintos colores o niveles de gris, dependiendo u n del primer n (lo que se suele denominar tiempo de escape) para el que |fc (z)| > mc . Todo esto, en un cuadrado centrado en el origen y de lado algo mayor que 2mc . Veamos cmo hacerlo con Mathematica; en principio, emplearemos niveles de o gris. El mtodo iterativo se implementa del siguiente modo (mostramos ya unicae mente la versin compilada): o iterJuliaCuadratico = Compile[ {{c, _Complex}, {x, _Real}, {y, _Real}, {maxIter, _Integer}}, Block[{z = x + y*I, mc = 0.5 + Sqrt[0.25 + Abs[c]], contador = 0},

J. L. VARONA

While[(Abs[z] <= mc) && (contador < maxIter), z = z*z + c; contador++ ]; Return[contador] ] ] Y la rutina que permitir efectuar los dibujos es a juliaCuadratico[c_, maxIter_, resolucion_] := Block[ {semilado = Ceiling[0.5 + Sqrt[0.25 + Abs[c]]], xxMin = -semilado, xxMax = semilado, yyMin = -semilado, yyMax = semilado}, DensityPlot[-iterJuliaCuadratico[c, x, y, maxIter], {x, xxMin, xxMax}, {y, yyMin, yyMax}, PlotPoints -> resolucion, Mesh -> False ] ] // Timing En las guras 4 y 5 podemos ver juliaCuadratico[-.3-.5I, 30, 400] y juliaCuadratico[-.75+.8I, 30, 400]. Los valores de c ms interesantes son los a cercanos a la frontera del conjunto de Mandelbrot, pues es all cuando el conjunto Jc pasa, bruscamente, de ser conexo a ser completamente disconexo.
2 2

-1

-1

-2 -2

-1

-2 -2

-1

Figura 4. Conjunto de Julia conexo.

Figura 5. Conjunto de Julia totalmente disconexo.

Obviamente, podr amos introducir en el programa las modicaciones necesarias para dibujar otras zonas; en particular, para poder observar con ms detalle el trozo a que deseemos. Hasta ahora, aunque la denicin de conjuntos de Julia que hemos dado es o bastante general, slo hemos dibujado los correspondientes a funciones cuadrticas o a fc (z) = z 2 + c. Pero, por ejemplo, tiene perfecto sentido hablar del de Julia J(f ) de una funcin f : C C racional o meromorfa. La dicultad radica en que, para dibujar o J(fc ), nos hemos servido de propiedades matemticas suyas, y que no son vlia a das para conjuntos de Julia J(f ) generales (parece claro que no es posible utilizar

REPRESENTACION GRAFICA DE FRACTALES

directamente la denicin). As para representar grcamente conjuntos de Juo , a lia asociados a otro tipo de funciones, habr que emplear otros mtodos grcos, a e a basados en diferentes propiedades de los correspondientes conjuntos de Julia. Cuando f es una funcin racional, puede demostrarse que, para cualquier z o J(f ), J(f ) = n0 f n ({z}) 1 donde f denota la antiimagen de un conjunto; y f n , efectuar n veces la misma iteracin inversa. En la prctica, si no conocemos ningn z J(f ), se suele tomar o a u z C cualquiera, se itera hacia atrs bastantes veces y se considera que el nuevo a z que as se obtiene est ya en J(f ). Ahora, bastar tomar un N jo (grande), a a encontrar sucientes puntos de 0nN f n ({z}) y representarlos grcamente. En a cada uso de f 1 , no es imprescindible encontrar la antiimagen completa: podemos incluso contentarnos con tomar un solo punto cada vez. Aunque no lo haremos, esto puede implementarse con Mathematica del siguiente modo: denimos una lista, a la que le vamos aadiendo los puntos con AppendTo, n y nalmente los dibujamos usando ListPlot. En particular, el algoritmo descrito es un mtodo alternativo de dibujar los e conjuntos de Julia cuadrticos Jc . Adems, el grco que se obtiene es el de Jc , a a a no el de Jc . Ntese aqu que el mtodo que hab o e amos usado para generar Jc no es util si queremos dibujarlo segn su denicin matemtica pura (sin niveles de gris, u o a slo blanco y negro) cuando c M: como estos conjuntos de Julia son totalmente o / disconexos, es comn que, cuando Mathematica (internamente) da valores a puntos u para usar DensityPlot, no se tope con puntos del fractal; y no dibuja nada. En cambio, el mtodo de las iteraciones inversas s que sirve para representar Jc . e Tambin se han estudiado propiedades que permiten representar los conjuntos e de Julia asociados a algunas funciones trascendentes. En concreto, para funciones del tipo cos(z), sen(z), exp(z), siendo C una constante. As se tiene , J(f ) = {z : | Im(f n (z))| }, y J(f ) = {z : Re(f n (z)) }, f (z) = exp(z). Con estas ideas, vamos a usar Mathematica para dibujar el conjunto de Julia de la funcin f (z) = (1 + 0.4i) sen(z). En primer lugar, denimos la funcin, la o o condicin de escape, y el mtodo iterativo, como funciones compiladas: o e f = Compile[{{z, _Complex}}, (1. + 0.4I)Sin[z]]; testNoEscape = Compile[{{z, _Complex}}, (Abs[Im[z]] < 50)]; iterJulia = Compile[ {{x, _Real}, {y, _Real}, {maxIter, _Integer}}, Block[{z = x + I*y, contador = 0}, While[testNoEscape[z] && (contador < maxIter), z = f[z]; contador++ ]; Return[contador] ], {{f[_], _Complex}, {testNoEscape[_], True | False}} ] Aunque los grcos que aparecen en este art a culo son en blanco y negro, aqu con , un poco ms de esfuerzo, mostraremos una manera de dibujar los correspondientes a f (z) = cos(z) o f (z) = sen(z)

10

J. L. VARONA

conjuntos de Julia con colores. Para poder llamar a los colores por su nombre, cargamos el paquete << GraphicsColors As podemos denir , coloresArcoIris = {Red, Orange, Yellow, Green, Blue, Indigo, Violet} Entonces, la funcin que se encargar de generar los grcos es o a a juliaArcoIris[centro_, lado_, maxIter_, resolucion_] := Block[ {$Messages = {}, (* evita mensajes de underflow, etc. *) xxMin = centro[[1]]-lado/2, xxMax = centro[[1]]+lado/2, yyMin = centro[[2]]-lado/2, yyMax = centro[[2]]+lado/2}, coloridoArcoIris[p_] := If[(p == maxIter), RGBColor[0., 0., 0.], coloresArcoIris[[Mod[p, 7] + 1]] ]; DensityPlot[iterJulia[x, y, maxIter], {x, xxMin, xxMax}, {y, yyMin, yyMax}, PlotPoints -> resolucion, Mesh -> False, PlotRange -> {0, maxIter}, ColorFunction -> coloridoArcoIris, ColorFunctionScaling -> False ] ] // Timing En la gura 6 mostramos julia[{0., 0.}, 10, 20, 400], siendo julia una rutina anloga a juliaArcoIris, pero en la que se ha eliminado la denicin de la a o funcin de color coloridoArcoIris, as como las asignaciones a ColorFunction o y ColorFunctionScaling (y aadido un cambio de signo para que el conjunto de n Julia salga en negro). En la gura 7 vemos una ampliacin del cuadrado de centro o {1.2, 0.9} y lado 1.5. En [5, 6, 2] se pueden encontrar llamativos dibujos en color de este tipo de conjuntos de Julia.

1.6 4 1.4 2 1.2 1 0 0.8 -2 0.6 0.4 -4 0.2 -4 -2 0 2 4 0.6 0.8 1 1.2 1.4 1.6 1.8

Figura 6. Conjunto de Julia de (1 + 0.4i) sen(z).

Figura 7. Detalle.

REPRESENTACION GRAFICA DE FRACTALES

11

Al generar estos grcos, es interesante tener en cuenta que, debido a la extrema a sensibilidad sobre las condiciones iniciales, pequeos cambios en los parmetros n a del fractal pueden producir resultados sorprendentemente distintos. Por otra parte, ntese que, si ponemos una condicin de escape que no es la que corresponde, lo o o que aparece puede no tener nada que ver con el conjunto de Julia. Pero, y sobre todo si estamos utilizando colores, es habitual que quede un bonito dibujo. Fractales asociados a metodos iterativos de resolucion de ecuaciones Sea g una funcin g : R R y una ra es decir, g() = 0. Es bien conocido que, o z, si tomamos x0 cerca de , y bajo ciertas condiciones de las que no nos preocuparemos aqu el mtodo de Newton (o de las tangentes, por su interpretacin geomtrica) , e o e xn+1 = xn g(xn ) , g (xn ) n = 0, 1, 2, . . .

genera una sucesin {xn } que converge a . o n=0 En 1879, Cayley trat de usar el mtodo para encontrar ra o e ces de funciones complejas g : C C. Partiendo de z0 C e iterando g(zn ) zn+1 = zn , n = 0, 1, 2, . . . , g (zn ) l buscaba bajo qu condiciones y hacia qu ra de g converg cada sucesin e e e z a o {zn } . En otras palabras, intentaba identicar la cuenca de atraccin de cada o n=0 ra El problema es sencillo cuando g es un polinomio cuadrtico, pero muy comz. a plicado en el caso general, incluso para polinomios cbicos (lo cual hizo que Cayley u renunciara a continuar tras varios aos de intentos). Ahora sabemos que la frontera n entre las cuencas de atraccin tiene naturaleza fractal. Esta frontera es el conjunto o de Julia de la funcin f (z) = z g(z)/g (z). o A este respecto, el ejemplo ms conocido es el de las cuencas de atraccin de las a o tres ra e2ki/3 , k = 0, 1, 2, de la funcin g(z) = z 3 1. Existen multitud de dibuces o jos generados por ordenador que nos muestran la complejidad de estas intrincadas regiones. Generalmente, existen tres estrategias para generar estos grcos: a (a) A cada punto z se le asigna un color (o un nivel de gris) dependiendo a qu ra de g converge el mtodo de Newton que parte de z. Y marcamos e z e el punto como negro (por ejemplo) si el mtodo no converge. Por supuesto, e deberemos jar un nmero mximo de iteraciones permitido, y con qu preu a e cisin se desea alcanzar las ra o ces. De este modo, se distinguen las cuencas de atraccin de las ra o ces. (b) En lugar de asignar el color segn la ra alcanzada por el mtodo, lo u z e asignamos segn el nmero de iteraciones efectuadas hasta alcanzarla con u u la precisin prejada. Esto no genera un conjunto de Julia, pero tambin o e aparecen bonitos grcos. a (c) Esta tercera estrategia es combinacin de las dos anteriores. Asignamos un o color para cada ra y hacemos que sea ms claro o ms oscuro segn el z, a a u nmero de iteraciones efectuadas hasta alcanzar la ra con la precisin u z o requerida. Como antes, usamos negro si el mtodo no converge. Los die bujos generados de esta manera son, en opinin del que escribe, los ms o a interesantes; y son fciles de producir en una pantalla de ordenador. a

12

J. L. VARONA

Aqu slo seguiremos la primera estrategia y, adems, con niveles de gris. Para ver o a dibujos similares con colores, junto con el cdigo en Mathematica para generarlos, o consltese [12]. u Antes de continuar, no podemos pasar por alto que existen otros mtodos itee rativos para hallar ra ces de funciones. El de Newton es el ms conocido, pero hay a muchos ms: de nuevo en [12] se muestran bastantes de ellos, as como referencias a de dnde estudiarlos con detalle. o Veamos cmo programar todo esto con Mathematica. Lo haremos de modo o que sea sucientemente sencillo de usar para una funcin y un mtodo de reo e solucin de ecuaciones genricos. E intentando, adems, utilizar funciones como e a piladas, para aumentar la velocidad de ejecucin. En primer lugar, denimos o ejecutarRutinasRaices, que tiene como argumento una funcin genrica g. Cuano e do la usemos, se encargar de hallar las ra a ces de la funcin y denir la rutina que o comprueba si un complejo z es una ra (con aproximacin eps) o no. z o ejecutarRutinasRaices[g_] := Block[{}, hallaRaices = NSolve[g[z] == 0, z]; numRaices = Length[hallaRaices]; Do[raiz[k] = hallaRaices[[k, 1, 2]], {k, 1, numRaices}]; posicionRaiz = Compile[{{z, _Complex}}, Block[{eps = 10.0^(-3), k, numLocal = numRaices}, For[k = 1, k <= numLocal, k++, If[Abs[z - raiz[k]] < eps, Return[k]] ]; Return[0] ], {{raiz[_], _Complex}} ] ] Ntese que, para hallar las ra o ces, usamos NSolve. Esto permite hallar todas las ra ces de un polinomio o una funcin racional; pero si la funcin es de otro tipo, o o las ra no se pueden calcular as y hay que modicar el programa. (Para aplicar ces la estrategia (b) antes descrita, ni siquiera es necesario conocer las ra ces. Si no se puede comparar directamente con la ra exacta, una ra aproximada de g se z z identica con las condiciones de parada habituales: |g(zn )| < o |zn+1 zn | < .) A continuacin, denimos la rutina que (cuando sea llamada) calcula la funcin o o iteradora f asociada a una funcin g y un mtodo metodo genricos (obsrvese que o e e e aprovechamos las posibilidades simblicas de Mathematica para simplicar): o calcularFuncionIteradora[g_, metodo_] := Block[{}, f = Compile[{{z, _Complex}}, Evaluate[Simplify[metodo[g, z]]] ] ] Y ste es el proceso iterativo que decide a qu ra converge cada punto (o que no e e z converge a ninguna) tras aplicar sucesivas veces f: iterRaices = Compile[{{x, _Real}, {y, _Real}, {maxIter, _Integer}}, Block[{z, contador, r},

REPRESENTACION GRAFICA DE FRACTALES

13

z = x + y*I; contador = 0; r = posicionRaiz[z]; While[(r == 0) && (contador < maxIter), contador++; z = f[z]; r = posicionRaiz[z] ]; Return[r] ], {{f[_], _Complex}, {posicionRaiz[_], _Integer}} ] Con todo esto, el fractal se dibujar invocando la siguiente rutina: a fractalRaices[centro_, lado_, maxIter_, resolucion_] := Block[{$Messages = {}, xxMin = centro[[1]]-lado/2, xxMax = centro[[1]]+lado/2, yyMin = centro[[2]]-lado/2, yyMax = centro[[2]]+lado/2}, DensityPlot[iterRaices[x, y, maxIter], {x, xxMin, xxMax}, {y, yyMin, yyMax}, PlotPoints -> resolucion, Mesh -> False, PlotRange -> {0, numRaices} ] ] // Timing
2 1 1

0.8

0.6 0 0.4

-1

0.2

0 -2 -2 -1 0 1 2 -1.2 -1 -0.8 -0.6 -0.4 -0.2

Figura 8. Mtodo de Newton aplicae do a g(z) = z 4 + 2z 1.

Figura 9. Detalle del mtodo de Hae lley.

Concluimos mostrando un par de ejemplos de uso. Con g[z_] := z^4 + 2z - 1; metodo[g_, z_] := z - g[z]/g[z]; (* Newton *) ejecutarRutinasRaices[g]; calcularFuncionIteradora[g, metodo]; fractalRaices[{0, 0}, 4, 25, 400] conseguimos el grco de la gura 8 (obsrvese que Mathematica se deber encargar a e a de efectuar, simblicamente, las derivadas). Y con o metodo[g_, z_] := z - 1/(g[z]/g[z] - g[z]/(2g[z])); (* Halley *)

14

J. L. VARONA

calcularFuncionIteradora[g, metodo]; fractalRaices[{-0.7, 0.5}, 1.2, 25, 400] (como es la misma funcin g, ya no hace falta reevaluar las rutinas relacionadas o con las ra ces), la gura 9. Referencias
[1] C. Alexander, I. Giblin y D. Newton, Symmetry groups on fractals, The Mathematical Intelligencer 14 (1992), n.o 2, 3238. [2] J. Barrallo Calonge, Geometr fractal: Algor a tmica y representacin, Anaya Multimedia, o Madrid, 1993. [3] A. F. Beardon, Iteration of rational functions, Springer-Verlag, Nueva York, 1991. [4] M. Benito, J. M. Gutierrez y V. Lanchares, El fractal de Chicho, en Margarita Mathematica en memoria de Jos Javier (Chicho) Guadalupe Hernndez (L. Espa ol y J. L. Varona, e a n eds.), pp. 247254, Servicio de Publicaciones de la Universidad de La Rioja, Logro o, 2001. n [5] R. L. Devaney, Film and video as a tool in mathematical research, The Mathematical Intelligencer 11 (1989), n.o 2, 3338. [6] R. L. Devaney, Chaos, fractals, and dynamics, Addison-Wesley, Nueva York, 1990. [7] G. A. Edgar, Measure, topology, and fractal geometry, Springer-Verlag, Nueva York, 1990. [8] K. Falconer, Techniques in fractal geometry, John Wiley & Sons, Chichester, 1997. [9] M. de Guzman, M. A. Mart M. Moran y M. Reyes, Estructuras fractales y sus aplican, ciones, Labor, Barcelona, 1993. [10] B. Mandelbrot, Los objetos fractales, Tusquets, Barcelona, 1987. [11] H. O. Peitgen y P. H. Richter, The beauty of fractals, Springer-Verlag, Nueva York, 1986. [12] J. L. Varona, Graphic and numerical comparison between iterative methods, The Mathematical Intelligencer 24 (2002), n.o 1, 3746. [13] S. Wolfram, The Mathematica Book, 4.a ed., Wolfram Media/Cambridge University Press, Champaign, 1999. Departamento de Matematicas y Computacion, Universidad de La Rioja, Edificio J. L. Vives, Calle Luis de Ulloa s/n, 26004 Logrono, Spain E-mail address: jvarona@dmc.unirioja.es URL: http://www.unirioja.es/dptos/dmc/jvarona/hola.html

You might also like