A los de Ubuntu no se les dan bien las matemáticas

Ayer actualizé a la versión 9.10 de Ubuntu en parte para poder usar las "nuevas" versiones de algunos programas de cálculo simbólico, entre ellos Maxima (me daba palo tener que andar compilando por mi cuenta y resolviendo dependencias). El caso es la versión de Maxima que se distribuía con Ubuntu Jaunty (9.04) era la 5.13, del año 2007... no hace falta decir que andaban un poco desfasados. Actualmente la última versión disponible es la 5.19, liberada hace poco más de dos meses, y la versión disponible en Ubuntu 9.10 es la 5.17, que también ha sido liberada durante el 2009 el 26 de diciembre de 2008, no nos podemos quejar en cuanto a novedad se lo toman con calma.

Pero, aquí está el problema, no funciona. Simplemente no se puede realizar casi ningún cálculo que supere en complejidad al 1+1 que se enseña en las guarderías, nuestros ordenadores se han vuelto idiotas de repente con la actualización. El problema no tiene nada que ver con un desarrollo defectuoso por parte del equipo de Maxima, en Debian funciona perfectamente, y si se descarga el código fuente y se compila a mano, tres cuartos de lo mismo. De hecho en las sucesivas versiones de Maxima que han sido liberadas se corrigieron un montón de errores, se hicieron algunos perfeccionamientos en los cálculos (entre ellos aumentar el conjunto de ecuaciones diferenciables resolubles, de ahí mi interés por la novedad) y se añadieron un montón de funciones nuevas así como también se aumentó el rendimiento de algunos cálculos.

Parece ser que en Ubuntu los detalles relacionados con el software científico les importan un comino, y no solo hablo por Maxima. La misma desactualización que había con Maxima en la 9.04, la había con SAGE... pero es que sigue habiéndola en la 9.10, utilizan la versión 3.un_numero_muy_bajo cuando la versión actual estable es la 4.2.1. El software libre es increíblemente importante (y cada vez más) para el desarrollo científico actual, pero los chicos de Ubuntu no parecen preocuparse de ello y lo están dejando demasiado de lado, hay que darles un toque! Al final tendré que enviar los datos del software que instalo para decantar (aunque sea un poco solo) las estadísticas a favor del software científico...

[Actualización interesante (con solución incluída)]

Os enlazo la página dedicada al bug que comento https://bugs.launchpad.net/ubuntu/+source/maxima/+bug/303587 . El bug se empezó a describir en la versión 8.10 de Ubuntu, y se medio solventó a base de parchecitos y arreglos (pues en la 9.04 me funcionaba medio bién). El caso es que si vamos leyendo el registro de ese bug apreciaremos como se va comentando su aparición en las sucesivas versiones de Ubuntu. Lo interesante del caso es que en cada una de las versiones, la causa es totalmente diferente, y la causa subyacente del problema en la versión 9.10 es la más pintoresca que se pueda imaginar.

Por lo visto el problema se produce debido a una característica de los nuevos núcleos de Linux que está activada por defecto. Esta característica es la aleatorización del espacio de direcciones virtuales [1], que básicamente sirve como medida de seguridad (sobretodo cuando se utiliza virtualización). Por lo visto eso afecta de alguna extraña forma al intérprete de Lisp que utiliza Maxima internamente. La solución para el problema de Maxima es sencilla aunque reduce ligeramente la seguridad del sistema, por eso mismo se debería buscar una solución más elaborada que la que propondré (sacada del bugtracker):

Editar el fichero /etc/sysctl.conf y añadir la línea

1
kernel.randomize_va_space = 1

Después de eso se tiene que ejecutar sysctl -p.

Referencias:

  1. http://es.wikipedia.org/wiki/Exec_Shield

Resolver sistemas de EDOs de primer orden con Maxima

En realidad el título debería ser "Resolver sistemas de EDOs de primer orden con coeficientes constantes con Maxima", pero obviamente era demasiado largo. Lo que escribiré aquí se puede encontrar en la ayuda de Maxima (no sé donde está exactamente si se quiere acceder a pelo a los archivos, pero es accesible fácilmente desde la interfaz wxMaxima), pero creo que puede ser interesante explicar como se ejecutan cálculos como éstos para aquellos que no conozcan demasiado este programa.

Como ya he indicado en el título, hago referencia a EDOs con coeficientes constantes porque Maxima (almenos con al versión instalada en Ubuntu Jaunty 9.04) tiene algunas dificultades para trabajar con ecuaciones más complejas, en todo caso puede ser muy útil tener una herramienta como ésta a mano si no se dispone de otras como Maple (mi caso, por ejemplo).

Entonces, para resolver las siguientes ecuaciones relacionadas con el típico problema de los tanques interconectados entre los que fluyen líquidos (aquí luciré el nuevo plugin para mostrar latex en WordPress :D ):

\( \begin{cases} \dot{QA_{T}}(t) = 3 + \frac{4}{100}QB_{T}(t) - \frac{5+8}{100}QA_{T}(t) \\ \dot{QB_{T}}(t) = 3 + \frac{5}{100}QA_{T}(t) - \frac{4+9}{100}QB_{T}(t) \\ QA_{T}(0) = 0 \\ QB_{T}(0) = 0 \end{cases} \)

Lo haremos con los siguientes comandos:

 eq1: 'diff(x(t), t) = (-13/100)*x(t) + (4/100)*y(t) + 3;
 eq2: 'diff(y(t), t) = (5/100)*x(t) + (-13/100)*y(t) + 3;
 atvalue(x(t), t=0, 0);
 atvalue(y(t), t=0, 0);
 desolve([eq1, eq2], [x(t), y(t)]);

En las primeras dos líneas definimos las dos ecuaciones diferenciales (les damos nombre poniendo el nombre seguido de dos puntos y seguidamente la ecuación). En las siguientes dos líneas se escriben las restricciones que tienen que satisfacer las soluciones (que, no lo olvidemos, son funciones). Y por último se le passa un array con las ecuaciones a la función dsolve, así como un array con el nombre de las funciones que queremos encontrar. Ésto es todo amigos, espero que os sirva ;) .