#!/usr/bin/env python # coding: utf-8 # # Batman, ecuaciones y python # *Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Mi blog sobre Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.* # Ecuación Batman # [Batman](https://es.wikipedia.org/wiki/Batman) siempre fue mi superhéroe favorito porque es uno de los pocos héroes que no posee ningún superpoder, sino que debe recurrir a su intelecto y a la ciencia para construir las bati-herramientas que utiliza para combatir al crimen. Además posee ese toque de oscuridad producto de la dualidad entre realizar el bien, protegiendo a la gente de ciudad gótica, y su sed de venganza contra el crimen y la corrupción que acabó con la vida de su familia. # # Es un personaje con muchos recursos, en cada nueva aparición podemos verlo utilizar nuevas y muy modernas bati-herramientas; su intelecto es tan agudo que incluso escondió una ecuación matemática en su bati-señal!! # # La [ecuación de batman](http://www.wolframalpha.com/input/?i=batman+equation) fue creada por el profesor de matemáticas [Matthew Register](http://www.quora.com/J-Matthew-Register) y se popularizó a través de un post de uno de sus alumnos en la red social [reddit](https://www.reddit.com/r/pics/comments/j2qjc/do_you_like_batman_do_you_like_math_my_math/); su expresión matemática es la siguiente: # $$ # ((\frac{x}{7})^2 \cdot \sqrt{\frac{||x|-3|}{(|x|-3)}}+ (\frac{y}{3})^2 \cdot \sqrt{\frac{|y+3 \cdot \frac{\sqrt{33}}{7}|}{y+3 \cdot \frac{\sqrt{33}}{7}}}-1) \cdot (|\frac{x}{2}|-((3 \cdot \frac{\sqrt{33}-7)}{112}) \cdot x^2-3+\sqrt{1-(||x|-2|-1)^2}-y) \cdot (9 \cdot \sqrt{\frac{|(|x|-1) \cdot (|x|-0.75)|}{((1-|x|)*(|x|-0.75))}}-8 \cdot |x|-y) \cdot (3 \cdot |x|+0.75 \cdot \sqrt{\frac{|(|x|-0.75) \cdot (|x|-0.5)|}{((0.75-|x|) \cdot (|x|-0.5))}}-y) \cdot (2.25 \cdot \sqrt{\frac{|(x-0.5) \cdot (x+0.5)|}{((0.5-x) \cdot (0.5+x))}}-y) \cdot (\frac{6 \cdot \sqrt{10}}{7}+(1.5-0.5 \cdot |x|) \cdot \sqrt{\frac{||x|-1|}{|x|-1}}-(\frac{6 \cdot \sqrt{10}}{14}) \cdot \sqrt{4-(|x|-1)^2}-y) =0 # $$ # Si bien a simple vista la ecuación parece sumamente compleja e imposible de graficar, la misma se puede descomponer en seis curvas distintas, mucho más simples. # # La primera de estas curvas, es la función del elipse $(\frac{x}{7})^2 + (\frac{y}{3})^2 = 1$, restringida a la región $\sqrt{\frac{||x|-3|}{(|x|-3)}}$ y $\sqrt{\frac{|y+3 \cdot \frac{\sqrt{33}}{7}|}{y+3 \cdot \frac{\sqrt{33}}{7}}}$ para cortar la parte central. # # Los cinco términos siguientes pueden ser entendidos como simples funciones de x, tres de los cuales son lineales. # Por ejemplo, la siguiente función es la que grafica las curvas de la parte inferior de la bati-señal. # # $y = |\frac{x}{2}|-(\frac{3 \cdot \sqrt{33} -7}{112})\cdot x^2 - 3 + \sqrt{1-(||x|-2| -1)^2}$ # # Las restantes ecuaciones de las curvas que completan el gráfico, son las siguientes: # # $y = \frac{6\cdot\sqrt{10}}{7} + (-0.5|x| + 1.5) - \frac{3\cdot\sqrt{10}}{7}\cdot\sqrt{4 - (|x|-1)^2}, |x| > 1$ # # $y = 9 -8|x|, 0.75 < |x| < 1$ # # $y = 3|x| + 0.75, 0.5 < |x| < 0.75$ # # $y = 2.25, |x| < 0.5$ # # La [ecuación de batman](http://www.wolframalpha.com/input/?i=batman+equation) puede ser fácilmente graficada utilizando [Matplotlib](http://matplotlib.org/) del siguiente modo: # In[1]: # graficos embebidos get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: # Importando lo necesario para los cálculos import matplotlib.pyplot as plt from numpy import sqrt from numpy import meshgrid from numpy import arange # In[3]: # Graficando la ecuación de Batman. xs = arange(-7.25, 7.25, 0.01) ys = arange(-5, 5, 0.01) x, y = meshgrid(xs, ys) eq1 = ((x/7)**2*sqrt(abs(abs(x)-3)/(abs(x)-3))+(y/3)**2*sqrt(abs(y+3/7*sqrt(33))/(y+3/7*sqrt(33)))-1) eq2 = (abs(x/2)-((3*sqrt(33)-7)/112)*x**2-3+sqrt(1-(abs(abs(x)-2)-1)**2)-y) eq3 = (9*sqrt(abs((abs(x)-1)*(abs(x)-.75))/((1-abs(x))*(abs(x)-.75)))-8*abs(x)-y) eq4 = (3*abs(x)+.75*sqrt(abs((abs(x)-.75)*(abs(x)-.5))/((.75-abs(x))*(abs(x)-.5)))-y) eq5 = (2.25*sqrt(abs((x-.5)*(x+.5))/((.5-x)*(.5+x)))-y) eq6 = (6*sqrt(10)/7+(1.5-.5*abs(x))*sqrt(abs(abs(x)-1)/(abs(x)-1))-(6*sqrt(10)/14)*sqrt(4-(abs(x)-1)**2)-y) for f, c in [(eq1, "red"), (eq2, "purple"), (eq3, "green"), (eq4, "blue"), (eq5, "orange"), (eq6, "black")]: plt.contour(x, y, f, [0], colors=c) plt.show() # Ahora ya saben...si están en algún apuro y necesitan la ayuda del bati-héroe, solo necesitan graficar una ecuación para llamarlo con la bati-señal! # # Saludos! # # *Este post fue escrito utilizando IPython notebook. Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/Batman.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/Batman.ipynb).*