Translate this page

Mostrando entradas con la etiqueta 3D. Mostrar todas las entradas
Mostrando entradas con la etiqueta 3D. Mostrar todas las entradas

viernes, 2 de enero de 2015

Algoritmos genéticos: resolución de problemas y vida artificial (evolución y algoritmos, parte 2)


¿Puede el mecanismo de la evolución biológica ser reproducido de manera artificial para nuestro beneficio?

En la entrada anterior veíamos que la evolución biológica puede concebirse como un proceso algorítmico en el que el azar de las mutaciones se convierte en complejidad organizada a través de la selección natural. Veremos ahora cómo este algoritmo puede ser ejecutado en programas de ordenador y robots, como forma de dar a estas entidades artificiales capacidades de aprendizaje y resolución de problemas complejos.


Computación evolutiva: algoritmos genéticos


Como vimos en la entrada anterior, ya en 1932 se propuso la idea de que la evolución operaba como un sistema que buscaba los máximos en un 'paisaje adaptativo', y por tanto podía concebirse como un proceso de optimización.


A partir de los años 60 surge el concepto de computación evolutiva. Aprovechando el desarrollo de los primeros ordenadores prácticos, se trató de simular en ellos los mecanismos evolutivos para:
  • Simular el funcionamiento de la evolución y comprobar hipótesis teóricas, por ejemplo de estadística de poblaciones
  • Intentar resolver problemas de optimización fuera del ámbito de la biología (luego veremos varios ejemplos)
La técnica de computación evolutiva más conocida son los algoritmos genéticos. Sus elementos principales son una réplica informática de los elementos que actúan en la evolución biológica:


  • Una forma de representar cada posible solución del problema utilizando una lista de valores numéricos. Esta lista de valores hace el papel del genotipo, de los cromosomas o genes de un individuo que va a evolucionar, pero en lugar de estar escrito en el código genético del ADN está formado por una lista de números que representa una posible solución. Por ejemplo, si se trata de representar la forma de una figura articulada, estos números del genotipo pueden representar los tamaños, posiciones, movimientos, etc. de las diferentes partes de la figura.


  • Dispondremos en cada paso de tiempo (t) de una población de individuos P(t), cada uno con su propio genotipo.


  • Cada individuo o posible solución podrá ser evaluado para obtener un valor numérico de su adaptación o fitness. Por ejemplo, si estamos buscando el diseño de un robot que camine o nade, su adaptación será más alta cuanto menos tiempo necesite para llegar de un sitio a otro, menos energía consuma, etc.


  • Los individuos que tengan un nivel más alto de adaptación son los que se reproducirán para crear individuos de la siguiente generación. Este mecanismo simula la selección natural o artificial.

  • Los descendientes que aparecen en la siguiente generación se forman mediante el cruce de los genotipos de sus 'padres', simulando la reproducción sexual. Es decir, su genotipo se construirá tomando trozos de los genotipos de cada progenitor y uniéndolos. De esta manera, una mejora parcial en un progenitor puede combinarse con otra mejora parcial en un lugar diferente del genotipo de otro progenitor para producir una descendencia con mayor adaptación aún.


  • Además, el genotipo de cada nuevo individuo puede sufrir mutaciones que simulan los errores de transcripción genética que se producen de forma natural. Para generar una mutación no hay más que cambiar al azar alguno de los valores que forman el genotipo del individuo.


  • Por último, un mecanismo de control se encarga de generar una población inicial con genotipos al azar y repetir los mecanismos anteriores hasta que se consiga uno o más individuos con el grado de adaptación deseado, es decir, que sean buenas soluciones al problema de optimización planteado.
El siguiente pseudocódigo resume el proceso:


Aquí tenéis una explicación excelente (en inglés), parte de los cursos gratuitos del MIT:


Y aquí una presentación sencilla en español, con un ejemplo de cálculo de rutas:


También podéis encontrar un curso gratuito en Web.

Resolviendo problemas


Una primera utilidad de los algoritmos genéticos no tiene a primera vista nada que ver con la evolución, sino con la necesidad de buscar una solución para problemas que son intratables mediante métodos matemáticos clásicos, como algunos problemas de optimización

Como vimos en la entrada anterior, la evolución puede verse como un sistema de búsqueda de aquellas combinaciones genéticas que producen fenotipos óptimos (con mayor grado de aptitud). Los algoritmos genéticos pueden utilizarse para resolver problemas en los que existe un número grandísimo de posibles soluciones repartidas en un enorme espacio de búsqueda. Pueden verse, por tanto, como una variante de los métodos numéricos de 'hill climbing' o búsqueda de puntos máximos.


Un algoritmo genético puede encontrar muchas posibles soluciones (genotipos) más o menos óptimos que irán mejorando con el número de iteraciones o ciclos del algoritmo, aunque no tenemos garantizado que se llegue a encontrar la mejor solución posible (máximo global), ya que ésta podría encontrarse en la 'cima' de una 'montaña' aislada o de difícil acceso.


Un ejemplo sencillo de problema de optimización es el que consiste en aproximar una imagen compleja mediante elementos sencillos como círculos. No es que sea algo especialmente útil, pero sirve para demostrar que a partir de un proceso aparentemente azaroso podemos solucionar un problema que es inabordable mediante métodos matemáticos clásicos (ecuaciones, etc.).

En los dos videos siguientes vemos cómo la aproximación con un número constante de círculos va mejorando a medida que progresan las generaciones del algoritmo genético:




En el siguiente vídeo los algoritmos genéticos son utilizados para buscar soluciones novedosas al diseño de turbinas. Un aspecto interesante de estos métodos (y veremos más adelante algunos ejemplos con criaturas artificiales) es que los resultados son muchas veces inesperados, con soluciones que a nadie le hubieran parecido interesantes a priori pero que resultan ser prácticas.


Otro problema de optimización complejo es el diseño de estructuras de soporte en arquitectura. Aunque sabemos estudiar las propiedades físicas de estructuras ya diseñadas, no sabemos resolver de forma matemática el problema inverso: diseñar nuevas estructuras que sean óptimas.


En el siguiente ejemplo tenemos unas criaturas acuáticas simplificadas que tienen que evolucionar para optimizar la cantidad de comida a recoger (los cuadraditos verdes).


Aprendizaje automático


Podemos ver a partir del ejemplo anterior que los algoritmos genéticos funcionan también como un método de aprendizaje automático. A medida que avanzan las generaciones y se produce la selección de las mejores soluciones, el sistema aprende a resolver una tarea de manera más eficiente.

Tenemos aquí el ejemplo de un sencillo vehículo que aprender a conducirse de forma eficiente en un circuito con pendientes:

Y en este otro unas estructuras articuladas que aprenden a ponerse de pie 'ellas solas' mediante un algoritmo genético:


En este caso se trata de aprender a saltar de forma adecuada para evitar una bola. Como siempre vemos la evolución de más generaciones va produciendo una mejora u optimización progresiva.


¿Problemas con las prácticas del carnet de conducir? No pasa nada. Algún día los coches conducirán por ti:


En este capítulo de Redes, Eduard Punset entrevista a Alan Winfield, especialista en robótica colectiva, hablando del aprendizaje de los robots y la relación con el concepto que cultura, una discusión que abordaremos en la entrada siguiente:


Criaturas virtuales


De los ejemplos anteriores resulta inmediato pensar que podemos utilizar algoritmos genéticos para simular la evolución de criaturas virtuales que aprendan a desenvolverse en un entorno simulado. Dicho de otra forma, podemos replicar la evolución en un entorno virtual.

A principios de los 90, William Latham desarrolló lo que llamó Arte Orgánico, utilizando algoritmos genéticos para modelar la evolución espontánea de seres artificiales de apariencia orgánica utilizando sistemas pioneros de animación 3D:


Aquí tenemos a Latham explicando su técnica en una conferencia:


Prácticamente al mismo tiempo, Karl Sims desarrolló técnicas que combinaban redes neuronales artificiales y algoritmos genéticos en su sistema Evolved Virtual Creatures.

Juntando formas muy sencillas de maneras aleatorias, el software de Karl Sims era capaz de hacerles evolucionar para que se movieran sobre el suelo o nadaran, descubriendo formas inesperadas de locomoción. Podemos ver algunos ejemplos de las animaciones originales de Sims en esta conferencia de Daniel Dennett titulada precisamente "¿Es la evolución un proceso algorítmico?":


En esta otra conferencia vemos ejemplos de cómo pueden evolucionar conductas de lucha por un objeto (que puede representar comida, por ejemplo) o de emparejamiento. En esta conferencia además es interesante la última parte, donde se explica cómo los algoritmos evolutivos generan complejidad o entropía negativa. Pero de eso intentaré hablar en otra entrada.


Una versión más reciente del software de Karl Sims es el 3DVCE, que puede descargarse aquí. En el siguiente vídeo podemos ver ejemplos de sus resultados:


Más ejemplos de programas similares:


Como he comentado, un aspecto interesante de estos sistemas de aprendizaje es que pueden descubrir soluciones inesperadas. ¿A quién se le hubiera ocurrido desplazarse de esta manera?


El siguiente paso sería que el algoritmo evolutivo no solamente pueda optimizar la forma de mover una estructura determinada, sino también ir cambiando los elementos que la componen y sus articulaciones:


Como uno puede ver observando en el mundo real a un animal recién nacido que intenta andar o mantenerse en pie al nacer, no es trivial realizar estas tareas. Requieren un sistema de control muy sofisticado y un proceso de aprendizaje que puede durar minutos o meses (nuestro caso).

Los algoritmos genéticos, muchas veces en combinación con redes neuronales simuladas, se han utilizado para estudiar estos procesos aparentemente sencillos pero que requieren un aprendizaje por prueba y error. Mediante estas técnicas, las criaturas artificiales puede aprender lo que nosotros hacemos de forma inconsciente:



Incluso parece que es posible aprender virtualmente a columpiarse:



Robots que evolucionan


Las técnicas anteriores de evolución y aprendizaje en criaturas virtuales pueden aplicarse también a seres físicos. Concretamente, se utilizan para que los robots puedan aprender a moverse, conducir y realizar otras tareas, en lo que se ha denominado Robótica Evolutiva.

Como hemos visto en el caso de las criaturas virtuales, se suelen combinar dos métodos de aprendizaje automático: los algoritmos genéticos y las redes neuronales artificiales. El segundo método sirve sobre todo para aprender la parte perceptiva y de control motor.


Aquí tenemos una versión española de la araña robótica más común de cuatro patas, y podemos ver cómo probando diferentes movimientos va poco a poco aprendiendo a controlar su desplazamiento:


Esta versión más sofisticada, de seis patas, ha aprendido a mantenerse estable en diferentes situaciones:


Esta tecnología puede desarrollarse hasta conseguir resultados tan espeluznantes como los de la empresa Boston Dynamics, recientemente adquirida por Google.


Vida artificial


Combinando la aportación de los algoritmos genéticos al software y el hardware de las criaturas artificiales, podemos considerarlos como una herramienta esencial para el desarrollo de la vida artificial no biológica, en dos sentidos:
  • Como método de aprendizaje automático, los algoritmos genéticos son una forma para que las criaturas artificiales se entrenen y desarrollen adaptaciones individuales al entorno real o virtual en el que 'viven'.
  • Como mecanismo de evolución, permiten que sucesivas generaciones de las formas de vida artificial vayan mejorando y diversificándose.



En la evolución biológica, en contra de las teorías pre-darwinianas de Lamarck, las adaptaciones que los individuos consiguen durante sus vidas NO se transmiten a su descendencia. Sin embargo, en una criatura artificial nada nos impide combinar los dos elementos anteriores, aprendizaje individual y mejora de una generación a otra.


El sueño de Lamarck podría por tanto cumplirse para las criaturas artificiales: los caracteres adquiridos por una criatura artificial SI podrían transmitirse a su descendencia, lo que haría que la evolución de estas criaturas fuera mucho más rápida que la evolución biológica. 

Quizás algún día no muy lejano llegaremos a ver compañeros robóticos tan evolucionados como éste:


Pero de momento su comportamiento no es el resultado de un proceso de aprendizaje y evolución automática, sino de la mente calenturienta de un humano:



Para evolución artificial ultrarrápida, este impresionante anuncio de Saturn:


Otras aplicaciones


¿Para qué querríamos criaturas artificiales que evolucionen solas? En la Tierra ciertamente podrían ser un peligro, pero podrían constituir una herramienta poderosa para la conquista del cosmos, sobre todo si pudieran replicarse para transformar un planeta o asteroide inhabitable en un mundo apto para los humanos.


Es la idea de las sondas autorreplicantes, que propuso inicialmente el famoso matemático John Von Neumann. El problema sería cómo controlar posteriormente a estas criaturas evolucionadas, si se convirtieran en una amenaza para nosotros. 


Una aplicación muy curiosa y útil que me ha sorprendido es la de encontrar y arreglar errores en programas de ordenador. Si los algoritmos genéticos pueden resolver este problema, ¡desde luego demostrarán su utilidad! (mi entusiasmo no tiene que ver con el hecho de que me dedique a desarrollar software, ja, ja).


Y como sucede con otros métodos algorítmicos, siempre parece haber alguien que los encuentra útiles para producir música de forma automática:




Vemos que el campo para la aplicación de algoritmos evolutivos es muy amplío.

Cabe preguntarse ahora si además de los seres vivos, las criaturas virtuales y los robots, también las ideas y productos de la cultura humana evolucionan de la misma forma. ¿En qué consiste exactamente la llamada 'evolución cultural'? Hablaré de ello en la próxima entrada.

Hasta entonces,

    Salvador




domingo, 22 de junio de 2014

Fractales: la geometría infinita


¿Cómo surge la complejidad a partir de lo simple? ¿Por qué vemos las mismas estructuras repetidas por doquier en la naturaleza? Para responder a estas preguntas tenemos que recurrir a unos objetos geométricos que son a la vez extraños y omnipresentes, los fractales.


Como prueba de su omnipresencia, en el blog hemos visto ya los fractales en acción en varias entradas: al hablar de universos anidados en la mitología hindú, curvas capaces de rellenar un plano, la dinámica de conflictos entre los personajes de una historia, la estructura narrativa, la densidad de materia en el espacio y ejemplos de animaciones psicodélicas.



Históricamente, el primer objeto matemático con características fractales fue definido por el matemático Karl Weierstrass en 1872. Pero los fractales no se popularizaron y trataron rigurosamente hasta el trabajo del matemático Benoit Mandelbrot en los años 1970, ayudado por los ordenadores como instrumento de cálculo e investigación.


 

Hoy en día las técnicas fractales son ubicuas en campos como los sistemas dinámicos no lineales (caos), los efectos especiales, la compresión de datos, modelos del mercado bursátil, análisis y generación automática de música, etc.



¿Qué es un fractal?


Un fractal es un objeto que puede 'vivir' en un espacio de 1, 2, 3 o cualquier número de dimensiones, y que se caracteriza por:
  • Ser autosimilar: la forma de la totalidad de un fractal es igual o muy similar a la de sus partes. Aquí podéis verlo en un extracto del documental que encontraréis completo al final:





Podemos ver aquí otro ejemplo de autosimilaridad en la función de Weierstrass, el primer objeto fractal que fue definido:


Y otro ejemplo más, bastante tenebroso:

  • Como consecuencia de la autosimilitud, el fractal es aproximadamente igual en cualquier escala de detalle.

Por ejemplo, al observar una fotografía de un terreno natural como la siguiente resulta prácticamente imposible saber cuál es su escala de tamaño: ¿10 metros, 100 metros, 1000 metros...?


... hasta que no tenemos como referencia otros objetos de tamaño conocido:


En las películas antiguas se utilizaba frecuentemente esta característica para crear efectos especiales en los que las maquetas o monstruos aparecían mucho más grandes de lo que eran en realidad.


  • En un fractal definido matemáticamente, la autosimilitud se aplica a todas las escalas de detalle, lo cual implica que el fractal tiene detalles infinitamente pequeños. Aunque escojamos una parte muy pequeña, esa parte es igual de compleja que el todo. Esta propiedad se ha explotado visualmente para hacer increíbles animaciones en las que nos 'zambullimos' en escalas cada vez más y más pequeñas dentro del fractal, donde podemos encontrarnos de nuevo con el objeto del que partimos:


  • El trabajo original de Weierstrass se originó en la necesidad de demostrar que era posible tener una curva continua (sin roturas) pero que no sea suave en ningún punto. El concepto matemático se denomina no diferenciabilidad. En términos sencillos, significa que cualquier punto que escojamos en un fractal es un 'pico': no podemos definir la línea tangente, porque no hay ni una sola zona suave donde medirla.
Esta propiedad de no-diferenciabilidad se relaciona con otras extrañas características de los fractales: la imposibilidad de calcular medidas como valores medios, longitudes y áreas. Dependiendo de la escala de detalle que utilicemos para realizar estas medidas obtendremos un valor u otro, y éste irá variando también como un fractal. De hecho el artículo original de Mandelbrot sobre los fractales se llamó "¿Cuán larga es la costa de Gran Bretaña?". En él demostró que la medida de longitud no tenía sentido para un fractal. La longitud de la costa de Gran Bretaña se va haciendo más y más grande a medida que la vemos a mayor detalle.


En lugar de las medidas habituales, para los fractales utilizamos la dimensión fractal. Su definición matemática no es trivial, pero el significado tiene que ver con qué parte del espacio en el que vive puede rellenar el objeto fractal.



Así, un objeto fractal que vive 'dentro' de una línea (las líneas tienen dimensión 1), tendrá una dimensión fractal entre 0 y 1. Cuando más rellene la línea, más cerca estará de la dimensión 1.

Los fractales que viven en un plano (2 dimensiones) tendrán una dimensión fractal entre 1 y 2 (como en la figura anterior), y así sucesivamente para cualquier número de dimensiones.

En esta página podéis ver muchos objetos fractales clasificados por el valor de su dimensión.

Fractales que viven en una línea


En 1883, poco después del trabajo de Weierstrass, Georg Cantor, que estudiaba las propiedades de conjuntos infinitos, demostró algo curioso: definió un conjunto de puntos contenido en un segmento de línea de longitud 1, cuya medida era nula (puestos todos los puntos juntos su longitud era cero, no rellenaban ningún espacio en la línea en sentido clásico), y sin embargo el número de puntos en este conjunto de Cantor era infinito e igual al número de puntos que formaban todo el segmento.
Este conjunto, también llamado 'polvo de Cantor', puede formarse eliminando sucesivamente (hasta el infinito) el tercio central del segmento de línea y de los segmentos que resultan:



La dimensión de este conjunto es menor que uno, concretamente Log(2)/Log(3)=0.631.

El conjunto de Cantor muestra claramente que un fractal puede ser un conjunto disconexo de puntos, aunque otros muchos fractales sí son conexos y continuos, como los que veremos a continuación.

Fractales en el plano


Ya hemos visto que la función de Weierstrass forma una curva fractal en el plano. En 1904, Helge von Koch definió una curva con propiedades similares a la de Weierstrass: el copo de nieve de Koch.

En este caso la curva se forma añadiendo recursivamente triángulos cada vez más pequeños sobre los lados de la curva de nivel anterior:  


Nos encontramos de nuevo con un objeto autosimilar, igual en todas las escalas y con picos en cada uno de los puntos de la curva:

La dimensión fractal de la curva de Koch es log 4/log 3 ≈ 1.26186. 

Curiosamente, si utilizamos copos de Koch de dos tamaños podemos cubrir el plano sin huecos. Sus bordes infinitamente detallados encajan perfectamente:



Como vimos en esta entrada, existen otras muchas curvas de tipo fractal (Peano, Hilbert, Moore, Sierpinksi) que rellenan el plano de forma sistemática (todos los puntos del plano pertenecen a la curva), y por tanto tienen una dimensión fractal igual a 2.



En 1915, Waclaw Sierpinski construyó su triángulo y un año después su alfombra:


A pesar de que estas figuras parecen tener área, son conjuntos de medida nula: en el límite infinito no rellenan ninguna parte del plano en el sentido convencional. Sin embargo, podemos definir su dimensión fractal. La dimensión del triángulo es:

D_{HB} = \frac{\ln 3}{\ln 2} \approx 1,58496\dots

Y la de la alfombra, que intuitivamente parece 'cubrir más área', es 1,892789...


Rellenando el espacio


Es fácil extender a 3 dimensiones muchos de los objetos que hemos visto antes. Por ejemplo, si vamos eliminando los tercios que bisectan cada cara de un cubo podemos generar un conjunto de Cantor tridimensional:


También podemos construir con un tetraedro una figura 3D similar al triángulo de Sierpinski: 


O utilizan un cubo, en lugar de un cuadrado, para construir una alfombra de Sierpinski en 3D:


Hay sistemas sencillos de generación de fractales que pueden dar resultados espectaculares en 3D. Por ejemplo, el programa Mandelbulb es un sistema de visualización y animación 3D especialmente pensado para fractales.

Aquí tenemos un ejemplo digno de M.C. Escher:



Fractales iterativos en el campo complejo: Julia y Mandelbrot


Viendo los anteriores ejemplos de fractales definidos por fórmulas matemáticas, podríamos pensar que con unas reglas de construcción sencillas obtenemos siempre estructuras repetitivas y simples.

Sin embargo el mundo de los fractales dio una gran sorpresa a través del trabajo de Mandelbrot y otros que tuvieron acceso a ordenadores para ejecutar cálculos repetitivos de forma rápida. En particular, a partir del estudio del comportamiento de los polinomios de variable compleja, se descubrió que la iteración de una expresión como...

(siendo Zi un número complejo = x + y.i, que se puede representar en un plano con su parte real x e imaginaria y)

... tenía un comportamiento muy extraño cuando la iteración se repetía un número grande de veces. El valor de Zn se podía hacer muy grande, o bien quedarse pequeño. Al dibujar en el plano los puntos Z que tras muchas iteraciones seguían siendo pequeños (cercanos al centro) apareció una figura (el conjunto de Mandelbrot) cuya complejidad resultaba asombrosa.


Mandelbrot demostró que este conjunto cumplía todas las características de un fractal, pero a pesar de estar definido por una fórmula tan sencilla y de su carácter autosimilar, la variedad de estructuras que se encontraban en su interior era infinita y eternamente fascinante, como un zoo matemático sin fin, lleno de una multitud inagotable de criaturas siempre nuevas.

El número de imagenes y animaciones del conjunto de Mandelbrot es incontable, y existen paquetes de software que permiten explorarlo por cuenta propia. Os pongo aquí solamente una pequeña muestra:




Esta animación representa uno de los zooms más profundos hacia el interior del conjunto realizados hasta la actualidad. Como vemos, nos encontramos en varias ocasiones con versiones más pequeñas del mismo conjunto, lo que demuestra su autosimilaridad:


La idea del conjunto de Mandelbrot se generalizó rápidamente para un conjunto de funciones complejas que dan lugar a los llamados conjuntos de Julia, pudiendo pasarse de un conjunto a otro sin más que cambiar unos pocos valores numéricos.





En este didáctico video podéis ver la explicación del proceso de cálculo de los conjuntos de Julia en forma gráfica:


También es posible generalizar a 3D las fórmulas de los conjuntos de Julia para obtener una visión tridimensional:


Aquí tenéis otro de esos videos de zoom casi infinito, esta vez de un conjunto de Julia:


Más allá del 3D


Como hemos comentado, podemos crear fractales con cualquier número de dimensiones. Una opción para tener más de tres dimensiones es utilizar el tiempo, introduciendo cambios en los fractales. Estos videos han sido generados con el programa Mandelbulb comentado antes, y utilizan este efecto de cambio temporal:



A la inversa, si creamos un fractal en cuatro dimensiones y hacemos un 'corte' en 3D que se mueva a su través, lo que vemos es un fractal que parece animarse con el tiempo:


Esta técnica se usa, por ejemplo, para generar nubes fractales animadas. Aquí vemos el mismo método aplicado al conjunto de Mandelbrot, mostrando una especie de 'fantasma' 3D del conjunto en cuatro dimensiones:


Obviamente es posible generar fractales de dimensiones aún más grandes, pero resultaría muy difícil visualizarlos.

Fractales de similaridad no exacta


Hasta ahora hemos hablado de fractales generados a partir de fórmulas matemáticas o construcciones geométricas. Sin embargo, los procesos de la naturaleza, las leyes de la física, la biología o el mercado de valores pueden crear también estructuras fractales, debido a su naturaleza de sistemas no lineales con tendencias opuestas de contracción y expansión.

En estos fractales naturales la autosimilitud no es exacta, sino en promedio. Se sigue dando el fenómeno de la indistinguibilidad de escalas como que en los fractales matemáticos, aunque los patrones no se repiten de forma exacta en los diferentes niveles de detalle.

Otra característica de los fractales naturales es que la dimensión fractal no permanece constante en todas las escalas. Por ejemplo, un terreno natural puede tener una dimensión más 'rugosa' en una escala de detalle (más salientes debidos a las rocas y piedras individuales) y dimensión más 'suave' a gran escala, debido a efectos de la erosión. Este hecho se utiliza al generar terrenos sintéticos para efectos especiales.







En este video del programa Redes vemos con claridad varios ejemplos de cómo la naturaleza utiliza las formas fractales:


Y en este otro episodio de Redes, el incombustible Punset entrevista al 'creador' mismo, Monsieur Mandelbrot, acerca de la relación de los fractales con la naturaleza y el arte:


En particular, algunos fractales naturales, como las formas en espiral de galaxias y flores, se producen como consecuencia de la autosimilitud de la razón áurea. Se trata de los llamados fractales de Fibonacci:


Un terreno insospechado donde aparecen las formas fractales es en la evolución de los mercados de bolsa, y en particular en los valores de la acciones y los índices bursátiles. Por ejemplo, si uno observa estas gráficas resulta imposible saber cuál es su escala de tiempo. La evolución del mercado en una semana es similar (con el factor de escala correspondiente) a la evolución en un año o en diez años, aunque obviamente la autosimilitud es solo estadística (si fuera exacta sería muy fácil predecir la bolsa).


La razón de la naturaleza fractal de los valores es la dinámica no lineal que subyace a los mercados por las dos tendencias opuestas que los dominan: vender (baja los valores) y comprar (los sube). Sin embargo, el consenso es que precisamente por la naturaleza caótica de estos sistemas, la estructura fractal no es de mucha ayuda para realizar predicciones.

Un área donde la aplicación de los fractales ha sido muy fructífera es en el análisis de estructuras en música y en plástica. Por ejemplo, se pueden caracterizar diferentes autores o estilos, incluso épocas del mismo autor, por el uso de diferentes dimensiones fractales.




Se especula también sobre en qué medida la dimensión fractal y sus variaciones tienen influencia en nuestra percepción de la belleza en objetos naturales y artísticos. Lo que es cierto sin duda es que nuestro cerebro identifica y responde a esta información.

Además de usarse para generar imágenes, la teoría fractal se utiliza cada vez más para generar música de forma automática, con características similares a la compuesta por humanos. Un ejemplo es el programa FracMus, desarrollado por un pianista y compositor español, Gustavo Díaz-Jerez. Otro ejemplo es el software Tune Smithy.

Aquí tenéis un par de ejemplos de música fractal:



La estructura fractal de la música sirve también de inspiración a un grupo del MIT para crear nuevos materiales con sorprendentes propiedades.

Métodos de generación


¿Cómo podemos generar un objeto fractal? Una idea es recrear su compleja forma a partir de unas reglas sencillas de autosimilaridad, lo que podemos conseguir de varias formas:
  • Construcción recursiva: un fractal de nivel N se dibuja o construye con los de nivel N-1, y así hasta llegar a un nivel básico que es la forma elemental. Esta es la forma en que se construyen curvas como la de Koch, Peano, etc., y figuras como las de Sierpinksi. A continuación tenemos un ejemplo un poco más complicado: la curva dragón (llamada así por que parece dibujar la forma de un dragón):

  • Una técnica para formalizar este tipo de construcción recursiva utiliza las llamadas gramáticas formales, que indican cómo un símbolo se sustituye por otros, lo cual se puede hacer de manera repetida. Un ejemplo particularmente útil son los L-sistemas, utilizados para representar procesos de crecimiento natural como los de ramificación de árboles y plantas. Variando las reglas gramaticales y diversos parámetros numéricos que aparecen en ellas, se pueden crear una gran variedad de estructuras de aspecto natural:




Los L-sistemas no solo pueden utilizarse para crear estructuras geométricas, sino también sonidos, como en este ejemplo:


  • Otra forma de generación relacionada con la autosimilaridad es el método basado en Sistemas Iterativos de Funciones. La idea es construir varias tranformaciones geométricas, cada una de las cuales representa una correspondencia o autosimilaridad en el fractal, y luego aplicar de forma iterada y sucesiva estas funciones de transformación a un punto. El resultado es que, aunque parezca sorprendente, las sucesivas posiciones del punto van dibujando el fractal completo.

Por ejemplo, el conjunto de Cantor puede generarse utilizando las dos funciones 

  y

para valores de x entre 0 y 1.

El ejemplo más clásico de este sistema de generación es el helecho de Barnsley. En este caso se utilizan tres funciones de autosimilaridad, una para la parte superior y otras dos para las partes inferiores derecha e izquierda, cada una de ellas igual al helecho completo:


Aquí podéis ver cómo se va formando la figura añadiendo sucesivos puntos en los lugares dados por una de las funciones de transformación del sistema, escogida aleatoriamente entre las tres.



Hay otros sistemas de generación de fractales que no se basan en reproducir la autosimilaridad. Por ejemplo, hemos visto los sistemas de iteración de funciones complejas para los conjuntos de Mandelbrot y Julia, en los que se comprueba el tiempo de escape para determinar si un punto pertenece o no al conjunto. Este tiempo se escape se utiliza para asignar los diferentes colores que vemos en las imágenes y vídeos.

Para los fractales de similaridad estadística hay que utilizar métodos que incluyan un elemento de azar, pero cuya variación resulte definida según la escala.

Para ciertas estructuras que se forman en la naturaleza por agregación de partículas (caso de los copos de nieve, por ejemplo) se reproduce por ordenador este proceso de agregación sucesivo.




Para los fractales definidos como una función de altura sobre una o más variables (por ejemplo, una curva de una función y=f(x), o una superficie de un terreno o del agua: z=f(x,y) ) podemos utilizar un método de subdivisión, como se ve estupendamente en el siguiente video, en el que se pega también una textura fractal sobre el terreno para conseguir un mayor realismo.


Con el mismo propósito podemos utilizar también el método de superposición de ondas, bien mediante el método de síntesis de Fourier (ondas sinusoidales) o con ondículas (wavelets). Si sumamos ondas de frecuencia cada vez mayor, disminuyendo al mismo tiempo su amplitud, conseguimos una superficie que es estadísticamente autosemejante.

Este método se usa con gran realismo para simular el oleaje en el mar:


Aquí tenemos una sencilla aplicación basada en ondículas para generar un terreno fractal:



Para terminar con los fractales, este magnífico documental sirve como resumen de todo lo que hemos tratado:



Fractales y seudociencia


Por desgracia, al igual que sucede con el término 'cuántico', en muchas ocasiones hay una apropiación del término 'fractal' para dar un aire serio a ideas pseudocientíficas.

Pongo aquí algunos ejemplos que he encontrado mientras buscaba información. Ojo avizor.
  • ¿Estructura fractal de la Biblia?

  • 'Ciencia fractal' y alimentación cuántica' (!?)

  • Otro pupurri pseudocientífico que mezcla lo 'cuántico' y los 'fractales'

  • Curación con fractales

  • Pseudofractales para inversionistas incautos


Pues hasta la próxima. Tengan cuidado ahí fuera  ;-)

   Salvador