Tabla de contenido:

Mandelbrot y Julia Sets en ESP32: 4 pasos (con imágenes)
Mandelbrot y Julia Sets en ESP32: 4 pasos (con imágenes)

Video: Mandelbrot y Julia Sets en ESP32: 4 pasos (con imágenes)

Video: Mandelbrot y Julia Sets en ESP32: 4 pasos (con imágenes)
Video: #ENVIVO Reto de Programacion: Copo de Nieve #Processing 2024, Mes de julio
Anonim
Image
Image
Mandelbrot y Julia Sets en ESP32
Mandelbrot y Julia Sets en ESP32
Mandelbrot y Julia Sets en ESP32
Mandelbrot y Julia Sets en ESP32

Ciertamente conoces los fractales, el más famoso de los cuales es el conjunto de Mandelbrot.

Aquí hay un programa para jugar en ESP32. Elegí el ESP32 porque creo que hará los cálculos más rápido que un Arduino estándar (frecuencia de reloj más alta: 240 MHz): alrededor de un segundo a un segundo y medio para el cálculo y la visualización.

El código se muestra en una pantalla táctil TFT de 480 x 320. Calcula conjuntos de Mandelbrot y Julia para varios valores de parámetros y le permite hacer zoom en áreas de interés para ver el aspecto fractal (es decir, la presencia de las mismas estructuras en cada cambio de escala). El nivel de zoom está limitado debido a la precisión limitada de los cálculos, pero se pueden hacer media docena de zooms antes de que la imagen se degrade.

Prepárate para explorar el mundo mágico de los fractales …

Paso 1: ¿Qué son los conjuntos de Mandelbrot y Julia?

¿Qué son los conjuntos de Mandelbrot y Julia?
¿Qué son los conjuntos de Mandelbrot y Julia?
¿Qué son los conjuntos de Mandelbrot y Julia?
¿Qué son los conjuntos de Mandelbrot y Julia?
¿Qué son los conjuntos de Mandelbrot y Julia?
¿Qué son los conjuntos de Mandelbrot y Julia?

El conjunto de Mandelbrot lleva el nombre de Benoit Mandelbrot (1924-2010), un matemático francés y estadounidense que realizó un trabajo pionero en geometría fractal, iniciado a fines del siglo XIX por, entre otros, Peano, Sierpinski y Julia.

¿Qué son los objetos fractales?

Las irregularidades de la naturaleza, que pueden parecer caóticas, como la línea de la costa del mar, la forma de las nubes, un árbol, son de hecho la expresión de una geometría muy compleja en escala cambiante. En este contexto, la noción de dimensión fraccionaria reemplaza a la de dimensión euclidiana habitual (que siempre es un número entero).

Un objeto fractal es tal que cualquier parte de él es idéntica al todo (esto se llama auto-semejanza): su estructura es invariable por el cambio de escala.

El término "fractal" es un neologismo creado por Benoît Mandelbrot en 1974 a partir de la raíz latina fractus, que significa "roto", "irregular". Es tanto un sustantivo como un adjetivo. Muchos fenómenos naturales, como el contorno de las costas o la aparición del repollo Romanesco (ver imagen), tienen formas fractales aproximadas.

Benoît Mandelbrot tuvo una carrera un tanto atípica: tras dar clases en la Universidad de Lille (Francia), ocupó un puesto en IBM donde rápidamente se convirtió en IBM Fellow, lo que le dio una gran libertad para sus estudios científicos. A principios de la década de 1980, después de dejar IBM, se convirtió en profesor en Harvard, pero se estableció de forma permanente en Yale.

Su trabajo en los años sesenta y principios de los setenta le llevó a publicar un célebre artículo titulado "Objetos fractales" en el que mostraba que estos objetos, considerados por gran parte de la comunidad matemática como meras curiosidades, se encontraban por doquier en la naturaleza. Dio muchos ejemplos en una amplia variedad de campos como la física, la hidrología, las finanzas, la meteorología, la geografía, la geología, la metalurgia….

¿Qué es el conjunto de Mandelbrot?

Para empezar, digamos que es un bonito dibujo generado por un programa. Y este programa es bastante simple. Existen muchos dibujos generados por computadora y muchos programas de computadora para generarlos. Entonces, ¿qué tiene de especial este? Primero, el conjunto de Mandelbrot es un subconjunto del plan, una colección de puntos. Contiene áreas pero también curvas suaves, filamentos, puntos de los que emanan múltiples ramas y otras cosas. Segundo: es realmente fascinante y tiene una historia muy interesante.

A principios del siglo XX, los matemáticos franceses Pierre Fatou y Gaston Julia desarrollaron un subdominio de las matemáticas llamado dinámica holomórfica. Estaban interesados en funciones particulares, actuando sobre números, usando algunas de las fórmulas más simples disponibles. Los números en cuestión son números complejos, cantidades representadas por dos coordenadas (como los puntos de un plano) llamadas partes reales e imaginarias. Fueron inventados en el siglo XVI por matemáticos para ayudar a encontrar las raíces de polinomios y la solución de ecuaciones, pero han encontrado aplicaciones amplias y profundas en matemáticas y ciencias físicas. Podemos sumar 2 números complejos, multiplicarlos o dividirlos y hacer muchas otras cosas. Fatou y Julia estudiaron las propiedades de ciertos sistemas dinámicos donde un número complejo varía de acuerdo con una regla simple que se repite una y otra vez: no hay necesidad de complicadas matemáticas aquí. (entonces, puedes olvidarte de la primera imagen…). Revelaron la riqueza de estos sistemas, definieron los conjuntos ahora llamados conjuntos de Julia, y estudiaron su auto-semejanza, por lo tanto, aspecto fractal… pero la palabra no existía en ese momento porque fue inventada mucho más tarde, por… ¡Benoît Mandelbrot!

Después del trabajo de los fundadores, este dominio cayó en el olvido. Cuando llegaron las computadoras, ayudaron a explorar una gran cantidad de fenómenos matemáticos que requerían computación intensiva, incluido el dominio abierto por Julia y Fatou. Así, cuando Benoît Mandelbrot decidió usar computadoras IBM en la década de 1980 para representar un cierto conjunto matemático relacionado con la dinámica holomórfica., obtuvo un dibujo muy atractivo y muy intrigante (primera imagen del apartado anterior).

¿Qué representa el conjunto de Mandelbrot? Básicamente, existe un sistema dinámico subyacente asociado a cada punto de la imagen. Las coordenadas del punto actúan como un parámetro ajustable. Diferentes puntos corresponden a diferentes conjuntos de Julia y dependiendo de su comportamiento, podemos decidir colorear el punto de una manera particular. El conjunto de Mandelbrot es el conjunto de parámetros para los que el sistema tiene una determinada propiedad.

¿Cómo calcular conjuntos de Mandelbrot y Julia?

Necesitamos entrar en un poco más de detalle sobre cómo calcular estos conjuntos. Los conjuntos de Mandelbrot y Julia se calculan mediante la iteración repetida de una fórmula simple, en nuestro caso z ^ n + c. z es un número complejo que representa las coordenadas de un punto en la pantalla. es un exponente entero, por lo que z ^ n es igual a z multiplicado por sí mismo n veces, y c es una constante.

Para el conjunto de Mandelbrot, para todos los puntos en el área de visualización, inicializamos z en 0. La constante c se toma igual al valor de las coordenadas del punto considerado y la fórmula se itera.

Aquí está la regla: un punto es parte del conjunto si la aplicación repetida de esta fórmula no diverge (es decir, no conduce a cálculos hacia números grandes). Se puede demostrar matemáticamente que si el resultado de la fórmula excede 2 (en módulo ya que estamos hablando de números complejos) la iteración divergerá. Entonces, para obtener colores bonitos rápidamente, detenemos la iteración cuando el módulo del resultado excede 2 y el color corresponde al número de esa iteración en particular. Si el número de iteraciones se vuelve demasiado grande (por tanto, si el punto es parte del conjunto de Mandelbrot) nos detenemos después de un umbral dado y asociamos el color negro a este punto.

El conjunto de Julia se calcula de manera similar pero los cálculos no se inicializan en 0 sino en el valor de las coordenadas del punto considerado y la constante c es elegida por el usuario y permanece igual para toda la imagen.

Eso es todo, espero que quede claro… Estas explicaciones ayudan a comprender mejor el resto de las instrucciones de uso.

Paso 2: ¿Qué necesitas?

¿Que necesitas?
¿Que necesitas?
¿Que necesitas?
¿Que necesitas?
¿Que necesitas?
¿Que necesitas?
¿Que necesitas?
¿Que necesitas?

Lista de materiales:

  • 1 placa ESP32
  • 1 pantalla TFT con pantalla táctil y lápiz
  • 1 tablero y alambres

Eso es todo. Costo total por debajo de 10 USD.

El ESP32 de Espressif es un microcontrolador de doble núcleo que funciona a 240 MHz, lo que lo convierte en un buen candidato para la computación repetitiva rápida y compleja. Tiene capacidades WiFi y Bluetooth que no uso en este proyecto.

El conjunto de instrucciones tiene un tamaño de 32 bits. La computación con variables de 16 y 32 bits es muy rápida, lo que permite cálculos precisos, lo cual es fundamental para el propósito de hacer zoom. En esta aplicación, para una pantalla de 320 x 240, una imagen está formada aproximadamente por 75.000 píxeles, cada uno de los cuales se calcula mediante un proceso iterativo que puede ejecutarse hasta 100 veces. Esto puede llevar a 7, 500, 000 cálculos unitarios, cada uno de los cuales es una exponenciación, es decir, varias multiplicaciones …

Entonces, la velocidad de cálculo es esencial aquí, pero la precisión es fundamental. Cuanto más haga zoom, menor será el tamaño de la parte del conjunto que se mostrará. Esto significa que cada uno de los 320 x 240 píxeles de la imagen representa un número muy cercano a sus vecinos. A medida que aumenta el zoom, aumenta esta proximidad.

Pero las imágenes fractales tienen la propiedad de que permanecen inalteradas mediante el escalado. Los pequeños detalles aparecen en todas partes y para cualquier factor de escala. La forma principal del conjunto de Mandelbrot, como se ve en la pantalla de la imagen de arriba, se puede encontrar en otro lugar en una versión mucho más pequeña, y se muestra si se acerca lo suficiente (ver en el video). Pero si la diferencia de coordenadas entre dos píxeles vecinos es demasiado pequeña para permitir que el ESP32 detecte su diferencia de comportamiento, debido a la falta de precisión, el efecto fractal no se puede mostrar …

Para obtener una buena precisión, el código utiliza flotantes, que el ESP32 codifica en 32 bits. Esto permite hasta 6 o 7 niveles de zoom. El uso de doble precisión (64 bits) habría aumentado esta profundidad de zoom, a costa de cálculos más lentos y, por lo tanto, tiempos más largos entre 2 imágenes.

Para que sea de doble precisión, simplemente cambie todas las apariciones de "float" a "double" en el código y ejecute el código. Recientemente hice una versión para una pantalla más grande (HVGA 480 x 320 píxeles): los flotadores de 16 bits tardan 3 segundos en mostrar la imagen, y los dobles tardan entre 10 y 20 segundos (3 a 6 veces más) pero admiten más de 15 niveles de zoom. La tercera imagen de este capítulo muestra el nivel de zoom 14 en la parte más a la derecha del conjunto de Mandelbrot.

Cómo conectar la pantalla:

Usé una pantalla SPI y los parámetros se establecen en el archivo User_Setup.h (en la carpeta de la biblioteca TFT_eSPI):

  • Controlador: descomente el controlador correcto para su pantalla. El mío era #define RPI_ILI9486_DRIVER
  • Números de PIN: vaya a la sección ESP32 del archivo y elija
    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Pin de control de selección de chip
    • #define TFT_DC 2 // Pin de control de comando de datos
    • #define TFT_RST 4 // Reset pin (podría conectarse al pin RST)
    • #define TOUCH_CS 22 // Pin de selección de chip (T_CS) de la pantalla táctil
  • Fuentes: no es necesario cambiarlas
  • Otras opciones: seleccioné las siguientes

    • #define SPI_FREQUENCY 20000000
    • #define SPI_READ_FREQUENCY 20000000
    • #define SPI_TOUCH_FREQUENCY 2500000

Todas las demás líneas del archivo están comentadas.

Calibrar la capacidad táctil de la pantalla

Si la selección de una parte de la pantalla o un botón no es precisa, o incluso totalmente incorrecta, ejecute el boceto de calibración táctil de la biblioteca TFT_eSPI y copie / pegue en el código la matriz que proporciona (asegúrese de usar el valor correcto para la orientación de la pantalla, 1 o 3 para paisaje).

Paso 3: Programa ESP32

Programa ESP32
Programa ESP32
Programa ESP32
Programa ESP32
Programa ESP32
Programa ESP32

El código se muestra en una pantalla táctil TFT de 320 x 240 y utiliza la biblioteca TFT_eSPI. Calcula conjuntos de Mandelbrot y Julia para varios valores de exponentes y le permite hacer zoom en áreas de interés para ver el aspecto fractal (es decir, la presencia de las mismas estructuras en cada cambio de escala).

El código adjunto es una versión para pantalla de 480 x 320. En esta versión, puede cambiar el tamaño (ancho y alto en píxeles) de la pantalla. La biblioteca TFT_eSPI define las conexiones en un archivo de configuración (adjunto) que debe colocarse en el directorio de la biblioteca.

El código comienza mostrando las instrucciones de funcionamiento (ver imagen y video)

La mayor parte de la pantalla está reservada para mostrar imágenes, los botones táctiles están disponibles en el lado derecho de la pantalla:

  • R: realiza un "reset", i. mi. muestra la imagen a su escala máxima,
  • U: "deshacer" le permite volver al paso anterior (si la región ampliada no es interesante, puede elegir otra parte de la imagen para ampliar),
  • M o J: te permite cambiar del conjunto de Mandelbrot al conjunto de Julia y viceversa.

Las etiquetas de algunas teclas cambian según el contexto: muestran la función que se ejecutará si se presionan. Entonces, si actualmente muestra el conjunto de Mandelbrot, la tecla M / J muestra J, ya que si la presiona, mostrará el conjunto de Julia (y viceversa).

Lo mismo se aplica a la elección de la paleta de colores. Empezamos con la paleta verde. La tecla propone la siguiente paleta (la azul). Las paletas son: rojo, verde, azul, gris, paleta 1, paleta 2 y volver al rojo. Los dos últimos son tests de paleta multicolor que aportan más contraste, permitiendo ver mejor algunos detalles.

La tecla con un número le permite elegir el exponente n, en un ciclo de 2 a 7 (y de regreso a 2). Con el mismo espíritu, muestra 3 si actualmente está en 2 …

Finalmente, al visualizar el conjunto de Julia, es necesario elegir el valor de la constante c: la tecla C permite hacerlo, gracias a un selector (ver segunda imagen). El valor de esta constante se muestra con el conjunto.

Al hacer clic en la imagen, se amplía el punto seleccionado. Se muestra un pequeño círculo en el punto tocado y un rectángulo resalta la zona ampliada del conjunto.

La tercera imagen muestra que los tiempos de computación permanecen entre 0,8 y 1,2 segundos para 320 x 240 píxeles, lo que hace que sea cómodo para hacer zoom y visualizar. Alcanza los 3 segundos para 480 x 320 píxeles, pero proporciona más detalles.

Paso 4: Explicación de algunas imágenes …

Algunas imágenes explicadas …
Algunas imágenes explicadas …
Algunas imágenes explicadas …
Algunas imágenes explicadas …
Algunas imágenes explicadas …
Algunas imágenes explicadas …

El cuadro más grande es el conocido set de Mandelbrot. Los números complejos utilizados en esta imagen van de -2,1 a +0,7 en abscisas y de -1,2 a 1,2 en ordenadas. Si hace zoom en la parte más a la izquierda de esta primera imagen, es probable que finalmente obtenga la segunda, que muestra una versión más pequeña del conjunto original que se encuentra en la punta más a la izquierda del conjunto. Para ambas imágenes, el exponente ('n') es igual a 2: ese es el valor que se usa normalmente para mostrar conjuntos de Mandelbrot.

Si cambia este valor a 3 (simplemente haga clic en la tecla que dice 3), obtendrá la tercera imagen. Una diferencia obvia es el factor de simetría: n = 2 da una simetría axial (es decir, el conjunto es simétrico contra el eje horizontal mediano), pero con n = 3 la imagen se vuelve invariante por rotación de 120 ° (un tercio de 360 °, rotación factor de simetría de 3). Y conserva sus propiedades fractales, que puede verificar haciendo zoom en los bordes de la forma negra.

La cuarta imagen es un conjunto de Julia obtenido después de seleccionar un valor de coeficiente igual a 0.414 en abscisas y 0.09 en ordenadas. Se elige la paleta roja, como puede verse por la tecla verde de la derecha (siendo el verde el siguiente color a elegir). La quinta imagen muestra el mismo tipo de conjunto de Julia, que representa una parte imaginaria superior de la constante (0,358).

Espero que disfrutes jugando con este programa y que puedas mostrar bonitas imágenes fractales. No dudes en explorar los sets de Mandelbrot y Julia, y jugar con las paletas: ayudan a identificar algunos detalles que pueden no ser visibles con los simples monocromáticos. Incluso puede descubrir algunos paisajes fractales que nadie ha visto antes …

_

¿Quieres descubrir más imágenes fractales? Simplemente haga clic aquí o explore el arte fractal o incluso el fractal ascii. Tal vez este instructivo te haga querer crear imágenes tan geniales …

Concurso Hecho con Matemáticas
Concurso Hecho con Matemáticas
Concurso Hecho con Matemáticas
Concurso Hecho con Matemáticas

Segundo premio en el concurso Made with Math

Recomendado: