Atención, este blog está alojado en Blogspot. Es recomendable tomar las debidas precauciones (como usar un bloqueador de Javascript).

domingo, 7 de noviembre de 2010

Manipuladores algebraicos

Todavía hoy en día, cuando se necesita resolver un problema matemático se suele utilizar papel, lápiz y una goma de borrar, pero los ordenadores facilitan la realización de ciertas operaciones matemáticas mecánicas y repetitivas, para las que no hace falta pensar estrategias, sin dificultad y con precisión, de un modo que nuestro cerebro, tan hábil para otras tareas, no puede realizar tan fácilmente.

Los manipuladores algebraicos o simbólicos son programas de ordenador que permiten tratar con objetos matemáticos más generales que los números. Mathomatic y wxMaxima son dos programas libres que permiten manipular objetos matemáticos de forma simbólica.

Por ejemplo, supongamos que de vez en cuando tenemos que resolver x en función de a, b y c en la siguiente expresión, que es una ecuación cuadrática:

a*x^2 + b*x + c = 0

Pero somos un poco desmemoriados, y no siempre recordamos la fórmula. Pues introduciendo la expresión en wxMaxima y seleccionando Ecuaciones > Resolver, en el menú, la obtendremos.

Si queremos asignar valores a los parámetros a, b y c, lo podemos hacer del siguiente modo:
a:-1;
b:2;
c:1;

Para evaluar las expresiones hay que pulsar Shift + Enter y éstas deben terminar en punto y coma.

Una vez hecho esto, habrá que pulsar en las expresiones de la ecuación y la expresión de la solución (solve) para evaluarlas de nuevo (Shift + Enter). Para desasignar los valores a los parámetros y trabajar con éstos de modo simbólico de nuevo haremos:
kill(a);
kill(b);
kill(c);

Y evaluaremos con Shift + Enter, claro.

Mathomatic, a pesar de tener una interfaz de texto, es muy sencillo de usar y también nos permite resolver el caso anterior:

1-> a*x^2 + b*x + c = 0;

#1: (a*(x^2)) + (b*x) + c = 0

1-> solve for x
Equation is a degree 2 polynomial in (x).
Equation was solved with the quadratic formula.

1
(((((b^2) - (4*a*c))^-)*sign) - b)
2
#1: x = ----------------------------------
(2*a)


En este caso, la variable sign nos indica que hay dos soluciones, una para el caso sign = 1 y otra para el caso sign = -1.

Una función interesante de Mathomatic para programadores es que permite obtener código C, Java o Python de las expresiones, por ejemplo, en el caso anterior:
1-> code
x = (((pow(((b*b) - (4.0*a*c)), (1.0/2.0))*sign) - b)/(2.0*a));
1-> code java
x = (((Math.pow(((b*b) - (4.0*a*c)), (1.0/2.0))*sign) - b)/(2.0*a));
1-> code python
x = ((((((b*b) - (4.0*a*c))**(1.0/2.0))*sign) - b)/(2.0*a))

Así se evitan errores de transcripción a código de las fórmulas obtenidas.

Para calcular la solución para un valor concreto de los parámetros a, b y c, utilizamos la orden calculate, que nos pedirá introducir los valores.
1-> calculate
Enter a: -1
Enter b: 2
Enter c: 1
There are 2 solutions.

Solution number 1 with sign = 1:
x = -0.4142135623731

Solution number 2 with sign = -1:
x = 2.4142135623731

Para profundizar más en el uso de estos programas, en el caso de Mathomatic, la documentación que acompaña al software es una buena introducción y referencia. En el caso de wxMaxima hay diversos tutoriales. Uno muy interesante es el realizado por Paul Lutus.

Con wxMaxima también podemos realizar gráficos de superfícies definidas de forma explícita e implícita, como la silla de montar (z=y^2-x^2):

plot3d(y^2-x^2, [x,-3,3], [y,-3,3])$

O una esfera:

load(draw); (Recuerda, Ctrl + Intro para ejecutar el comando)
draw3d(enhanced3d = true, implicit(0=(x^2+y^2+z^2-10), x,-5,5,y,-5,5,z,-5,5), proportional_axes=xyz);

El formato gnuplot abre una ventana nueva que permite rotar la superfície.

Otra superfícies curiosas son:

El Zitrus:
draw3d(enhanced3d = true, implicit(x^2+z^2=(y^3)*(1-y)^3,x,-0.2,0.2,y,0,1,z,-0.2,0.2));

El Spitz:
draw3d(enhanced3d = true, implicit((y^3-x^2-z^2)^3=27*x^2*y^3*z^2,x,-1,1,y,0,1,z,-1,1));

El Kreisel:
draw3d(enhanced3d = true, implicit(60*(x^2+y^2)*z^4=(60-x^2-y^2-z^2)^3,x,-8,8,y,-8,8,z,-8,8));

Y Dullo:
draw3d(enhanced3d = true, implicit(x^2+y^2=(x^2+y^2+z^2)^2,x,-1,1,y,-1,1,z,-0.5,0.5));

Claro que para ver estas superfícies y jugar con ellas también podemos usar el programa Surfer, basado en surf, con licencia GPL, o la versión Java: jSurfer.

Por último, comentar que otra opción excelente es el programa libre SAGE, con el que podemos entender mejor, por ejemplo, operaciones con vectores de forma gráfica y mediante un interfaz web que se puede compartir.

No hay comentarios:

Publicar un comentario