Cálculo Computacional Tema III Fractales La geometría tradicional (euclídea) se encarga de las propiedades y de las mediciones de objetos tales como puntos, líneas, planos y volúmenes. Sin embargo, existen otros objetos geométricos irregulares con infinitas singularidades. Fractales geométricos clásicos (sistemas de funciones iteradas) El polvo de Cantor se inicia con un segmento lineal conocido como el iniciador. Este se divide en tres segmentos menores de la misma longitud, el central de los cuales se extrae y se elimina. Este proceso se repite indefinidamente, y al final se habrá producido el polvo de Cantor. Curva de Koch: se forma partiendo de un segmento el cual es dividido en tres partes iguales. La parte central se sustituye por dos segmentos del mismo tamaño que el eliminado. Sucesivamente se repite el mismo proceso por cada segmento formado. La longitud de esta curva evoluciona de acuerdo a la siguiente sucesión: 1, 4/3, 16/9, 64/27, 256/81.... Dado que la sucesión anteriormente indicada no converge hacia ningún valor, estamos ante una curva de longitud infinita. De izquierda a derecha: segunda, tercera y cuarta iteración del cuadrado, o alfombra, de Sierpinski. Conjuntos de Julia (Gaston Julia,1893-1978) Los conjuntos de Julia son conjuntos de puntos (x, y) en el plano. Para definirlos, considera la aplicación: zn+1 = zn2 + c (1) siendo z y c números complejos, z=x+iy, c=a+by. La condición inicial (x0, y0) pertenece al conjunto de Julia con parámetros (a, b) si la trayectoria de los puntos (xn, yn) con condición inicial (x0, y0) no se aproxima a infinito cuando n se hace grande. Para construir estos conjuntos se procederá según se indica a continuación: i) Se fija (a, b) con una de estas tres posibilidades: (a, b) = (0,32, 0,042), (−0,17, 0,78) y (0,38, 0,32). ii) Se toman condiciones iniciales (x0, y0) situadas sobre una malla [−1,3, 1,3] x [−1,3, 1,3] discretizada en 1000 x 1000 puntos. Para cada condición inicial (x0, y0) se utiliza la aplicación de arriba (ec. (1)) hasta N = 1000 iteraciones. Esto generará una trayectoria para cada condición inicial. iii) Si en algún n < N la distancia del punto (xn, yn) al origen es mayor que dos, se sabe que la trayectoria viaja al infinito y entonces paramos la iteración, ya que la condición inicial (x0, y0) no pertenece al conjunto. iv) Si para ningún n < N la distancia al origen ha sido mayor que dos, el punto (x0, y0) pertenece al conjunto, y lo pintamos en un fichero de salida. El conjunto de los puntos escritos sobre el fichero de salida constituye el conjunto de Julia con parámetros (a, b). Se representarán estos puntos gráficamente. Codigo fuente: program julia !Eduardo Elizalde !14 diciembre 2009 !este programa pinta el conjunto de Julia implicit none complex::z complex, parameter:: c=(0.32, 0.042) !otros valores: (-0.17, 0.78) y (0.38, 0.32) real::x,y,hx,hy integer::i open(1,file='julia.res') hx=(1.3-(-1.3))/1000 hy=(1.3-(-1.3))/1000 do x=-1.3,1.3,hx do y=-1.3,1.3,0.0026 z=x*(1.0,0.0)+y*(0.0,1.0) do i=1,1000 z=z**2+c if (abs(z)>2.0) exit end do if (abs(z)<2.0) then write(1,"(f7.4,4x,f7.4)") x,y end if end do end do close(1) end program Fractal a partir del algoritmo de Mandelbrot Como en el conjunto de Julia, el de Mandelbrot es un conjunto de puntos (a, b) en el plano tal que, para a y b fijos, el punto (a, b) pertenece al conjunto de Mandelbrot si la trayectoria de los puntos (xn, yn) con condición inicial (x0, y0) = (0, 0) no se aproxima a infinito cuando n se hace grande al aplicar la transformación dada por la ec. (1) Para construir este conjunto se puede proceder según se indica a continuación: i) Se toma un punto (a, b) del plano en la región [−1,5, 0,6] x [−1, 1] discretizado en 1000 x 1000 puntos. ii) Para ese (a, b) se itera la aplicación con condición inicial (x0, y0) = (0, 0) hasta N = 1000 iteraciones. iii) Si para algún n < N la distancia del punto (xn, yn) al origen es mayor que dos, se sabe que la trayectoria viaja al infinito y entonces se para la iteración, ya que el punto (a, b) no pertenece al conjunto. iv) Si para ningún n < N la distancia al origen ha sido mayor que dos, el punto (a, b) pertenece al conjunto, y se pinta en un fichero de salida. El conjunto de los puntos escritos sobre el fichero de salida constituye el conjunto de Mandelbrot, que se puede representar gráficamente. Codigo fuente: program mandelbrot !Eduardo Elizalde !este programa pinta el conjunto de Mandelbrot real(8):: xn,yn,xn1,yn1 real(8):: a_ini,a_fin,b_ini,b_fin,a,b,ha,hb integer k,num_a,num_b,iteraciones open(unit=1,file="mandelbrot.res") a_ini=-1.5 a_fin=0.6 num_a=1000 b_ini=-1 b_fin=1 num_b=1000 iteraciones=1000 ha=(a_fin-a_ini)/num_a hb=(b_fin-b_ini)/num_b do a=a_ini, a_fin,ha do b=b_ini,b_fin,hb xn=0.0 yn=0.0 do k=1,iteraciones xn1=xn*xn-yn*yn+a yn1=2.0*xn*yn+b xn=xn1 yn=yn1 if ((xn*xn+yn*yn)>2.0)exit end do if (k>=iteraciones) then write(1,*) a,b end if end do end do print*, 'ya esta el conjunto de Mandelbrot' close(1) end program mandelbrot El helecho de Barnsley El sistema de funciones iteradas (IFS) es un método creado por M. Barnsley, basándose en el principio de autosemejanza. En un fractal IFS siempre se puede encontrar una parte de la figura que guarda una relación de semejanza con la figura completa. Esa relación es a menudo muy difícil de apreciar, pero en el caso del helecho es bastante clara: cualquier hoja es una réplica exacta de la figura completa. El helecho de Barnsley es un fractal de apariencia semejante a una forma natural y que está representado únicamente por cuatro transformaciones lineales. Para construirlo, hay que seleccionar un número aleatorio r entre 0 y 1 y realizar la transformación indicada partiendo de un valor dado (x1,y1) Importante: para generar un número pseudoaleatorio, se debe ejecutar la siguiente secuencia: REAL:: r INTEGER::i,n,count INTEGER, DIMENSION(1)::seed ………………………………. CALL SYSTEM_CLOCK(Count) Seed = Count DO i=1,n CALL RANDOM_SEED (Put=seed) CALL RANDOM_NUMBER (r) …………………………………………… …………………………………………….. CALL RANDOM_SEED(Get=seed) END DO