Cálculo da Dimensão Fractal
Introdução
Nem comprimento nem área servem para medir o tamanho dos objectos fractais. Por exemplo, todos os fractais geométricos que construímos com o primeiro programa deste módulo têm comprimento infinito e área zero. São "mais" do que linhas, e "menos" do que superfícies. O conceito de dimensão fractal dá uma resposta ao problema de medir o tamanho destes objectos.
Para os objectos geométricos clássicos existe uma relação simples entre a dimensão, o número de blocos necessário para os recobrir, e o tamanho dos blocos. No caso de segmentos de recta, quadrados, ou cubos, conforme estejamos em dimensão um, dois ou três, essa relação é Nn = (1/ Ln)^d, onde Nn é o número de quadrados de lado Ln do recobrimento e d a dimensão. È fácil comprovar este resultado. Por exemplo, um quadrado de lado 1 é recoberto por 4 quadrados de lado 1/2, 16 quadrados de lado 1/4, ...
A equação anterior pode ser rescrita na forma d = log Nn /log (1/Ln) que põe em evidência a simplicidade desta lei. É uma lei de potência, portanto a dependência do logaritmo do número de blocos no logaritmo do inverso do tamanho destes é linear. Num gráfico log-log, esta relação traduz-se por uma recta, e o declive dessa recta é a dimensão, d.
Para objectos de formas mais complicadas, a equação anterior pode não se verificar. No entanto, a relação de proporcionalidade d ~ log Nn /log (1/Ln) (1) é recuperada assimptoticamente à medida que o recobrimento se toma mais fino.
Isto motiva tomar a relação (1), no limite Ln->0, como uma definição alternativa de dimensão, chamada dimensão de contagem de blocos, por razões óbvias. A dimensão definida desta maneira coincidirá com a dimensão habitual para os objectos da geometria tradicional, e é em geral não inteira para os objectos fractais. É uma das definições posíveis de dimensão fractal, e é nela que se baseia o cálculo que este programa executa.
O cálculo da dimensão de contagem de blocos para a ilha de Koch dá d = log 4/ log 3 ~ 1.26 . A curva de Koch tem dimensão fractal não inteira, maior que a de uma linha, e menor que a de uma superfície. O mesmo cálculo para a árvore de Sierpinski dá d = log 3/ log 2 ~ 1.58, e para o quadrado de Sierpinsky d = log 8/ log 3 ~ 1.89. Não é difícil verificar que, em geral, para fractais construídos recursivamente como nestes exemplos a partir de c cópias de si próprios rescaladas por um factor 1/f, se terá d = log c/ log f.
Note que a dimensão de contagem de blocos é um limite, e que um fractal 'autêntico' tem estrutura não trivial em todas as escalas, enquanto que nos objectos com que trabalhamos aqui o detalhe está limitado pela resolução da figura. Pela mesma razão, não faz sentido construir recobrimentos mais finos do que o tamanho de um pixel.
Início
Utilização
Este programa usa o algoritmo da dimensão de contagem de blocos para obter valores aproximados para a dimensão fractal das figuras representadas na janela gráfica. Essas figuras podem ser desenhadas 'à mão' neste programa, premindo o botão "DESENHAR" e 'clickando' ou arrastando o rato na janela gráfica para aí criar uma imagem. Também podem ser importadas de outros programas, premindo o botão "IMPORTAR MUNDO" para carregar na janela gráfica ficheiros previamente criados.
Como viu, a ideia para o cálculo da dimensão de contagem de blocos de uma imagem é muito simples. Basta dividir a janela gráfica em quadrados cada vez mais pequenos e ir contando quantos desses quadrados possuem pelo menos um patch que faça parte da imagem. O programa executa essa operação com o botão "CALCULA DIMENSÃO", e vai representando num gráfico log Nn em função de log (1/Ln). À medida que a partição se torna mais fina, esses pontos aproximam-se de uma recta cujo declive é um valor aproximado da dimensão fractal. Esse valor é apresentado na janela de comandos no fim do cálculo.
A opção "VER-PARTIÇÃO" permite ao utilizador ver como é que a imagem está a ser coberta pelos quadrados da partição. Os quadrados que ficam a verde fazem parte da aproximação ao objecto, os outros quadrados da partição ficam azuis. O monitor "Células Ocupadas" dá a indicação do número de quadrados verdes em cada partição.
Início
Questões
1. Use o botão "DESENHAR" para criar imagens na janela gráfica e calcule a dimensão de contagem de blocos destas imagens. Procure desenhar áreas e linhas regulares, e conjuntos de pontos, e analise os resultados. Em particular, procure explicar o comportamento dos pontos que se obtêm à medida que a partição se torna mais fina.
2. Calcule a dimensão de contagem de blocos dos fractais gerados pelo programa Fractais Geométricos, e compare com os valores exactos.
3. Calcule a dimensão de alguns dos fractais gerados pelo programa Atractores Estranhos, incluindo o atractor de Hénon (d ~ 1.26).
4. Calcule a dimensão da fronteira da região percorrida por uma tartaruga no programa Marcha Aleatória (d ~ 4/3).
5. Repare que em todos os cálculos que efectuou, o programa ajusta a recta aos penúltimo e antepenúltimo pontos, em vez de aos dois últimos. Esta escolha altera de maneira sistemática a estimativa da dimensão ? Parece-lhe razoável desprezar o ponto que corresponde à partição mais fina ?
6. No módulo 1, no programa Infiltração de Óleos em Solos Porosos, para a porosidade correspondente à transição de percolação o solo contaminado forma um agregado fractal. Calcule a sua dimensão fractal (não se esqueça de alterar as cores convenientemente, assim como o tamanho e propriedades da janela gráfica, e use as funções "export world" e "import world" que o programa disponibiliza em 'file' ).
Início
Breve Análise do Código
Conceito Geral
O principal conceito deste programa prende-se com a contagem de quadrados de vários tamanhos que incluem ou não uma célula pintada no seu interior. Traçando o gráfico deste número dividido pelo número total de quadrados existentes na caixa de visualização em função do lado dos quadrados escolhidos, pode-se obter a dimensão da figura achando o declive da recta emergente.
Desta forma a ideia adoptada para verificar quais os quadrados que possuiem células pintadas foi a seguinte. Definindo um lado l para o quadrado, todas as células dentro de um determinado quadrado são representadas por uma só célula (do canto inferior esquerdo (0,0) desse quadrado). Assim, faz-se um ask a todas as células que caso estejam pintadas calculem o seu representante e incrementem a sua propriedade pintado. No final apenas é preciso contar o número de representantes cuja propriedade pintado é não nula
Variáveis globais
tempo | mantem o tempo de cálculo |
porta | avisa quando o utilizador pretende interromper o cálculo |
NP | (Número Pintado), número de quadrados pintados |
verde, azul | cores definidas para a visualização |
patches: pintado | propriedade das patches onde é guardada a informação dos representantes |
Funções principais
calculadimensao | função executada quando premido o botão "calcular dimensão" |
Funções auxiliares
inicializagrafico | limpa e inicializa o gráfico traçando as rectas correspondentes á dimensão 1 e 2 |
representantes | chamada pelas patches para incrementar a propriedade pintado do seu representante |
desenhaponto | marca um ponto no gráfico |
tangente | traça no gráfico a recta tangente aos pontos calculados |
apagar | limpa e inicializa as variáveis do programa |
desenhar | executada quando o utilizador prime o botão "desenhar", permite o utilizador acrescentar pontos no gráfico |
parar | avisa a função calculadimensao que o utilizador pretende parar o cálculo |
importarmundo | executada quando o utilizador prime o botão com o mesmo nome, mostra uma janela onde o utilizador escolhe um ficheiro gerado anteriormente por outro modelo de fractais. |
Código
Variáveis globais
globals [ ;Declaração das variáveis globais. tempo ;Permite saber o tempo de cálculo. porta ;O valor lógico desta variável ;determina se o programa é ou não abortado. NP ;Número de células pintadas para cada partição. azul ;Nomear duas cores que tal como o "black" não podem verde ;fazer parte dos objectos a calcular a dimensão. ;O verde será a cor dos diversos quadrados que aproximam o objecto. ;O azul é a cor dos patches restantes. ] ;Variável dos patches. Se os patches representados pertencerem ;ao objecto que se pretende calcular a dimensão ;os patches representantes (em cada partição) têm pintado ;diferente de zero, caso contrário têm pintado igual a ;zero tal como todos os patches não representantes. patches-own [ pintado ]
Funções principais
calculadimensao
Esta função é executada quando se premi o botão "Calcula Dimensão". Inicializa o gráfico e todas as variáveis. De seguida calcula o número de quadrados pintados para cada vez menores comprimentos do lado, marcando os pontos obtidos no gráfico em cada ciclo.
Mediante a escolha do utilizador (ver-particao), mostra para cada iteração os quadrados que verificou conterem células pintadas no seu interior, pintando esses de verde e os quadrados vazios de azul.
No final traça a tangente aproximada aos pontos marcados no gráfico.
to calculadimensao ;Esta função é executada quando se pressiona Calcula Dimensão. locals [ n ;Variável auxiliar que indica o número de pontos que se pretende desenhar no gráfico. rx ry ;Variáveis auxiliares que tomam os valores das coordenadas dos patches representantes. ] reset-timer ;Inicializa o contador interno da linguagen a zero e começa a contar o tempo. set verde (green + 0.1); set azul (blue + 0.1) ;;definição das novas cores set porta true ;Fica com este valor lógico até indicação contrária do utilizador, aí o programa aborta. inicializa-grafico ifelse passo = 0 ;Se passo = 0, então coloca só um ponto no gráfico. ;Isto é, só executa os cálculos para uma partição da janela, ;especificada pela variável lado (= tamanho do quadrado da particão). [ set n 1 ] ;Se passo diferente de 0, então calcula-o. [ set n int (lado / passo) ] ;Far-se-á n partições da janela gráfica. ;repeat n set lado 256 repeat 9 [ ;A cada nova partição é necessário "limpar" todos os representantes, ;pois eles são diferentes de particão para partição. ask patches [ set pintado 0 ] ;Cada patch calcula o seu representante. Se o patch pertence ao objecto ;para o qual se pretende saber a dimensão, então incrementa a variável ;"pintado" do seu representante uma unidade. ask patches [ representantes ] ;Permite ao utilizador ver as sucessivas partições da janela ;e a aproximação (por quadrados) do objecto. if ver-particao [ ask patches [ ;Como cada patch calcula o seu representante. set rx lado * int ((pxcor + screen-edge-x) / lado) - screen-edge-x set ry lado * int ((pycor + screen-edge-y) / lado) - screen-edge-y ;Se o representante está "pintado" então os representados fazem parte da ifelse (pintado-of patch rx ry != 0) [ ;aproximação e devem colorir-se de verde. if pcolor = black or pcolor = azul [ set pcolor verde ] ] ;Caso o representante não esteja pintado então o patch ;sabe que não faz parte da aproximação, fica azul [ set pcolor azul ] ] ] ;O número de células com pintado != 0 é inicializado a zero em cada novo valor do lado set NP 0 ask patches [ ;Contar o número de patches com pintado != 0, isto é, o número de representantes "pintados". if pintado > 0 [ set NP NP + 1 ] ] ;Desenha um novo ponto no gráfico. desenha-ponto ;set lado (lado - passo) ;Actualizar o lado. set lado lado / 2 ;Caso o utilizador tenha pressionado Parar, o programa acaba aqui. if not porta [ set tempo timer stop ] ] ;set lado (lado + passo) set lado lado * 2 ;Traça a recta que passa no ponto (0.0) e no ponto do gráfico ;que corresponde ao menor valor de lado usado. ;Calcula a dimensão fractal com base do declive na recta anterior. tangente set tempo timer ;Dá o tempo de cálculo. end
Funções Auxiliares
inicializa-grafico
Função que apenas inicializa e traça as rectas correspondentes às dimensões 1 e 2
to inicializa-grafico ;Desenha duas rectas de enquadramento set-current-plot "Dimensao" set-current-plot-pen "dimensao 1" auto-plot-off plotxy 0 0 plotxy 10 10 set-current-plot-pen "dimensao 2" plotxy 0 0 plotxy 10 5 auto-plot-on end
representantes
Função que calcula o representante da célula que a executou, e caso verifique que a célula está pintada, incrementa a propriedade pintado do seu representante
to representantes locals [ rx ry ] ;Como cada patch calcula as coordenadas do seu representante. set rx lado * int ((pxcor + screen-edge-x) / lado) - screen-edge-x set ry lado * int ((pycor + screen-edge-y) / lado) - screen-edge-y ;Se o patch respectivo pertence ao objecto então incrementa a variável ;pintado do seu representante de uma unidade. if pcolor != black and pcolor != azul and pcolor != verde [ set (pintado-of patch rx ry) (pintado-of patch rx ry) + 1 ] end
desenha-ponto
Função que marca um ponto no gráfico utilizando o valor das variáveis lado e NP (Número Pintado).
;Desenha um ponto no gráfico com os valores que variáveis globais (NP e lado) ;tenham no momento em que é chamada. to desenha-ponto set-current-plot "Dimensao" set-current-plot-pen "pontos" if NP = 0 [ user-message "Não desenhou nada!" stop ] ;Toma-se como unidade de comprimento a largura da janela. if NP != 1 [ plotxy (1 / (- ln (lado / screen-size-x))) (1 / ln NP) ] end
tangente
Função que traça no gráfico a recta tangente aos pontos calculados
;Traça a recta que passa no ponto (0.0) e no ponto do ;gráfico que corresponde ao menor valor de lado usado. ;Calcula a dimensão fractal com base do declive na recta anterior. to tangente set-current-plot "Dimensao" set-current-plot-pen "tangente" auto-plot-off plotxy 0 0 plotxy (100 * (1 / (- ln (lado / screen-size-x)))) (100 * (1 / ln NP)) auto-plot-on show "Dimensão fractal: " + (ln NP / (- ln (lado / screen-size-x))) end
apagar
Função que limpa e inicializa as variáveis do programa
to apagar clear-all end
desenhar
Função que é executada quando o utilizador prime o botão "desenhar", permite o utilizador acrescentar pontos no gráfico
to desenhar if mouse-down? [ set pcolor-of patch-at mouse-xcor mouse-ycor green ask patches-from patches with[pcolor = green] [patches in-radius-nowrap raio] [set pcolor red] ] end
parar
Função que avisa a função calculadimensao que o utilizador pretende parar o cálculo
to parar set porta false end
importarmundo
Função que executada quando o utilizador prime o botão com o mesmo nome, mostra uma janela onde o utilizador escolhe um ficheiro gerado anteriormente por outro modelo de fractais
;Permite importar um "mundo" de outro programa. Ignore eventuais mensagens ;de erro envolvendo variáveis globais. to importarmundo locals[nomeficheiro] set nomeficheiro user-choose-file ;Caso o utilizador cancele a escolha de um ficheiro evita dar erro. ;Mas dá erro se o utilizador indicar um ficheiro inexistente no sistema. if nomeficheiro = false [ user-message "Abortou" stop ] import-world nomeficheiro endInício
Variantes e Extensões
Adapte o progrma de maneira permitir fazer o refinamento da partição de maneira aritmética, em vez de geométrica. Use esta variante para explorar com mais pontos a região das partições finas que serviu de base à estimativa da dimensão fractal nos exemplos que calculou antes.
Adapte o programa por forma a permitir outro tipo de recobrimentos, por exemplo por discos em vez de quadrados, e compare os resultados obtidos.
Início©opyright 2004, Centro de Física Teórica e Computacional