Cálculo Computacional Tema III Fractales

Anuncio
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
Descargar