viernes, 9 de enero de 2009

Zenón 2.0 :-)

Una vela solar es un sistema propuesto de propulsión para naves espaciales que utiliza la presión que ejerce la luz solar sobre una membrana (generalmente reflectiva). Puede representarse mediante el siguiente esquema (dibujado por Randall Munroe, el autor de xkcd):
Obviamente, como todo sistema físico, una vela solar debe obedecer la conservación de la energía. Por lo tanto su energía cinética debe adquirirse a partir de una correspondiente reducción en la energía de la luz incidente. En efecto, esto es lo que sucede y, en el caso de una vela perfectamente reflectiva, el efecto Doppler reduce la longitud de onda de los fotones reflejados de modo que la energía se conserve.

El problema es el siguiente: cuando la vela está estacionaria, no hay efecto Doppler y la potencia transferida a la vela es nula; como puede entonces comenzar a moverse? (Hint: T = 1/2 mv2)

La respuesta a este problema y un análisis más exhaustivo del comportamiento energético de las velas solares en unos días...

domingo, 28 de diciembre de 2008

JavaScript

Para practicar la puesta en práctica de las recomendaciones de Douglas Crockford respecto a como programar en JavaScript, me decidí por hacer una demostración en SVG del famoso "Arnold's Cat Map". Este mapeo consiste simplemente en aplicar repetidas veces a las coordenadas de un conjunto de puntos inicial la transformación

(x, y) → (x + y, x + 2y) mod 1 .

El "mod 1" es lo que indica que trabajamos sobre el toroide ℝ2/ℤ2.



Si bien el mapa aplicado a valores reales es caótico y mezcla fuertemente el conjunto de puntos, se observa un fenómeno de recurrencia en las variantes discretas del problema (tal como la implementada). Para este caso particular en el que la imagen es de 32 X 32 pixels, la recurrencia se observa en el paso 24.

Nota de implementación: la imagen fue tomada de Wikipedia y editada y transformada a formato "JSON" utilizando PIL.

lunes, 22 de diciembre de 2008

Porqué los espejos intercambian derecha e izquierda?

Se cree comúnmente que los espejos "intercambian la derecha y la izquierda". Por ejemplo, la imagen especular de una persona diestra escribirá, aparentemente, con la mano izquierda. Esto nos llevaría a pensar que el espejo trata en forma diferente a las direcciones horizontales que a las direcciones verticales (porque no observamos que el espejo invierta "arriba y abajo").

Pero esto no es lo que en realidad "el espejo hace". La reflexión invierte las posiciones en la dirección perpendicular al espejo. Es por alguna razón psicológica que esto se observa como una rotación de 180° alrededor de un eje vertical compuesta con una inversión de derecha e izquierda.

La razón que se me ocurre para esto es que inconsciente observamos al reflejo como otra persona física; como físicamente las personas pueden rotarse pero no reflejarse, la visualizamos como una versión rotada de nosotros mismos con sus lados derecho e izquierdo intercambiados. 

Esto plantea la pregunta de porqué visualizamos una reflexión derecha/izquierda pero no la reflexión adelante/atrás. Si bien no se me ocurre una respuesta directa a esta pregunta, probablemente se deba a la cuasi-simetría externa de las personas respecto al intercambio derecha/izquierda.

sábado, 20 de diciembre de 2008

Lattice Boltzmann (actualización)

Todavía no encontré el tiempo para dar una breve explicación de Lattice Boltzmann, pero logré mejorar notablemnete la eficiencia de la simulación. Puede hacerse checkout de la última "versión" hasta el momento en http://lattice-boltzmann-sdl.googlecode.com/svn/tags/0.03/.

A continuación muestro dos imágenes de la simulación, que está corriendo a unos 30 FPS en un solo core de un Intel Core Duo T2600 @ 2.16 GHz. Corresponden a la colisión de dos esferas de fluido en forma ligeramente oblicua.


miércoles, 17 de diciembre de 2008

The Emily Project

La calidad de los renders sigue mejorando...



Actualización: El video normal no le hace justicia; puede verse el video en alta definición.

domingo, 14 de diciembre de 2008

La subasta del dólar

Desde el punto de vista formal se define a un juego como un conjunto de jugadores, cada uno de los cuales dispone de una serie de posibles acciones a tomar, y una forma de determinar cuanta recompensa recibe cada uno de los jugadores en base a las acciones que eligen todos ellos. Este formalismo no solo puede modelizar juegos como el ta-te-ti o el ajedrez, sino que puede aplicarse al análisis de situaciones hipotéticas tales como el conocido "dilema del prisionero".

Uno de los juegos que fueron definidos de este modo es el conocido como la "subasta del dolar" y fue creado por Martin Shubik en 1971 para dar un ejemplo simple del conocido proceso de escalada en los conflictos. El juego es muy simple: se subasta un dólar entre dos jugadores pero ambos deben pagar sus ofertas, lo que altera radicalmente el desarrollo de la subasta.

Supongamos que la oferta mínima y el incremento mínimo de las ofertas se establece en 0.05. Entonces, a primera vista, parece un excelente retorno ofrecer 0.05 a cambio del dólar; pero también lo será para el otro jugador ofrecer 0.10 y así el proceso puede seguir hasta que las ofertas hasta 0.95. Pero la fase más interesante ocurre a partir de este momento...

Supongamos que el jugador "A" hizo la última oferta de 0.95 después de que "B" hubiera ofrecido 0.90. Entonces "B" tiene dos opciones: puede aceptar perder 0.90 o puede ofrecer 1.00 y "salir hecho". El mismo análisis puede hacerlo "A" en caso de realizar "B" su oferta de 1.00: puede perder 0.95 u ofrecer 1.05 y perder 0.05... Esto lleva a una competencia en la que las pérdidas son potencialmente ilimitadas.

Uno podría pensar que este juego carece de relevancia práctica en si y que solo interesa como modelo de otras competencias que suceden en la realidad, pero eso sería incorrecto. Pueden verse más detalles acerca de Swoopo y su modelo de negocios en múltiples sitios. Quién dice que la teoría de juegos no es redituable? :-D

lunes, 8 de diciembre de 2008

Lattice Boltzmann (con SDL!)

Estoy trabajando en un nuevo proyecto personal: realizar una simulación de fluidos mediante el método conocido como Lattice Boltzmann y usando SDL para los gráficos. Si bien el objetivo último es lograr una buena performance, actualmente solo está funcionando la implementación "lenta" que voy a usar con propósitos comparativos (a unos 8 FPS con simple precisión en un Core Duo @ 2.16 GHz).

Hoy fue una experiencia bastante frustrante: empleé horas buscando un error en mi implementación de Lattice Boltzmann para descubrir finalmente que el problema estaba en las condiciones iniciales que estaba empleando... Más específicamente, no estaba cumpliendo con la condición CFL :-S

En las próximas semanas probablemente agregue algo más acerca de Lattice Boltzmann y, con suerte, tenga nuevos avances del proyecto.