Início
Casos Práticos
Vamos de seguida, estudar um caso concreto de um fractal determinístico, que servirá não só para mostrar como os anteriores conceitos se manifestam na prática, como se espera que, possa vir pela sua curiosidade a despertar o interesse do leitor pelo tema. Para tal, necessitaremos apenas de um computador pessoal, com um mínimo de capacidades gráficas, o domínio de alguns conceitos matemáticos simples e de rudimentos de programação.
Comecemos por recordar algumas noções sobre números complexos. Assim, um número complexo pode ser representado usando a seguinte notação
a + bi
em que 'a' é a sua parte real, 'b' a sua parte imaginária e 'i' é a "unidade" dos números imaginários definido por i = Ö-1 pelo que teremos
i0 = +1 i1 = +i i2 = -1 i3 = -i
Adicionar dois números complexos será então
(a+bi) + (c+di) = (a+c) + (b+d)i
e multiplicar
(a+bi) x (c+di) = (ac-bd) + (ad+bc)i
Podemos imaginar um número complexo como sendo um ponto com duas coordenadas (a,b), que iremos marcar num chamado plano complexo com a sua componente real, no eixo das abcissas e a componente imaginária, no eixo das ordenadas. Então, se definirmos 'z', como sendo uma variável complexa dada pelo par (x,y) e 'c', uma constante complexa dada por (a,b), poderemos conceber a seguinte equação :
ZN+1 = ZN2 + c ou seja
(x,y) = (x,y)(x,y) + (a,b) = (x2 - y2 + a, 2xy + b)
Suponhamos agora, que tal como em situações referidas anteriormente, esta equação é utilizada de uma forma recorrente, ou seja, uma vez calculado o seu resultado, este será de seguida usado como valor de entrada para novo cálculo. Caso repitamos a operação um elevado número de vezes, podemos desde já prever duas possíveis situações : ou esses valores têm tendencia para crescer indefinidamente e mais cedo ou mais tarde serão tão grandes que não os conseguiremos tratar ou então, pelo contrário, manter-se-ão dentro de certos limites, estando tal facto, dependente apenas dos valores iniciais que atribuirmos a 'z' e a 'c'.
Assim, a nossa imagem no computador será gerada da seguinte maneira : começa-se por definir uma determinada área do plano complexo em que queremos observar o comportamento daquela função devendo para tal estabelecer os limites entre os quais, irão variar os valores iniciais de 'z', que o mesmo é dizer, definindo Zmin = (xmin,ymin) e Zmax = (xmax,ymax). O mesmo se deve fazer para c = (a,b), que se manterá constante. Seguidamente, devemos relacionar esta 'janela' sobre o plano complexo, com o ecrã do nosso computador tendo em conta a quantidade de pixels que o definem.
Pegue-se então, num determinado valor para 'z', outro para 'c' e resolva-se a equação, obtendo um novo valor de 'z'. Use-se de seguida esse valor de 'z' para resolver novamente a equação, mantendo 'c', que é por definição, constante. Repita-se a operação, ou tantas vezes quantas forem estabelecidas, ou até que se obtenham valores demasiadamente grandes, conforme o que ocorrer primeiro. Caso tenha ocorrido a primeira situação, marque-se esse ponto no ecrã, com uma determinada cor, digamos branco, caso tenha ocorrido a segunda, marque-se igualmente o ponto, mas desta vez, com uma outra cor, digamos preto. Finalmente, repita-se a operação para sucessivos pontos por forma a varrer toda a 'janela' definida.
Porém, em vez de deixarmos que os valores de 'z' 'estoirem', devemos para cada cálculo, verificar se x2+y2 < 4, uma vez que se fôr o caso, então poderemos prever que a segunda equação irá acontecer, antes que o computador sofra um erro de aritmética.
Este processo que pode aparentemente ser um pouco complexo, torna-se possivelmente mais simples, se convertermos o que foi exposto em termos de pseudo-código (baseado na ref. bib. 21).
{ Introdução de dados}
read xmax, xmin, ymax, ymin
read a, b
read niter {num. máx. de iterações}
{Relação entre a 'janela' e o ecrã }
{umax e vmax iguais ao num. de pixels do ecrã}
du = (xmax-xmin)/umax
dv = (ymax-ymin)/vmax
{Rotina principal}
u = 0
do while u<umax {para 'varrer' o eixo das abcissas}
v = 0
do while v<vmax {para 'varrer' o eixo das ordenadas}
x = xmin+du*u { corrrespondência entre }
y = ymax-dv*v { x,y e u,v }
{Algoritmo Principal}
n = 0
do while n<=niter and x2+y2 < 4
xaux = x2-y2+a {cálculo de}
y = 2xy+b { z=z2+c }
x = xaux {necessário usar variável auxiliar}
n = n+1 {contador de iterações}
enddo
if n>niter then pixel(u,v,cor_0) {testa se estoirou ou}
else pixel(u,v,cor_1} { chegou ao fim }
endif
v = v + 1
enddo
u = u+1
enddo
A partir deste pseudocódigo, pode o leitor, criar uma série de interessantes imagens conhecidas como Conjuntos de Julia (fig. 7), usando uma qualquer linguagem, desde que possua um mínimo de capacidades gráficas.
Conjuntos de Julia
A partir daqui, é uma questão de imaginação e criatividade : em vez de usar apenas duas cores, pode associar o valor de 'n' a diferentes cores, pode gravar imagens e imprimi-las, pode experimentar outras equações como por exemplo z3+c, sen(z)+ez+c, zz+z5+c, etc., mas o mais fácil será começar por experimentar diferentes valores iniciais. Como foi dito, os valores de zmax e zmin representam os valores da 'janela' através da qual se pretende observar o objecto fractal, e uma vez que este é infinito, podemos ampliá-lo tanto quanto quisermos, bastando para tal, reduzir o intervalo entre xmax e xmin e entre ymax e ymin.
Podemos ainda, alterar o algoritmo tornando-o no célebre Conjunto de Mandelbrot (fig. 8). Este constitui, como os seus admiradores gostam de frisar 'o objecto mais complexo de toda a Matemática'. Para tal basta que iniciemos a equação recursiva sempre com z = (0,0), e em vez de ter c = (a,b), teremos c = (x,y), ou seja, igual às coordenadas do ponto que estamos na altura a calcular. Apesar de auto-semelhante, o conjunto de Mandelbrot apresenta uma infinidade de diferentes padrões que poderemos ampliar indefinidamente. Usando toda a precisão que a aritmética de ponto flutuante de um computador vulgar nos oferece, torna-se possível observar partes deste conjunto a uma tal escala que o conjunto inteiro ocuparia quase o sistema solar inteiro, o que nos leva a afirmar que qualquer pessoa, variando apenas a 'janela', poderá descrutinar zonas nunca antes observadas, sempre na expectativa da nova imagem que poderá surgir.
O algoritmo aqui apresentado, poderá ainda sofrer algumas alterações por forma a acelerar o seu processamento, nomeadamente
através do uso de números inteiros em vez da aritmética de ponto flutuante. Quanto ao número de iterações, naturalmente que quanto maior fôr, maior será o tempo dispendido. O ideal, seriam mais de 150, no entanto, talvez seja preferível começar com 20 ou 30 e ir depois evoluindo, estando também dependente do processador que se usar.
Aqui ficam algumas sugestões :
Conjunto de Julia Conjunto de Mandelbrot
xmin = -1.5 | -1 xmin = -2.2
xmax = 1.5 | 1 xmax = 1
ymin = -1.5 | -1 ymin = -1.8
ymax = 1.5 | 1 ymax = 1.8
a = -0.3 | 0.2 niter = 50
b = 0.7 | -0.8
niter = 50 | 50
BIBLIOGRAFIA
(1) The Fractal Geometry of Nature
Mandelbrot, Benoit W.H. Freeman & Co. 1983
(2) The Beauty of Fractals
Peitgen, H.O. e Richter, P. Springer Verlag 1986
(3) The Science of Fractal Images
Peitgen, H.O. Saupe, Dietmar e out. Springer Verlag 1988
(4) Caos
Gleick, James Gradiva 1989
Scientific American
(5) Hofstadter, Douglas R. p.16-29 Nov 81
(6) Dewdney, A. K. p.16-24 Ago 85
(7) Crutchfield, James P. Farmer e out. p.46-58 Dez 86
(8) Sander, Leonard M. p.94-100 Jan 87
(9) Dewdney, A. K. p.90-93 Jul 87
(10) Dewdney, A. K. p.140-145 Nov 87
(11) Dewdney, A. K. p.116-119 Dez 88
(12) Dewdney, A. K. p.110-113 Jul 89
(13) Dewdney, A. K. p.126-129 Mai 90
(14) Jurgens, Hartmut Peitgen e out. p.60-67 Ago 90
Science
(15) vol. 249 p.363-364 27 Jul 90
(16) vol. 249 p.499-504 3 Ago 90
Byte
(17) Barnsley, Michael F. e Sloan, Alan D. p.215-223 Jan 88
(18) Kenner, Hugh p.382-383 Jun 90
(19) Kenner, Hugh p.28-32 Fev 91
Science & Vie
(20) Vários p.102-127 Hors-Série Nº 161 Dez 87
Spooler Magazine
(21) Albuquerque, Carlos p.24-27 Nº 10 Jul/Set 90
Personal Computer World
(22) Rush, S. A. Programania Dez 89
(23) Beard, Nick p.130-135 Out 90
Expresso
(24) Cardoso, Rui p.34R-40R 16 Jun 90
(25) Tyler, Bert e out., Manual do programa 'FRACTINT',Versão 15.1
(26) Autores Vários; La Recherche – Spécial (La Science du Désordre), Fev. 87