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 anter­iores 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 pes­soal, 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 complex­os. 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 definir­mos '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 ante­riormente, 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 ocor­rer 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 'jane­la' 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 experi­mentar 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 pre­tende 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 ofer­ece, 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 observa­das, 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