jueves, 29 de marzo de 2012

Asteroides blandos

Para los que no lo sepáis, gran parte de mi investigación consiste en estudiar el transporte de sedimentos (arena, generalmente) por una corriente de agua. Para ello lo que hacemos es considerar que, en las escalas en las que estamos interesados, el sedimento se comporta como si fuera un fluido continuo.

El resultado final son unas ecuaciones bastante largas que modelan, por un lado el agua y por otro el sedimento considerado como un fluído, con un par de términos de interacción entre ambos.

Como imaginaréis, el sedimento no se comporta exatamente como un fluído. Entre otras cosas, las colisiones entre moléculas son elásticas, mientras que las colisiones entre granos de arena no lo son. Existen también fricciones entre granos y otros detalles más. Eso implica que tanto la presión como las fuerzas viscosas requieren un tratamiento distinto. En resumen, lo que se hace es modelar los granos de arena como esferas (lo típico), introducir un par de coeficientes de pérdida de energía (fricción, inelasticidad) y usar la teoría cinética de gases densos.

Esta es, para mí, la parte divertida. La parte aburrida es que mi futuro, una vez que mi programa esté funcionando, consistirá en estudiar cómo se va erosionando léntamente el terreno cercano a un pilar sujeto a oleaje. ¡Apasionante!

Pero aún hay esperanzas. Estoy yendo a una clase sobre fluídos granulares. En ella se estudian todo tipo de flujos de este tipo: avalanchas de rocas secas, avalanchas de rocas no tan secas, avalanchas de rocas cayendo al agua, avalanchas de rocas en el agua y... avalanchas de rocas en el espacio.

O dicho de otra forma: "asteroides".

Y no, no es esto:

Vamos a aparcar en uno de esos grandes
Con lo de avalanchas me refiero a que el asteroide en sí puede considerarse una avalancha de rocas. Al parecer la estructura de los asteroides se desconoce. Es decir, se sabe de qué están hechos pero no se sabe si son una única masa sólida o están formados por agregados de rocas sujetas por gravedad. Se sospecha que es lo segundo.

Una de las razones para sospecharlo es que muchos asteroides y cometas se parten con demasiada facilidad cuando están sujetos a fuerzas de marea débiles. Eso le pasó, por ejemplo, al Shoemaker Levi 9 cuando impactó en Júpiter.

Las ciudades más importantes de Júpiter reciben impactos
Otra razón es que algunos asteroides tienen cráteres tan grandes (en relación a su tamaño) que de haber sido sólidos se habrían partido; mientras que si fueran agregados de partículas, la fricción entre ellas habría reducido los daños.


Un poco más, y el de en medio tiene un crater mayor que sí mismo.
Pero la razón fundamental es que no existen asteroides grandes que giren a la velocidad que haría que las partículas de su superficie saliesen disparadas. Hay muchos asteroides con velocidades de rotación altas, justo hasta el límite en el que se partirían si no fuesen sólidos; pero no se conoce ninguno que gire más deprisa.

Sorprendentemente, esto que acabo de explicar es el estado del arte en la materia. Incluso aunque se hayan mandado satélites al encuentro de asteroides y alguno se haya hecho chocar a propósito contra uno, aún no se conoce bien su estructura. De hecho, este artículo (escrito, entre otros, por el profesor que me da la asignatura) es del 2007 y da una idea de lo que se sabe sobre el tema.

¿De qué va? pues esencialmente modela los asteroides como elipsoides, constituidos por granos sólidos (esferas idénticas) sujetos a las mismas ecuaciones que mis granos de arena. Con ese modelo, estudia lo que le ocurre a un asteroide cuando pasa cerca de un planeta, es decir: en qué momento se rompe debido a las fuerzas de marea.

La idea es que si el modelo coincide más o menos con los casos conocidos de asteroides que se rompen cuando se acercan a planetas, eso daría otro argumento a favor de los asteroides "blandos".

En todo caso, el tema me parece interesante, así que a parte de sentarme a ver como se va creando un hoyito al lado de un pilar, intentaré meterme un poco en el asunto este de los asteroides, a ver qué pasa.



sábado, 24 de marzo de 2012

¿Cómo funciona un programa (engine) de ajedrez?

   
Desde hace un tiempo estoy interesando en el mundo de los engines de ajedrez, y aunque en gran parte me sirva para aclararme, creo que puede ser un tema interesante.

Básicamente un engine de ajedrez necesita tres componentes esenciales:
  1. Un generador de movimientos
  2. Una función de evaluación
  3. Una función de búsqueda

El generador de movimientos se encarga de crear una lista de los movimientos posibles en un posición determinada, así como de chequear la legalidad de los mismos. Esta es una de las partes más difíciles, ya que es muy “bug prone”. El generador de movimientos debe ser capaz también de deshacer movimientos, por razones que veremos más adelante.

La función de evaluación (que se suele denominar “estática”, ya que evalúa factores puramente estáticos tales como el material, la estructura de peones, la seguridad del rey, etc. pero no se para a mirar si, por ejemplo, en el siguiente movimiento vamos a perder la dama: de eso se encarga la función de búsqueda, como se explica más adelante) tiene la finalidad de asignar una valoración a una posición dada. La implementación más sencilla sería la puramente material: contar el material que hay por cada bando en el tablero. La evaluación se suele dar tomando el valor de un peón como 100, y el resto de las piezas en función de esta. Así, valores típicos para las piezas serían de 100 para los peones, 300 para caballos y alfiles, 500 para las torres y 900 para las damas.
Sin embargo, una evaluación basada solamente en el material daría lugar a un engine muy débil. Por ejemplo, valoraría como igualada una posición con equilibro material, aunque uno de los bandos tuviera todas sus piezas desarrolladas y el otro las mantuviera en sus casillas iniciales. Además mientras no viera una ganancia de material, todos los movimientos le parecerían equivalentes, dando lugar a un juego cuasialeatorio.
Una mejora realmente sencilla y muy eficiente son las piece square tables (pst). Se trata de asignar una puntuación extra a cada pieza dependiendo del tipo de pieza en cuestión y de su posición en el tablero. Por ejemplo, una pst para los caballos blancos podría ser la siguiente;

int knight_pst[64] = {
-10, -10, -10, -10, -10, -10, -10, -10,
-10,   0,   0,   0,   0,   0,   0, -10,
-10,   0,   5,   5,   5,   5,   0, -10,
-10,   0,   5,  10,  10,   5,   0, -10,
-10,   0,   5,  10,  10,   5,   0, -10,
-10,   0,   5,   5,   5,   5,   0, -10,
-10,   0,   0,   0,   0,   0,   0, -10,
-10, -30, -10, -10, -10, -10, -30, -10
};

El primer elemento del array es la casilla a8, y el último la h1. Cuando la función de evaluación escanee el tablero en una posición determinada, al encontrarse con un caballo blanco en la casilla n-sima, le dará un bonus (o malus) que será el valor n-simo (en puridad “n-simo menos uno”) del array knight_pcsq. Podemos ver que con esta pst para los caballos, como norma general se penaliza que se sitúen en los bordes del tablero y se incentiva que estén en el centro del mismo. Con algunas pst más para el resto de piezas (añadido a la evaluación material) el juego del engine pasa a ser con mucho más sentido a un coste muy bajo.
Por convenio se suele tener que la función de evaluación da valores positivos cuando la ventaja es de las blancas y negativos cuando la ventaja es de las negras.

La verdad es que por lo dicho hasta ahora nada diferencia cómo juega un programa de ajedrez de cómo lo hace un humano. Básicamente hemos dicho que debe saber las reglas (generador de movimientos) y que tenga ciertos conocimientos para evaluar si una posición es mejor que otra (función de evaluación). Pero a partir de aquí, ¿cómo usa estas herramientas un engine de ajedrez? Una vez que sabemos mover las piezas y evaluar la posición, el paso siguiente es buscar el mejor movimiento de todos los posibles.
Para seguir con esto debemos introducir al menos un término para no inducir a errores, el ply de profundidad. Cuando se habla de ajedrez, se suele entender que “un movimiento” equivale a que el bando blanco y el negro han movido. Sin embargo, en el mundo de los engines de ajedrez, la unidad fundamental de movimientos es el “ply”, que es simplemente un movimiento hecho por cualquiera de los bandos. Así, para calcular nuestro movimiento y la respuesta del rival, estamos analizando con una profundidad de 2 plies. O si un engine dice que ha analizado con una profundidad de 14 plies, se puede “traducir” como que ha profundizado a 7 movimientos.

Una vez dicho esto, supongamos que un engine quiere decidir cuál es el mejor movimiento disponible a una profundidad de 3 plies (es decir, movemos nosotros, mueve el contrario, y respondemos). El árbol de variantes (el esquema de todos los posibles movimientos hasta una determinada profundidad) tendría un aspecto similar a este:

 
Por supuesto, un árbol de variantes de una posición cualquiera es mucho más profuso, pero por razones prácticas se ha reducido drásticamente. El número “23”, abajo a la izquierda, debajo de la celda en la que pone “e4”, significa:
“Si en la posición actual yo muevo d4 y el contrario mueve d6 y yo respondo e4, entonces la valoración de la posición es de 23 (centésimas de peón, es decir, ligeramente favorable al blanco)”. Y así con el resto. Un dato importante: la función de evaluación sólo se aplica a las posiciones últimas, las que se encuentran en la última fila (llamados leaf nodes).

Vale, supongamos entonces que hemos creado el árbol de variantes hasta la profundidad deseada y que tenemos las puntuaciones de todas (to das) las posiciones resultantes. Lo primero que se nos puede ocurrir es algo como “bueno, cojamos el movimiento que mayor puntuación da a nuestro bando y ya está, es decir, 35, tras jugar d5 en el ply 3”. Para que se dé esa posición, nosotros debemos mover primero d4, entonces el negro debe mover Cc6, y vualá, hacemos d5 y a seguir jugando. Pero estamos obviando algo: el negro no tiene ninguna obligación de responder Cc6 a nuestro d4. De hecho, lo que tratará de hacer el negro tras cada movimiento nuestro, es precisamente elegir el movimiento que menos le perjudique (o más le beneficie). Es decir, si nosotros movemos d4, precisamente el negro evitará mover Cc6, porque él es tan buen jugador como nosotros, y verá que tras d4, Cc6, d5 da ventaja al blanco.

De modo que si el blanco mueve d4, ¿qué movimiento elegirá el negro? Pues el que deje la peor mejor opción al blanco, teniendo en cuenta que el blanco moverá maximizando sus posibilidades. Si hemos llegado hasta aquí, veremos enseguida que la respuesta del negro a d4 del blanco será 0-0, que deja como mejor opción del blanco Tb1, con -12 (ligera ventaja negra). Es decir, a la posición que se da tras d4 y 0-0 se le asigna una valoración de -12, y esta valoración no la hemos sacado de aplicar la función de evaluación a dicha posición sino de las valoraciones de las posiciones derivadas.
La misma técnica se aplica sobre cada serie de movimientos que tienen un padre común, y llegaríamos a tener un diagrama como el siguiente:

 
Las valoraciones de las posiciones tras el ply 2, en marrón (sí, soy un petardo eligiendo colores), se obtienen maximizando los valores que ha devuelto la función de evaluación en el ply 3 a las posiciones hijas, en azul. Sin embargo, los valores de las posiciones tras el ply 1 se obtienen minimizando las puntuaciones del ply 2 (por eso a esta técnica se la llama mini-max). Ocurre que cada vez que subimos o bajamos un ply, cambia el bando que mueve. Así, cuando mueve el blanco, trata de maximizar la puntuación, mientras que el negro trata de minimizarla. Finalmente, aplicando el mismo sistema, llegamos a la conclusión de que la valoración de la posición a tres plies de profundidad es de 11 centésimas de peón (ligera ventaja blanca).

Nótese que tal y como comentaba, la función de evaluación sólo se usa en las posiciones finales [por cierto, en todo este proceso estamos suponiendo que nuestra función de evaluación es “la verdad”. Evidentemente, ninguna función de evaluación es perfecta (aunque algunas se acercan bastante), pero es que sencillamente es lo que tenemos], y es a partir de estos valores como se toma la decisión del mejor movimiento.
También aquí vemos por qué el generador de movimientos debe ser capaz también de deshacerlos. Al comenzar a analizar, lo primero que se hace es generar los movimientos disponibles. Si entonces no nos encontramos en el ply de profundidad deseado, volvemos a generarlos hasta que se cumpla la condición. De modo que la función de búsqueda (que es como se suele llamar, ya que se encarga de buscar el mejor movimiento en el árbol de variantes) es recursiva, llamándose a sí misma y generando los movimientos posibles hasta llegar a la profundidad deseada. Entonces se aplica la función de evaluación a las posiciones, y se deben deshacer los movimientos para seguir moviéndonos por el árbol de variantes.

Bueno, para una introducción puede valer. Evidentemente tanto sobre la generación de los movimientos como sobre la evaluación y la búsqueda hay muchísimo más que contar, pero creo que con esto puede ser suficiente para hacernos una primera idea de cómo funcionan estos programitas. En próximas entradas trataré de explicar algunos de estos asuntos con más detalle.

PS: si alguien tiene curiosidad por ver el código de alguno de estos programas, hay bastantes, y algunos muy fuertes, que están bajo licencia GPL o open source. En particular servidor tiene debilidad por secondchess, un engine que se basa en un código en C escrito por Pham Nguyen llamado firstchess, con fines puramente didácticos. El código de secondchess se puede encontrar aquí (muy comentado y con un nivel de juego medianamente interesante, en especial teniendo en cuenta lo sencillo que es).

jueves, 22 de marzo de 2012

Desahogo matemático

Acabo de tener la típica reunión con mi director de tesis (en adelante "el chino") en la que nos hemos gritado mutuamente (algo relativamente normal) y necesito desahogarme, así que voy a hablar de un par de afirmaciones matemáticas cuestionables que he oído a muchos profesores (entre ellos al chino).

La primera es algo que asocio con los ingenieros porque sólo se lo he visto hacer a ingenieros, aunque admitiré de buena gana estar equivocado si alguien me muestra pruebas. Es una queja que algunos me habrán oído ya, comienza cuando alguien escribe algo así en la pizarra:


Donde \(\phi\) es una magnitud cuya variación en \(x\) queremos conocer. Obviando el hecho de poner \(dx\) como si fuera un infinitesimal (Leibnitz estaría orgulloso), el problema es que luego dicen:
Restando el valor la izquierda \(\phi\) del valor a la derecha \(\phi + \frac{\partial \phi}{\partial x} dx \) y dividiendo por el intervalo \(dx\), obtenemos que la variación es  \(\frac{\partial \phi}{\partial x} \)
¡Y se quedan tan anchos! Muchas veces he tratado de explicar que ya están suponiendo que la variación es esa cuando hacen el dibujo, y que hacer el proceso de restar y luego dividir no hace más que recuperar la suposición inicial. No han hecho más que dar una vuelta para llegar a algo que ya sabían.

Lo curioso es que hacerlo bien no es más difícil, todo lo contrario:




En este caso, la variación es \( \frac{\phi(x+\Delta x)-\phi(x)}{\Delta x}\), tomando el límite y aplicando la definición de derivada parcial llegamos al mismo resultado, esta vez de verdad.

Que conste que no me parecía mal que dijesen el resultado final sin más, lo que me molesta es que den esa "vuelta" para nada.

***


Otra cosa que he oído muchas veces es eso de "si tienes n incógnitas necesitas n equaciones para resolverlas". De hecho ese fue el detonante de una discusión con el chino.

No recuerdo de qué problema hablábamos, pero si recuerdo que me salió con eso y como ya me tenía de mal humor le dije con sequedad que eso no era cierto. Se quedó mirándome con odio un momento y me preguntó "¿cómo que no es cierto?" Con tranquilidad, escribí lo siguiente en la pizarra:

\begin{aligned} x^2+y^2=0 \end{aligned}

"Dos incógnitas, una ecuación y una única solución, x=y=0", dije sabiendome ganador.

Se quedó pensando y me dijo "hombre claro, pero esa es la solución trivial". No me esperaba que me saliera con esas, de haberlo sabido le habría escrito:

\begin{aligned} x^2+y^2+3-2x-4y=0 \end{aligned}

Que no es otra cosa que \( (x-1)^2+(y-2)^2=0\) camuflado y que, evidentemente, tiene solución única, x=1, y=2. No sé si consideraría que esa solución también es "trivial", aunque según esa lógica, todas las soluciones lo son. En cualquier caso, también me dijo que no era una ecuación que tuviese sentido físico, y que a menos que tuviese un ejemplo de una, era mejor que me callase (más o menos con esas palabras).

Ahí sí que no supe qué decirle. No conozco sistema de ecuaciones que provenga de un problema físico real que tenga más incognitas que ecuaciones y que tenga solución única ¿alguna idea?




martes, 20 de marzo de 2012

10 colores

El otro día leí en algún sitio que los humanos usamos un sistema de numeración de base 10. No es una cita exacta, así que es posible que no dijese "humanos", pero lo que sí recuerdo es que ponía diez con cifra.

Creo que nunca antes lo había visto así escrito. Lo que es seguro es que es una afirmación totalmente correcta, pero que da muy poca información: todos los sistemas de numeración son en base 10, al menos, todos los de base mayor que uno.

Otra cosa es si decimos "base diez". En ese caso puede interpretarse que "diez" es el número que viene tras el "nueve", que a su vez sigue al ocho, etc. Aunque también puede interpretarse como la versión escrita de 10 (en hexadecimal he usado alguna vez "diez" para referirme al 10h). En este caso, decir "base diez" sería ambiguo, pero es mejor una ambigüedad que una frase púramente vacía de contenido (¿o no?).

El caso es que la cosa se pone complicada si uno quiere eliminar la ambigüedad. Según Wikipedia:

Para indicar en qué sistema de numeración se representa una cantidad se añade como subíndice a la derecha el número de símbolos que se pueden representar en dicho sistema. 
Es decir, habría que decir "base \(10_{10}\)", pero entonces nos quedaría la duda de en qué base está el subíndice. Esta podría ser una buena ocasión para usar los números romanos, que ya que gastamos tiempo y memoria en aprenderlos, hay que darles uso. Además, "base X" tiene un toque a película de ciencia ficción de los 50 que me gusta.

Otro al que le gusta la idea

Siguiendo con cosas ambiguas, hace poco me di cuenta de una tontería que me llamó la atención. Muchas veces, en un seminario o reunión alguien conecta un proyector y, sin apagar las luces, comienza una presentación. Esto sólo funciona si la iluminación de la sala no es muy fuerte, pero la realidad es que muchas veces se dan las condiciones para ello.

El caso es que la pantalla es blanca y, por más que la iluminemos, no va a dejar de ser blanca. Por tanto, los caracteres en negro son en realidad blancos, pero de un blanco menos luminoso que los alrededores.

Como esto, pero diferente
Como digo, es una tontería y no creo que sorprenda a nadie; pero no deja de ser llamativo que pasemos tan rápidamente, y sin darnos cuenta, de ver blanca una cosa a verla negra. Supongo que algo ayude el hecho de que nuestras pupilas se cierren un poco debido al incremento de iluminación y la cantidad de luz que llegue de las partes "negras" de la pantalla sea en realidad algo inferior a la que llegaba con el proyector desconectado Sin embargo no creo que eso afecte mucho, al fin y al cabo la sala ya estaba iluminada inicialmente.

sábado, 17 de marzo de 2012

Tetracópteros

Ayer estuve viendo en Hulu una conferencia de Vijay Kumar sobre tetracópteros (voy a llamarlos así a falta de un nombre mejor). Hablaba de cómo funcionan y de los usos que pueden tener. También mostraba varios vídeos de tetracópteros evitando obstáculos, volando en formación y otras cosas que supongo que casi todos hemos visto en YouTube.

Hubo uno que no había visto hasta ahora, un tetracóptero conectado un Kinect, de forma que a cada instante puede obtener información 3D de su entorno e ir construyendo un mapa según avanza. Me pareció impresionante y digno de una nueva, y breve, entrada en el blog.


Y digo impresionante, aunque lo cierto es que estamos hablando de tecnología puntera que uno puede replicar en casa sin mucho gasto y unas cuantas horas (muchas) de programación. Supongo que la parte de manejo del tetracóptero no debe ser trivial; pero la parte de la construcción del mapa me parece relativamente sencilla. Eso sí, siempre que nos contentemos con construirlo y no queramos además que el robot lo use para moverse (que, por cierto, creo que el del vídeo tampoco lo usa).


sábado, 10 de marzo de 2012

¡Teclado en engliñól!

Una de las cosas más molestas de vivir en Estados Unidos son los teclados. No es que no me apañe con el teclado americano, que sí lo hago, es que cada vez que quiero escribir algo en español tengo que cambiar la configuración, algo que no sólo es molesto de por sí, sino que además tengo que cambiar mentalmente la posición de los símbolos que, como sabemos, están en posiciones distintas.

Una solución es traerse teclados de España (algo que hice), pero evidentemente no es solución para los portátiles comprados aquí. Además, resulta que los teclados españoles no son lo mejor para programar. Símbolos tan necesarios como el ^ y el ~ no son fácilmente accesibles. Otros tan comunes como / y \ requieren de shifts varios y no están en posiciones del todo cómodas.

Llevaba tiempo pensando en crearme un esquema de teclado para solucionar estos problemas, pero me daba vagancia además de que tampoco tenía claro lo que quería hacer.

Al final me decidí este fin de semana. La solución que encontré me parece bastante elegante, consiste en usar el teclado inglés, pero modificar el esquema de forma que podamos acceder fácilmente a los caracteres éste no tiene: las vocales acentuadas, con diéresis, la eñe, el signo de Euro y las exclamaciones e interrogaciones de apertura.

Mi solución consiste en usar la tecla alt derecha (alt-gr en los teclados españoles) como modificador. Usada con una vocal resulta directamente en la vocal acentuada (en mayúsculas si se usa junto con shift), usada sobre la ene nos da la eñe y sobre ? y ! sus versiones de apertura. Para la u con diéresis he escogido la y, aunque aún no tengo claro si es la mejor solución.

Además, he mapeado el CapsLock (que no sirve para nada más que para joder) como un AltGr alternativo, así que ahora tengo modificadores a ambos lados del teclado.

También tenemos la solución tradicional


Este es el primer texto que escribo con este sistema y por el momento parece que la cosa va bien. Seguiré informando. El único problema es que cuando uso TeamViewer para acceder a mi desktop (Linux) desde mi portátil, no reconoce los caracteres. Probablemente debido a que ambos usan diferentes UTF-8.

Si a alguien le interesa intentarlo, en Windows hay que usar KeyTweak para mapear CapsLock como AltGr y Microsoft Keyboard Layout Creator para el resto. En Linux basta con usar xmodmap para todo (si alguien quiere más detalles sólo tiene que pedirlos).

jueves, 8 de marzo de 2012

Giroides auxéticas?

Para más adelante tengo pensado escribir algo sobre métodos de impresión 3D (o prototipado rápido o fabbing); pero ahora sólo quiero comentar un par de cosillas que tienen relación indirecta con ellos.

La primera cosa es algo que acabo de leer. Al parecer, la razón de que las yemas de los dedos se nos arruguen cuando las tenemos mucho tiempo en el agua no es que se disuelva cierto líquido protector (esa es la "explicación" que conocía), sino que la estructura de la queratina de la piel cambia cuando ésta absorbe agua. Esa estructura parece ser similar a una superficie que se llama giroide.

Aunque no lo parezca, es de verdad.


No acabo de entender bien lo que pasa, pero en cualquier caso la giroide esa me ha llamado la atención. Al parecer es una superficie de curvatura mínima, lo cual significa que la curvatura es cero en cada punto. En este caso, en cada punto hay dos curvaturas perpendiculares, opuestas de forma que se cancelan.

La característica que más me llamó la atención es que al parecer esa superficie divide al espacio en dos partes (seguramente iguales). Tengo la impresión de que una superficie así tiene que tener muchas utilidades. Lo primero que se me ocurrió pensar es que quizás podría servir para mejorar las baterías, ya que estas suelen necesitar metales separando productos químicos y, de hecho, buscando por "gyroid" y "battery" salen cosas, aunque no las he mirado en detalle.

Al hilo de esto recordé algo que vi el otro día, aunque la relación entre ambos es tenue. Se trata de los materiales euxéticos o con coeficiente de Poisson negativo.

A decir verdad, yo no sabía lo que era el coeficiente de Poisson hasta que hace poco me he puesto a estudiar "suelos" (me da grima hasta escribirlo) y como éstos reaccionan a las presiones. Este coefficiente, cuando es positivo, viene a decir lo que ya sabemos: que si comprimimos algo por un lado se ensancha por los otros y cuando lo estiramos se encoge (bueno, también dice cuánto, pero no voy a entrar en eso)

Lo interesante es que hay materiales que hacen lo contrario. Evidentemente, son poco comunes y tienen una estructura molecular complicada, pero aún así me costaba verlo. Afortunadamente, siempre nos queda YouTube:


En el vídeo se ve claramente cómo funciona la cosa. No es difícil imaginar una estructura tridimensional que haga más o menos lo mismo. Y si no lo queremos imaginar, podemos buscarlo en Google:

¿Qué pasaría si hiciéramos un colchón de este material?

¿Qué tienen que ver ambos temas? Pues que estos materiales empiezan a tener sentido con impresoras 3D, ya que son, probablemente, la mejor manera de crear estructuras así.

domingo, 4 de marzo de 2012

Un par de autómatas celulares

Estos días ando leyendo A New Kind Of Science (ANKOS) de Stephen Wolfram. Ya hablaré algo más en detalle sobre el libro y el autor en próximas entradas. Por el momento soló diré que trata, sobre todo, de autómatas celulares y cómo comportamiento complejo surge naturalmente de unas pocas reglas simples.

Yo la verdad es que me había quedado en el Juego de la Vida, pero al parecer el tema da para mucho. Por ahora me voy a limitar a poner un par de vídeos. El primero está basado en el juego piedra papel y tijera. Pongo un trozo de la descripción que aparece en el link:


Similarly to a naive implementation of the Game of Life, the program iterates through every cell in the grid one by one every generation.
For each cell, one neighboring cell is selected at random (uniform 1 in 8 chance of picking any given neighbor).
Each color has 10 different gradient levels. When I click with the mouse, I insert a cell of level 0. If a whitespace picks a colored cell, and that cell's level is < 9, the whitespace gets replaced with the current color + 1, as if the cell was producing a slightly weaker-colored offspring. That means cells grow randomly outwards until the outer "shell" of a given colored blob cannot divide anymore.

Y aquí el vídeo:

http://www.gamedev.net/blog/844/entry-2249737-another-cellular-automaton-video/

Que no me negaréis que no tiene algo de hipnótico. Sé que hay otras versiones que no usan números aleatorios, pero tenían videos menos espectaculares.

Seguro que están trabajando en la nueva versión



Este es otro vídeo que me moló, aunque no sé muy bién cuál es el autómata que usan:


sábado, 3 de marzo de 2012

Tablas periódicas y compiladores

Vamos a por la segunda entrada, que viene a ser la primera "de verdad". Mi idea es ir poniendo curiosidades, noticias, enlaces interesantes, miniartículos o lo que sea relacionado con ciencia, matemáticas, tecnología y programación. Para otras cosas ya tenemos otros medios.

No se vosotros, pero yo suelo tener mi navegador (Chrome) con unas treinta pestañas abiertas a la vez. Muchas de ellas con cosas que encontré hace tiempo y quiero recordar o contarle a alguien. Al final esas páginas se van quedando sin que vuelva a acordarme de ellas hasta que algún desastre hace que el navegador pierda la capacidad de hacer restore de las páginas.

Así que lo primero que voy a hacer es un recorrido por alguna de esas páginas y ponerlas aquí. Así cumplo el doble objetivo de tenerlas guardadas en algún sitio y darles la debida difusión.

Tablas periódicas alternativas.

Creo recordar que fue por la época en la que estudiaba química (el año anterior a empezar física) cuando me dio por pensar en cómo mejorar la tabla periódica de los elementos (por aquel entonces tenía la idea de que casi todo en la ciencia estaba equivocado o merecía un repaso). Con los rudimentos que tenía sobre la teoría de orbitales moleculares y la disposición de capas electrónicas, probé varias formas de organizar mejor la tabla. El hecho de que mi conocimiento sobre la tabla de verdad fuese solo superficial no me detuvo en mi intento.

No recuerdo bien a qué resultados llegué, aunque sé que me centré en intentar que los lantánidos y actínidos ocupasen un lugar normal en la tabla, en lugar de andar colgando como si de las islas Canarias se tratase. Si no recuerdo mal, mi idea era bastante similar a la left step periodic table, que al parecer llevaba unos 60 años inventada cuando yo pretendía remover los cimientos de la química.

Claro que por aquel entonces no teníamos Internet, algo que casi agradezco porque me habría ahorrado muchas horas de diversión friki. El otro día, me volví a acordar del tema y en unos segundos descubrí que tenía hasta entrada en Wikipedia. Para todos aquellos con alma de químico rebelde ahí va:

http://en.wikipedia.org/wiki/Alternative_periodic_tables





Un compilador para compilarlos a todos

Otra de las cosas en las que pienso de vez en cuando es en hacerme mi propio lenguaje (hay cosas que nunca cambian). Sé que no es probable que llegue a hacer uno algún día, pero eso no me impide divertirme pensando en ello. De hecho, ahora que lo pienso sí que me he hecho, al menos, un intérprete de RedCode del que tal vez hable algún día para los que no me conocieran en mi época megafriki.

Bueno, a lo que voy. Una vez que uno conoce las herramientas para construir compiladores (Yacc, Lex y variantes) y tiene una ligera idea de cómo organizar tipos y otros detalles, el mayor problema es como generar el código. Ensamblador es una idea, pero que requeriría unos cuantos años de estudio (si uno quiere generar un código medio decente).

Otra posibilidad es hacer un intérprete entre nuestro lenguaje y otro ya existente (pongamos C). El problema es que queda feo y que C no está pensado para que luego el debugger reconozca las particularidades de nuestro lenguaje.

Finalmente tenemos C--, que no es más que una especie de solución intermedia. Un C pensado precisamente para eso, como target para compiladores.

http://www.cminusminus.org/qc--.html


Aún me quedan unas cuantas páginas abiertas en Chrome que comentar, pero voy a dejarlo para otro día.

jueves, 1 de marzo de 2012

Web+Latex=MathJax

Primera entrada del blog. Ya que para hacerlo he tenido que buscar la forma de meter ecuaciones, voy a hablar un poco de cómo lo he hecho.

El tema de poner ecuaciones en páginas web nunca ha estado muy claro. Supuestamente hay un estándar (MathML), pero creo que sólo lo ha implementado, como siempre, FireFox; y aún así no sé hasta qué punto.

El caso es que MathML es XML, lo que siempre significa un montón de texto para hacer cualquier cosa, y lo que es peor, no parece haber muchas herramientas para generarlo. Pongo un ejemplo sencillo: la solución de una ecuación de segundo grado.

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo>&#x2212;</mo>
        <mi>b</mi>
        <mo>&#xB1;</mo>
        <msqrt>
          <mrow>
            <msup>
              <mi>b</mi>
              <mn>2</mn>
            </msup>
            <mo>&#x2212;</mo>
            <mn>4</mn>
            <mi>a</mi>
            <mi>c</mi>
          </mrow>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
</math>


Puesto que el estándar parece que no lo sigue nadie, busqué formas de hacer lo que hace Wikipedia, generar una imagen a partir de una especificación de la fórmula. Algo que no me entusiasmaba, pero que parecía la única solución.

El caso es que buscando encontré MathJax. Es un código en Javascript que transforma una fórmula en Latex en un código HTML con CSS (o algo así, me pierdo en los detalles) que la representa. A continuación podéis ver cómo queda la misma ecuación de segundo grado, que en latex se escribe así:

x=\frac {-b\pm\sqrt{b^2-4ac}} {2a}

\begin{aligned}x=\frac {-b\pm\sqrt{b^2-4ac}} {2a}\end{aligned}

Es decir, la fórmula sale perfecta, y no es una imagen, así que escala bien y puede imprimirse. Además, tiene un menú contextual que permite copiarla.

Para meter una fórmula centrada, como la anterior hay que escribir el código latex entre  \begin{aligned} y \end{aligned}, y para que la fórmula aparezca entre el texto, como esta: \( \nabla^2 \phi = 0 \), hay que ponerla entre  \( y \) (mejor si se hace desde la edición de HTML).

Para los que no dominéis \(\LaTeX\), hay varios editores online.

Si esto no os "pone", como a mí, me da que este blog no os va a gustar.