Índice:
- Etapa 1: O que são conjuntos de Mandelbrot e Julia?
- Etapa 2: O que você precisa?
- Etapa 3: Programa ESP32
- Etapa 4: algumas imagens explicadas …
Vídeo: Conjuntos de Mandelbrot e Julia no ESP32: 4 etapas (com imagens)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:36
Você certamente conhece os fractais, o mais famoso dos quais é o conjunto de Mandelbrot.
Aqui está um programa para brincar no ESP32. Escolhi o ESP32 porque acho que ele fará os cálculos mais rápido do que um Arduino padrão (frequência de clock mais alta: 240 MHz): cerca de um segundo a um segundo e meio para cálculo e exibição.
O código é exibido em uma tela de toque 480 x 320 TFT. Ele calcula os conjuntos de Mandelbrot e Julia para vários valores de parâmetro e permite que você amplie as áreas de interesse para ver o aspecto do fractal (ou seja, a presença das mesmas estruturas em cada mudança de escala). O nível de zoom é limitado devido à precisão limitada dos cálculos, mas meia dúzia de zooms podem ser feitos antes que a imagem se degrade.
Prepare-se para explorar o mundo mágico dos fractais …
Etapa 1: O que são conjuntos de Mandelbrot e Julia?
O conjunto de Mandelbrot leva o nome de Benoit Mandelbrot (1924-2010), um matemático francês e americano que fez um trabalho pioneiro na geometria fractal, iniciado no final do século 19 por, entre outros, Peano, Sierpinski e Julia.
O que são objetos fractais?
As irregularidades da natureza, que podem parecer caóticas, como a linha da costa marítima, o formato das nuvens, uma árvore, são de facto a expressão de uma geometria muito complexa em escala variável. Neste contexto, a noção de dimensão fracionária substitui a da dimensão euclidiana usual (que é sempre um inteiro)!
Um objeto fractal é tal que qualquer porção dele é idêntica ao todo (isso é chamado de auto-similaridade): sua estrutura é invariável pela mudança de escala.
O termo "fractal" é um neologismo criado por Benoît Mandelbrot em 1974 a partir da raiz latina fractus, que significa "quebrado", "irregular". É um substantivo e um adjetivo. Muitos fenômenos naturais - como o contorno das costas ou a aparência do repolho Romanesco (veja a imagem) - têm formas fractais aproximadas.
Benoît Mandelbrot teve uma carreira um tanto atípica: depois de lecionar na Universidade de Lille (França), assumiu um cargo na IBM onde rapidamente se tornou um IBM Fellow, o que lhe deu grande liberdade para seus estudos científicos. No início dos anos 1980, após deixar a IBM, ele se tornou professor em Harvard, mas se estabeleceu permanentemente em Yale.
Seu trabalho na década de 1960 e no início da década de 1970 o levou a publicar um famoso artigo intitulado "Objetos Fractais", no qual mostrava que esses objetos, considerados por grande parte da comunidade matemática como meras curiosidades, eram encontrados em toda a natureza. Ele deu muitos exemplos em uma ampla variedade de campos, como física, hidrologia, finanças, meteorologia, geografia, geologia, metalurgia….
Qual é o conjunto Mandelbrot?
Para começar, digamos que seja um belo desenho gerado por um programa. E este programa é bastante simples. Existem muitos desenhos gerados por computador e muitos softwares para gerá-los. Então, o que há de tão especial sobre este? Primeiro, o conjunto de Mandelbrot é um subconjunto do plano, uma coleção de pontos. Ele contém áreas, mas também curvas suaves, filamentos, pontos dos quais emanam vários ramos e outras coisas. Segundo: é realmente fascinante e tem uma história muito interessante.
No início do século 20, os matemáticos franceses Pierre Fatou e Gaston Julia desenvolveram um subdomínio da matemática denominado dinâmica holomórfica. Eles estavam interessados em funções específicas, agindo com base em números, usando algumas das fórmulas mais simples disponíveis. Os números em questão são números complexos, quantidades representadas por duas coordenadas (assim como os pontos de um avião) chamadas partes reais e imaginárias. Eles foram inventados no século 16 por matemáticos para ajudar a encontrar as raízes de polinômios e a solução de equações, mas encontraram aplicações amplas e profundas em matemática e ciências físicas. Podemos adicionar 2 números complexos, multiplicá-los ou dividi-los e fazer muitas outras coisas. Fatou e Julia estudaram as propriedades de certos sistemas dinâmicos onde um número complexo varia de acordo com uma regra simples repetida continuamente: não há necessidade de matemática complicada aqui (então, você pode esquecer a primeira imagem …). Eles revelaram a riqueza desses sistemas, definiram os conjuntos agora chamados de conjuntos de Julia e estudaram sua auto-similaridade, portanto aspecto fractal … mas a palavra não existia naquela época porque só foi inventada muito mais tarde, por … Benoît Mandelbrot!
Após o trabalho dos fundadores, este domínio caiu no esquecimento. Quando os computadores chegaram, eles ajudaram a explorar muitos fenômenos matemáticos que exigiam computação intensiva, incluindo o domínio aberto por Julia e Fatou. Assim, quando Benoît Mandelbrot decidiu usar computadores IBM na década de 1980 para representar um determinado conjunto matemático relacionado à dinâmica holomórfica, ele obteve um desenho muito atraente e muito intrigante (primeira foto da seção anterior).
O que o conjunto Mandelbrot representa? Basicamente, existe um sistema dinâmico subjacente associado a cada ponto da imagem. As coordenadas do ponto atuam como um parâmetro ajustável. Diferentes pontos correspondem a diferentes conjuntos de Julia e, dependendo de seu comportamento, podemos decidir colorir o ponto de uma maneira particular. O conjunto de Mandelbrot é o conjunto de parâmetros para os quais o sistema possui uma determinada propriedade.
Como calcular conjuntos de Mandelbrot e Julia?
Precisamos entrar em mais detalhes sobre como calcular esses conjuntos. Os conjuntos de Mandelbrot e Julia são calculados pela iteração repetida de uma fórmula simples, em nosso caso z ^ n + c. z é um número complexo que representa as coordenadas de um ponto na tela. é um expoente inteiro, então z ^ n é igual a z multiplicado por ele mesmo n vezes e c é uma constante.
Para o conjunto de Mandelbrot, para todos os pontos na área de exibição, inicializamos z para 0. A constante c é considerada igual ao valor das coordenadas do ponto considerado e a fórmula é iterada.
Aqui está a regra: um ponto faz parte do conjunto se a aplicação repetida desta fórmula não diverge (ou seja, não leva a cálculos para grandes números). Pode ser matematicamente mostrado que se o resultado da fórmula exceder 2 (em módulo, já que estamos falando de números complexos) a iteração irá divergir. Portanto, para obter cores bonitas rapidamente, paramos a iteração quando o módulo do resultado excede 2 e a cor corresponde ao número dessa iteração específica. Se o número de iterações se tornar muito grande (então, se o ponto for parte do conjunto de Mandelbrot), paramos após um determinado limite e associamos a cor preta a este ponto.
O conjunto Julia é calculado de forma semelhante, mas os cálculos não são inicializados em 0, mas no valor das coordenadas do ponto considerado e a constante c é escolhida pelo usuário e permanece a mesma para toda a imagem.
É isso, espero que esteja claro… Essas explicações ajudam a entender melhor o restante das instruções de uso.
Etapa 2: O que você precisa?
Lista de materiais:
- 1 placa ESP32
- 1 display TFT com tela sensível ao toque e caneta
- 1 placa de ensaio e fios
É isso. Custo total abaixo de 10 USD.
O ESP32 da Espressif é um microcontrolador dual core rodando a 240 MHz, o que o torna um bom candidato para computação repetitiva rápida e complexa. Ele tem capacidades de WiFi e Bluetooth que não uso neste projeto.
O conjunto de instruções tem 32 bits. A computação com variáveis de 16 e 32 bits é muito rápida, o que permite cálculos precisos, o que é fundamental para fins de zoom. Nesta aplicação, para uma tela de 320 x 240, uma imagem é feita aproximadamente de 75.000 pixels, cada um dos quais é calculado usando um processo iterativo que pode ser executado até 100 vezes. Isso pode levar a 7.500.000 cálculos unitários, cada um dos quais é uma exponenciação, ou seja, várias multiplicações …
Portanto, a velocidade de computação é essencial aqui, mas a precisão é fundamental. Quanto mais você dá zoom, menor é o tamanho da parte do conjunto a ser exibida. Isso significa que cada um dos 320 x 240 pixels da imagem representa um número muito próximo de seus vizinhos. Conforme o zoom aumenta, essa proximidade aumenta.
Mas as imagens fractais têm a propriedade de permanecerem inalteradas ao serem redimensionadas. Assim, pequenos detalhes aparecem em todos os lugares e para qualquer fator de escala. A forma principal do conjunto de Mandelbrot, como pode ser vista no display da imagem acima, pode ser encontrada em outro lugar em uma versão muito menor, e ser exibida se você aumentar o zoom perto o suficiente (veja no vídeo). Mas se a diferença de coordenadas entre dois pixels vizinhos for muito pequena para permitir que o ESP32 capture sua diferença de comportamento, devido à falta de precisão, o efeito fractal não pode ser mostrado …
Para obter uma boa precisão, o código usa floats, que são codificados em 32 bits pelo ESP32. Isso permite até 6 ou 7 níveis de zoom. O uso de precisão dupla (64 bits) aumentaria essa profundidade de zoom, ao custo de cálculos mais lentos, portanto, tempos mais longos entre 2 imagens.
Para tornar a precisão dupla, basta alterar todas as ocorrências de "float" para "double" no código e executar o código. Recentemente fiz uma versão para uma tela maior (HVGA 480 x 320 pixels): flutuações de 16 bits demoram 3 segundos para exibir a imagem e as duplas levam entre 10 e 20 segundos (3 a 6 vezes mais), mas suportam mais de 15 níveis de zoom. A terceira imagem neste capítulo mostra o nível de zoom 14 na parte mais à direita do conjunto de Mandelbrot.
Como conectar a tela:
Usei um display SPI e os parâmetros são definidos no arquivo User_Setup.h (na pasta da biblioteca TFT_eSPI):
- Driver: descomente o driver correto para o seu monitor. O meu era #define RPI_ILI9486_DRIVER
- Números de PIN: vá para a seção ESP32 do arquivo e escolha
- # define TFT_MISO 19
- # define TFT_MOSI 23
- # define TFT_SCLK 18
- # define TFT_CS 15 // pino de controle de seleção de chip
- # define TFT_DC 2 // Pino de controle de comando de dados
- #define TFT_RST 4 // Reinicialize o pino (pode se conectar ao pino RST)
- #define TOUCH_CS 22 // Chip select pin (T_CS) da tela de toque
- Fontes: não há necessidade de alterá-las
-
Outras opções: Selecionei o seguinte
- #define SPI_FREQUENCY 20000000
- #define SPI_READ_FREQUENCY 20000000
- #define SPI_TOUCH_FREQUENCY 2500000
Todas as outras linhas do arquivo são comentadas.
Calibre a capacidade de toque da tela
Se a seleção de uma parte da tela ou de um botão não for precisa, ou mesmo totalmente errada, execute o esboço de calibração de toque da biblioteca TFT_eSPI e copie / cole no código da matriz fornecida (certifique-se de usar o valor correto para orientação de exibição, 1 ou 3 para paisagem).
Etapa 3: Programa ESP32
O código é exibido em uma tela de toque TFT 320 x 240 e usa a biblioteca TFT_eSPI. Ele calcula os conjuntos de Mandelbrot e Julia para vários valores de expoentes e permite que você amplie as áreas de interesse para ver o aspecto do fractal (ou seja, a presença das mesmas estruturas em cada mudança de escala).
O código em anexo é uma versão para tela 480 x 320. Nesta versão, você pode alterar o tamanho (largura e altura em pixels) da tela. A biblioteca TFT_eSPI define as conexões em um arquivo de configuração (anexado) que deve ser colocado no diretório da biblioteca.
O código começa exibindo as instruções de operação (ver foto e vídeo)
A maior parte da tela é reservada para a exibição de imagens, os botões de toque estão disponíveis no lado direito da tela:
- R: executa um "reset", i. e. exibe a imagem em sua escala máxima,
- U: "desfazer" permite que você volte à etapa anterior (se a região ampliada não for interessante, você pode escolher outra parte da imagem para ampliar),
- M ou J: permite que você mude do conjunto de Mandelbrot para o conjunto de Julia e vice-versa.
Os rótulos de algumas teclas mudam de acordo com o contexto: eles mostram a função que será executada se pressionada. Portanto, se você atualmente exibe o conjunto de Mandelbrot, a tecla M / J exibe J, pois se você pressioná-la exibirá o conjunto de Julia (e vice-versa).
O mesmo se aplica à escolha da paleta de cores. Começamos com a paleta verde. A chave propõe a próxima paleta (a azul). As paletas são: vermelho, verde, azul, cinza, paleta 1, paleta 2 e de volta ao vermelho. Os dois últimos são testes de paletes multicoloridos que proporcionam mais contraste, permitindo uma melhor visualização de alguns detalhes.
A chave com um número permite que você escolha o expoente n, em um loop de 2 a 7 (e de volta a 2). No mesmo espírito, ele exibe 3 se você estiver atualmente em 2 …
Finalmente, ao exibir o conjunto Julia, é necessário escolher o valor da constante c: a tecla C permite que você faça isso, graças a um seletor (veja a segunda foto). O valor desta constante é exibido com o conjunto.
Clicar na imagem aumenta o zoom em torno do ponto selecionado. Um pequeno círculo é exibido no ponto tocado e um retângulo destaca a zona ampliada do conjunto.
A terceira imagem mostra que os tempos de computação permanecem entre 0,8 e 1,2 segundos para 320 x 240 pixels, o que torna confortável o zoom e a exibição. Atinge 3 segundos para 480 x 320 pixels, mas fornece mais detalhes.
Etapa 4: algumas imagens explicadas …
A maior imagem é o conhecido conjunto de Mandelbrot. Os números complexos usados nesta imagem variam de -2,1 a +0,7 em abcissa e -1,2 a 1,2 em ordenadas. Se você aumentar o zoom na parte esquerda da primeira imagem, é provável que você finalmente obtenha a segunda, que exibe uma versão menor do conjunto original encontrado na ponta mais à esquerda do conjunto. Para ambas as imagens, o expoente ('n') é igual a 2: esse é o valor normalmente usado para exibir conjuntos de Mandelbrot.
Se você alterar este valor para 3 (basta clicar na tecla 3), você obterá a terceira imagem. Uma diferença óbvia é o fator de simetria: n = 2 dá uma simetria axial (ou seja, o conjunto é simétrico em relação ao eixo horizontal médio), mas com n = 3 a imagem se torna invariante por rotação de 120 ° (um terço de 360 °, rotação fator de simetria de 3). E retém suas propriedades fractais, que você pode verificar ampliando as bordas da forma preta.
A 4ª imagem é um conjunto Julia obtido após selecionar um valor de coeficiente igual a 0,414 em abcissa e 0,09 em ordenada. A paleta vermelha é escolhida, como pode ser visto pela tecla verde à direita (verde, sendo a próxima cor a ser escolhida). A quinta imagem exibe o mesmo tipo de conjunto Julia, que é uma parte imaginária superior da constante (0,358).
Espero que gostem de jogar com este programa e que consigam exibir lindas imagens fractais. Não hesite em explorar os conjuntos de Mandelbrot e Julia, e brincar com as paletas: ajudam a identificar alguns detalhes que podem não ser visíveis com os simples monocromáticos. Você pode até descobrir algumas paisagens fractais que ninguém nunca viu antes de você …
_
Quer descobrir mais imagens fractais? Clique aqui ou explore a arte fractal ou mesmo o fractal ascii. Talvez este instrutível faça você querer criar imagens tão boas …
Segundo prêmio no concurso Feito com Matemática
Recomendado:
Howto: Instalando Raspberry PI 4 Headless (VNC) com Rpi-imager e imagens: 7 etapas (com imagens)
Howto: Instalando Raspberry PI 4 Headless (VNC) com Rpi-imager e imagens: Eu pretendo usar este Rapsberry PI em um monte de projetos divertidos em meu blog. Sinta-se à vontade para dar uma olhada. Eu queria voltar a usar meu Raspberry PI, mas não tinha um teclado ou mouse no meu novo local. Já fazia um tempo desde que configurei um Raspberry
Introdução ao ESP32 - Instalando placas ESP32 no IDE Arduino - Código ESP32 Blink: 3 etapas
Introdução ao ESP32 | Instalando placas ESP32 no IDE Arduino | ESP32 Blink Code: Neste instructables veremos como começar a trabalhar com esp32 e como instalar placas esp32 no IDE do Arduino e iremos programar esp 32 para executar o código blink usando arduino ide
Gesture Hawk: robô controlado por gestos manuais usando interface baseada em processamento de imagens: 13 etapas (com imagens)
Gesture Hawk: Robô controlado por gestos manuais usando uma interface baseada em processamento de imagem: Gesture Hawk foi apresentado no TechEvince 4.0 como uma interface homem-máquina baseada em processamento de imagem simples. Sua utilidade reside no fato de que nenhum sensor adicional ou vestível, exceto uma luva, é necessário para controlar o carro robótico que funciona em diferentes
Como desmontar um computador com etapas e imagens fáceis: 13 etapas (com imagens)
Como desmontar um computador com etapas e imagens fáceis: Esta é uma instrução sobre como desmontar um PC. A maioria dos componentes básicos é modular e facilmente removível. No entanto, é importante que você seja organizado sobre isso. Isso ajudará a evitar que você perca peças e também a fazer a remontagem e
Adicionando juntas e conjuntos de contato a uma unidade Geneva no Fusion 360: 7 etapas
Adicionando juntas e conjuntos de contato a uma unidade Geneva no Fusion 360: para este tutorial, usarei um arquivo de amostra incluído no painel de dados do Fusion 360 de todos. Abra o painel de dados clicando no ícone de grade no canto superior esquerdo. Role para baixo até ver a seção "Amostras". Clique duas vezes em "Tr