You are on page 1of 28

Tema 2

Cálculo simbólico y numérico con


Maxima

M AXIMA es un sistema para la manipulación de expresiones simbólicas y numéri-


cas, incluyendo diferenciación, integración, desarrollos en series de Taylor, transforma-
das de Laplace, ecuaciones diferenciales ordinarias, sistemas de ecuaciones lineales,
vectores, matrices, tensores, etc.
M AXIMA produce resultados con alta precisión usando fracciones exactas y repre-
sentaciones con aritmética de coma flotante arbitraria. Además, puede graficar funcio-
nes y datos en dos y tres dimensiones.
M AXIMA es un programa gratuito de código abierto. Su código fuente puede ser
compilado sobre varios sistemas incluyendo Windows, Linux y MacOS X. El código
fuente para todos los sistemas y los binarios precompilados para Windows y Linux
están disponibles en el Administrador de archivos de SourceForge (http://maxima.
sourceforge.net).
M AXIMA es un descendiente de M ACSYMA, el legendario sistema de álgebra compu-
tacional desarrollado a finales de 1960 en el Instituto Tecnológico de Massachusetts
(MIT). Es un sistema basado en el esfuerzo voluntario de muchos programadores y
de una comunidad de usuarios activa, gracias a la naturaleza del open source. El pro-
grama está en constante actualización, corrigiendo bugs y mejorando el código y la
documentación. La mayor parte de la discusión se hace por medio de listas de correo.

2.1. Interfaz gráfica (front end)


Existen tres formas posibles en las que el programa M AXIMA se presenta al usua-
rio, la ventana de línea de comandos básica y dos interfaces gráficas: WX M AXIMA y
XM AXIMA, aparte de otros programas, como el TEXmacs, que también permiten enviar
instrucciones al M AXIMA.
¿Qué interfaz se recomienda? A los usuarios nuevos les suele gustar empezar con
WX M AXIMA , ya que tiene numerosos menús que facilitan aplicar las funciones del M A -
XIMA en las tareas más comunes. Además esta interfaz permite combinar el texto, los
cálculos y gráficas en un documento único, que se puede grabar de forma permanen-
te, y utilizar como gestor del trabajo realizado. Para estos nuevos usuarios, como es
obvio, el uso de los menús y botones les permiten un aprendizaje más rápido de la
sintaxis del M AXIMA. No obstante, no debe olvidarse que este modo no es exhausti-

25
26 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

vo, ya que no puede contener todos los comandos del M AXIMA que se necesitan en
una aplicación práctica. Los usuarios expertos tienden a trabajar al unísono en las dos
interfaces, WX M AXIMA and X MAXIMA, cambiando a X MAXIMA cuando ya conocen los
nombres de las funciones que necesitan y prefieren una interfaz estable, sin distraccio-
nes. Por último, es importante conocer que la interfaz X MAXIMA se mantiene bastante
invariable a lo largo de las nuevas versiones del M AXIMA, mientras que el WX M AXIMA
se está desarrollando de forma activa y suele cambiar frecuentemente su apariencia y
contenido en las sucesivas versiones del programa.

2.2. Descarga e Instalación


En entornos Linux la instalación del programa M AXIMA es muy sencilla, suponiendo
que queremos usar el front end WX M AXIMA lo único que tenemos que hacer es abrir
una terminal como root y escribir:
yum install wxmaxima (si estamos usando Fedora)
apt-get install wxmaxima (si estamos usando Debian o Ubuntu)
El programa de instalación se encargará automáticamente de revisar qué bibliote-
cas adicionales necesitamos para instalar el WX M AXIMA, nos informará de toda la
lista de paquetes que vamos a instalar, las descargará de internet (concretamente
de http://sourceforge.net/projects/maxima/files) y las instalará. Finalizado este
proceso (unos pocos minutos si nuestra conexión a internet es razonablemente rápida)
ya estamos en situación de empezar a usar el M AXIMA.

2.3. Primera sesión con Maxima


Para esta primera sesión utilizamos el Maxima en línea de comandos. Una vez
accedemos a Maxima lo primero que vamos a ver será el siguiente mensaje:
Maxima 5.20.1 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (a.k.a.GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
( %i1)
Tras la información sobre la licencia GNU-GPL, nos informa sobre la versión con la
que estamos trabajando y la página web del proyecto. A continuación, ya aparece el
indicador ( %i1), donde i es abreviatura de input, y el 1 indica su número, esperando
nuestra primera acción. Si queremos calcular una simple suma tecleamos la operación
deseada seguida de un punto y coma (;) y una pulsación de la tecla de retorno.
( %i1) 2.5+4;
a lo que Maxima da la primera respuesta en la forma, (o en este caso, es abreviatura
de output),
( %o1) 6.5
( %i2)
indicando al final, con ( %i2), que Maxima espera nuestra segunda instrucción.
Recordamos que en la notación anglosajona, la que sigue el Maxima, la separación
2.3. PRIMERA SESIÓN CON MAXIMA 27

entre la parte entera y la parte decimal de un número se realiza mediante un punto (.),
de tal forma que la siguiente acción da un resultado de error
( %i2) 2,5+4;
Improper argument to ev:9
 an error. To debug this try: debugmode(true);
El programa numera el input recibido, independientemente de que exista o no, un out-
put. Como se ve en este ejemplo, los mensajes de advertencia y error no son conside-
rados como verdaderos resultados de cálculo (output). El punto y coma actúa también
como un separador cuando escribimos varias instrucciones en un misma línea. Nues-
tra siguiente operación consistirá en asignar el valor 125 a la variable x y 46 a la y,
solicitando luego su producto,
( %i3) x:125; y:46; x*y;
( %o3) 125
( %o4) 46
( %o5) 5750
conviene prestar atención al hecho de que la asignación de un valor a una variable
se hace con los dos puntos (:), no con el signo de igualdad, que se reserva para las
ecuaciones. Como vemos, el Maxima va notificando al usuario cada uno de los cálcu-
los que realiza, en este caso, la asignación del valor 125 a x, con el correspondiente
output3, la asignación del valor 46 a y, con el correspondiente output4, y el producto
xy con valor 5750, y correspondiente output5. Dado que en general no necesitamos
que nos confirme todos los pasos de cálculo realizados, el comando “$” sustituye al
final de una expresión al “;”, e indica al Maxima que no debe mostrar el output corres-
pondiente. Como ejemplo, el producto anterior tiene la expresión más directa
( %i3) x:125$ y:46$ x*y;
( %o3) 5750
Obsérvese que el número de inputs necesarios para realizar la operación es el mismo
que antes, aunque no todos sean explícitos. Analicemos ahora brevemente el uso del
comando “=” en este ejemplo. Si hubiéramos cometido el error de utilizar “=”, en lugar
de la asignación “:” en y, el resultado es el siguiente
( %i3) x:125; y=46; x*y;
( %o3) 125
( %o4) y=46
( %o5) 125 y
Esto quiere decir que Maxima admite la ecuación y = 46 genérica, pero no tiene orden
de asignar ningún valor a y, por lo que el producto xy para Maxima es el producto de
125 e y. Reiniciemos ahora el Maxima, con el comando “kill(all);”. Con eso, limpiamos
la memoria, y el programa se reinicia solicitando el primer input. Retomemos entonces
al caso anterior con la asignación de 125 a x y 46 a y. Las asignaciones a variables
se mantienen activas mientras dure la sesión con Maxima, por lo que podemos restar
las variables x e y, con el resultado
( %i1) x:125$ y:46$
( %i3) x-y;
( %o3) 79
Es importante puntualizar aquí que Maxima no admite la expresión xy, como el pro-
ducto de x por y, sino que considera la expresión xy como una sola variable. Por eso,
un input del tipo 2y daría un mensaje de error, ya que debemos escribir 2 ∗ y.
28 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

Uno de los errores más comunes que se comenten con los programas de cálculo
simbólico es evaluar una expresión o proceso para una variable x, digamos, cuando ya
existe una asignación con ese nombre x. Pongamos un ejemplo. Queremos resolver
la ecuación algebraica x2 = 2, en x aunque ésto sea obvio, debemos √ explicitarlo en
el programa. Las soluciones que queremos confirmar son x = ± 2. Aunque no se
haya estudiado todavía, la estructura del comando de resolución “solve” es fácil de
entender: “solve(ecuación,x)”. Ejecutando esta acción, encontramos que
( %i4) solve(x^2=2,x);
A number was found where a variable was expected - 'solve'
 an error. To debug this try: debugmode(true);
nos da un error, la variable x no es tal variable, es un número (igual a 125). Para resol-
ver este problema, sin reiniciar el programa, basta eliminar de la memoria la asignación
a x. El comando a utilizar es “kill”, en la forma
( %i5) kill(x);
( %o5) done
y de nuevo, al ejecutar “solve”, obtenemos la respuesta correcta
( %i6) solve(x^2=2,x);
( %o6) [x = -sqrt(2), x = sqrt(2)]
En este caso, la resolución de la ecuación desde el punto de vista del Maxima simple-
mente es dar ecuaciones más sencillas equivalentes a la original, donde la variable x
está despejada. Es importante destacar que esta solución no es una asignación, no
tiene el signo de puntuación “:”, y por tanto, la variable x sigue siendo una variable,
( %i7) x;
( %o7) x
Hasta ahora no hemos hecho uso de la numeración de los inputs y outputs, que
parecía en principio sólo servían para el control de los cálculos. Sin embargo, dichas
entradas ( %in) quedan grabadas en la sesión, y podemos en cualquier momento, re-
calcular su expresión, sin tener que copiarlo explícitamente. Así por ejemplo, al repetir
el primer input obtenemos
( %i8) %i1;
( %o8) x:125
Con la expresión obtenida en el output, vemos que sólo ha transcrito el input 1. Para
comprobar si esta acción se ha ejecutado de nuevo, basta solicitar el valor de x,
( %i9) x;
( %o9) x
Realmente lo que hemos realizado es una copia del input sin ejecutarla. Si quisiéramos
que se ejecutara, tendríamos que colocar dos comillas simples (no una comilla doble)
antes del input a realizar. De esta forma,
( %i10)  %i1;
( %o10) 125
( %i11) x;
( %o11) 125
Antes de terminar esta primera sesión vamos a hacer uso del programa de ayuda
básico para buscar información sobre las funciones definidas en Maxima. El comando
se denomina “describe”, y como ejemplo utilizamos la función de raíz cuadrada “sqrt”
que hemos visto anteriormente,
( %i12) describe(sqrt);
 Función: sqrt (<x>)
2.4. PRIMERA SESIÓN CON WXMAXIMA 29

Raíz cuadrada de <x>. Se representa internamente por `<x>^(1/2)'. Véase


también `rootscontract'.
( %o12) true
Para no perder los resultados y cálculos desarrollados en la sesión, podemos guar-
dar en un archivo los valores que nos interesen, de variables, instrucciones y resulta-
dos. Por ejemplo, para grabar en el archivo sesion1, los valores de x, y, y la instrucción
del %i6 con el nombre de “resolucion”, la instrucción sería
( %i13) save("sesion1",x,y,resolucion= %i6)$
Comprúebese que el primer nombre es el archivo, junto con su ruta de acceso si es
necesario, que las variables x e y se escriben tal cual, pero que las referencias a inputs
y outputs deben ser referenciadas con nombres de cadena, para poder ser reconoci-
bles por el Maxima al abrir este archivo, ya que tanto %in como %on van variando con
el desarrollo del cálculo. Una vez terminada la sesión, la forma correcta de abandonar
la sesión es mediante el comando
( %i14) quit();
Abramos ahora una nueva sesión con el wxMaxima. Para cargar el archivo anterior
desde el wxMaxima, ejecutamos la sentencia
( %i1) load(sesion1);
A diferencia del Maxima en línea de comandos, en el wxMaxima para ejecutar
una instrucción debemos presionar shift + enter . Ejecutando el anterior ( %i1)
comprobamos que obtenemos los resultados grabados, para x e y
( %i2) x; y;
( %o2) 125;
( %o3) 46
y también podemos comprobar que hemos recuperado la instrucción que resuelve
la ecuación en x,
( %i4) resolucion;
( %o4) solve(x^2=2,x)
y si queremos realizarla, bastaría con la secuencia de instrucciones, como hemos visto
( %i4) kill(x)$ resolucion;
( %o5) [x = -sqrt(2), x = sqrt(2)]

2.4. Primera sesión con wxMaxima


Según muestra la página web del wxMaxima:
http://wxmaxima.sourceforge.net/wiki/index.php/Main_Page
las ventajas de esta interfaz respecto al XMaxima, son, entre otras
Creación de documentos, con texto y cálculos matemáticos, que permiten grabar
y cargar las sesiones de trabajo.

Ventanas de diálogo, cuando se utilizan funciones del Maxima con más de un


argumento, que permiten introducir los datos sin recordar la sintaxis exacta.

Sistema de menús, con la mayoría de las funciones del Maxima, ordenadas por
secciones y aplicaciones.
junto con mejoras en la visualización de las expresiones matemáticas de salida, en la
transcripción de comandos, animaciones, etc. Desde esta misma página, se pueden
30 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

descargar tutoriales que contienen archivos en el formato propio de la aplicación (wxm),


que pueden ser cargados en la sesión del wxMaxima. El archivo 10minute.zip contie-
ne un tutorial para realizar en 10 minutos del wxMaxima, y el archivo usingmaxima.zip
ofrece información general sobre la aplicación, en particular lo que nos interesa más
en esta sección, sobre la estructura de celdas del wxMaxima.

2.4.1. Estructura de celdas


De forma distinta a la típica línea de comandos del Maxima, que trabaja con un sis-
tema de input-output único, wxMaxima utiliza un concepto dinámico de evaluación, en
el que puede unir texto, cálculos y gráficas. Cada documento del wxMaxima consiste
en un número de las llamadas celdas. La celda es un conjunto básico de instruccio-
nes, y está visualmente identificada por un borde superior e inferior. Las celdas son
de distintos tipos, celdas de título, de sección, de texto, y las más importantes para
nosotros, la celda de entrada o de input.
Una vez escrito el texto y las instrucciones en la celda (que aparece con bordes
rojos antes de su evaluación), la celda se evalúa al pulsar en el teclado la combinación
de teclas shift + enter . En ese momento, el código completo escrito en la celda es
enviado al Maxima, que lo verifica, y comprueba que cada línea de código termina en
“;” o en “$”. Si no es así, añade el símbolo “;” al final de cada línea. Hacemos notar que
en wxMaxima la línea de código no tiene por qué limitarse a una línea de texto. Una
vez corregida la sintaxis, Maxima procede a la evaluación de la celda, y en la celda van
apareciendo los sucesivos ( %in) y ( %on) que son indicación del progreso del cálculo.
El programa permite tener distintos colores para los datos de entrada y salida, y los
input y output asociados. Esto permite una mejor visualización del contenido de la
celda. Una vez evaluada la celda, para acceder a la siguiente celda, se debe pulsar la
tecla enter y aparecerá la celda en el color asignado a las celdas sin evaluar (rojo por
defecto). Las celdas ya evaluadas se pueden modificar y recalcular, se pueden copiar
y borrar, tras resaltar con un click la imagen de celda, a la izquierda de la línea de
código. La copia de la celda sólo contiene las instrucciones de entrada de la original,
en espera de su evaluación. El documento creado puede grabarse (p. ej. desde el
menú Archivo); debemos tener en cuenta que sólo serán grabados los inputs de cada
celda, los outputs no son grabados. Posteriormente, cuando sea cargado el archivo o
documento, debemos evaluar las celdas para obtener los resultados esperados.

2.4.2. Configuración del wxMaxima


Desde el menú Maxima se pueden visualizar los paneles de comandos básicos:
Matemáticas generales y Estadística, así como el panel de Historia, que contiene los
últimos comandos utilizados, y el panel de Insertar celda. El tipo, color y tamaño de
letra se configura en el menú Editar/Preferencias. Una vez realizados los cambios
oportunos, pueden guardarse las especificaciones en el archivo style.ini, para poder
cargarlas posteriormente en el inicio de sesión.
La mayoría de los comandos comunes en Maxima aparecen al seleccionar los
menús directores: Ecuaciones, Álgebra, Análisis, Simplificar, Gráficos y Numérico.
En el momento de seleccionar uno de ellos, Maxima lo actualiza con el dato que
figura en la celda activa. Si no existiera este dato (no existe una celda activa), Maxima
calcula el resultado para un input nulo, numéricamente igual a 0. Por tanto, si queremos
2.4. PRIMERA SESIÓN CON WXMAXIMA 31

utilizar esta forma directa de escritura, debemos escribir primero los datos en la celda
activa, antes de seleccionar el comando de Maxima. Cuando el comando necesite de
más de un dato de entrada, como puede ser el comando “solve” que necesita una
ecuación y una variable, al ser seleccionado, Maxima abre una ventana de diálogo
para introducir estos datos adicionales, junto con el dato obtenido de la celda activa.
Como ejemplo de entrada de datos mostramos cómo calcular en una celda el área
total y volumen de un cilindro de radio R = 3, y altura H = 6, con unidades arbitrarias.
Matemáticamente, el área total es suma del área de cada base circular y el área de la
pared vertical, con el valor A = 2πR2 +2πRH = 2πR(R+H). El volumen es el producto
base × altura, V = πR2 H. Antes de realizar este cálculo recordamos que:

1. El número π = 3, 141592 . . . es una constante predefinida en el Maxima con el


símbolo %pi

2. Debemos introducir enter tras cada línea de texto para acceder a la siguiente.

3. Maxima diferencia entre mayúsculas y minúsculas y no tiene en cuenta los es-


pacios en blanco entre variables y datos. Para el Maxima, las instrucciones ne-
cesarias para este cálculo serían las siguientes. Escribimos en la celda activa

> (R : 3, H : 6)$ A : 2* %pi*R*(R + H); V : %pi*R^2*H;


Hasta ahora, no hemos enviado la celda activa al Maxima, observamos que el corchete
de la celda, a la izquierda de las líneas de texto, está en rojo (color por defecto), y
tenemos el cursor parpadeando en algún espacio de línea en el interior de la celda.
Si ahora pulsamos shift + enter , todos los comandos se ejecutan, y se muestran
los outputs a medida que Maxima los obtiene, en el mismo orden que se encuentran
los inputs. Además en la salida de datos, sólo aparecerá numerado el input primero
de la secuencia. En el caso anterior, la respuesta sería
( %i1)(R:3, H:6)$ A:2* %pi*R*(R + H); /*área total*/ V: %pi*R^2*H; /*volumen*/
( %o2) A : 36* %pi
( %o3) V : 54* %pi
Hemos introducido aquí dos líneas no ejecutables (mediante la sintaxis “/*texto*/”),
como comentarios para facilitar la descripción del contenido. Una observación, la pri-
mera línea de comando contiene varias instrucciones en un solo paréntesis, por eso
el Maxima lo considera un único input. Dado que Maxima es un programa simbólico,
mantiene la notación para las constantes predefinidas sin evaluarlas numéricamen-
te. Si deseamos obtener el valor numérico del área y volumen, debemos utilizar el
comando “numer” en la siguiente forma
> %pi, numer; [A, V], numer;
con el resultado
( %i4) %pi, numer, [A, V], numer;
( %o4) 3.141592653589793
( %o5) [113.0973355292326,169.6460032938488]
El número de decimales depende de la precisión del cálculo (por defecto es de 16
dígitos), que puede establecerse por el usuario de manera arbitraria en el menú “Nu-
mérico/Establecer precisión.
32 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

2.4.3. Control del cálculo y memoria


Como otras características importantes, desde el menú de comandos Maxima, se
permite interrumpir en cualquier momento el cálculo de una celda activa, por ejemplo,
evitando así demoras si el usuario decide que la ejecución se ralentiza demasiado;
permite borrar el contenido de la memoria, aplicando el comando “kill(all)”, y reiniciar
Maxima. Asimismo el comando “Maxima/Conmutar pantalla de tiempo activa” desacti-
va el controlador de tiempo que ha sido necesario en cada evaluación de celda activa.
Un último apunte dentro de esta sección, para indicar con un ejemplo cómo aplicar
los comandos de Maxima sólo a una parte de la celda activa. El menú “Simplificar” con-
tiene comandos que permiten encontrar expresiones más sencillas (‘simplificadas’) a
las dadas. El termino ‘simplificado’ no tiene una acepción clara y evidente, puesto que
Maxima no tiene forma de conocer qué es una expresión más sencilla para el usuario.
No obstante, desde el punto de vista matemático, existen comandos bastante comple-
tos para la simplificación racional y trigonométrica, para la factorización y expansión
de expresiones. Del que nos vamos a ocupar brevemente aquí es del comando de
simplificación racional “ratsimp”, con el caso de estudio
( %i1) (x^2-1)/(x-1)+log(x);
( %o1) (x^2-1)/(x-1)+log(x)
Si quisiéramos simplificar la primera parte de la fórmula anterior, bastaría resaltar la
expresión (x2 − 1)/(x + 1), y aplicar desde el menú la simplificación racional. Entonces,
se abre una celda nueva con este resultado parcial,
( %i2) ratsimp(x^2-1)/(x-1));
( %o2) x+1

2.4.4. Manual de wxMaxima


Desde el menú Ayuda se accede a toda la información sobre el programa Maxima,
incluidos tutoriales, ejemplos y sugerencias para el usuario. Asimismo desde la celda
activa, una vez resaltado un comando, la tecla F1 abre el Manual de Maxima para
mostrar la entrada de esa función (principalmente su significado y sintaxis completa).

2.4.5. Expresiones en Maxima


La unidad básica de información de Maxima es la expresión. Una expresión es una
combinación de variables, números, operadores y constantes. Las variables (p. ej. x,
area) deben tener un nombre que no coincida con palabras reservadas del Maxima (p.
ej. “exp”, “array”, “sum”), y no necesita declararse su tipo (entero, real, complejo, de ca-
dena, etc.). Los operadores son los comandos del Maxima, o cualquier otra función de
variables definida por el usuario. Las constantes predefinidas son entre otras, la base√
los logaritmos naturales e (definida como %e), la unidad compleja imaginaria i = −1
( %i), el número π ( %pi), el infinito real positivo +∞ ( %inf) y el infinito real negativo
−∞ ( %minf). Sus valores numéricos se obtienen con la sentencia del operador “float”,
muy similar al anterior “numer”:
( %i2) float([ %e, %pi, %i]);
( %o2) [3.141592653589793, 2.718281828459045, %i]
La constante %i, al ser compleja no es evaluada numéricamente. El producto %i* %i
daría el valor numérico -1.0, en coma flotante. En cuanto a las palabras reservadas,
2.4. PRIMERA SESIÓN CON WXMAXIMA 33

una forma rápida y sencilla de evitar estos conflictos en la definición es comprobar su


posible existencia en el índice del manual de Maxima en el momento de seleccionar un
nombre de variable nuevo. Como hemos comentado antes el Maxima diferencia entre
mayúsculas y minúsculas, de modo que, dado que los comandos del Maxima siempre
van en minúsculas, una buena práctica es definir las funciones del usuario, y en su
caso las variables, con mayúsculas.

2.4.6. Operaciones con números y expresiones: Operaciones arit-


méticas
Los operadores aritméticos más comunes son suma (+), resta (−), multiplicación
(∗), división (/), y potencia (^). Maxima siempre devuelve los resultados de forma exac-
ta, sin aproximaciones ni cálculos numéricos. Así podemos obtener resultados senci-
llos de expresiones complicadas como
!−3
25
1
1+ (2/3)3 +(3/2)2

en forma exacta
( %i1) (2^5/(1+1/((2/3)^3+(3/2)^2))))^(-3);
( %o1) 681472000000
56181887

Para evaluar este número en coma flotante, basta aplicar el operador “numer”, “float”
ó “bfloat”
( %i2) %, numer;
( %o2) 8.2441959464218638 10−5
Recordamos que la precisión de esta operación puede variarse por el usuario desde
el menú “Numérico/Establecer precisión.
Maxima puede trabajar con precisión arbitraria. Por ejemplo, para calcular la po-
tencia π e con 50 cifras decimales, tenemos dos opciones: Modificar la precisión desde
el menú anterior para 101 dígitos, con lo cual cada cálculo posterior se realizará con
esa precisión, o directamente desde la línea de código, asignando a la variable interna
de precisión “fpprec” para grandes flotantes (bfloat) el valor 50, con lo cual sólo será
válida esa precisión para la celda activa. Obtenemos
( %i3) fpprec:50$ bfloat( %pi^ %e);
( %o3) 2.2459157718361045473427152204543735027589315133997b1
Nótese que cuando utilizamos grandes números de coma flotante con Maxima el ex-
ponente se escribe con la letra “b”, en lugar de la usual “e”(xbn quiere decir x × 10n ).

2.4.7. Teoría elemental de números con Maxima


Maxima tiene una serie de comandos que resultan muy útiles para verificar teore-
mas de la teoría de números, y que además nos sirven para poner en práctica parte
de lo aprendido hasta ahora. Tenemos “primep(numero)” que verifica si el número da-
do es primo o no, las respuestas pueden ser “true” ó “false” (aunque considera por
convención que el número 1 no es primo), “next_prime(numero)” que retorna el primer
número primo correlativo mayor que el número dado, “gcd(numero1, numero2)” da el
máximo común divisor de los dos números dados, y finalmente “ifactor(numero)” que
34 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

factoriza el número dado en números primos, elevados a las potencias correspondien-


tes. Utilizando algunos de estos comandos, vamos a plantearnos resolver de forma
sencilla ¿cuántos número primos hay entre 1 y 200, aceptando el 1 como primo?
La forma más directa sería ejecutar el comando “nextprimep(i)” sucesivamente des-
de el valor inicial i = 1 hasta llegar a superar el valor 200, apuntando el número de
veces N que ejecutamos la acción. El valor N será el número de primos que busca-
mos. El resultado en el Maxima sería
( %i1) i:1$ /* comenzamos con el valor inicial asignado i=1 */
correspondiente a la primera celda. En la segunda celda aplicamos el comando “pri-
mep”
( %i2) i : nextprimep(i);
( %o2) 2
que toma el valor i anterior al calculo, evalúa su primer número primo mayor, y le
asigna este valor de nuevo a i, que se muestra como output de la celda. Ejecutando
sucesivamente esta misma celda iremos modificando los valores i a números primos
cada vez mayores, hasta que alcancemos un número primo mayor que 200. El número
de veces que se ha ejecutado la celda será el valor N que buscamos. Obtenemos
N = 47. Nos preguntamos ahora cuántos de estos primos son de la forma 2n − 1,
siendo n un número entero. Para ello, basta introducir el comando “ifactors” en la celda
principal de cálculo con una nueva línea de instrucción
( %i2) i: nextprimep(i);
( %i3) ifactors(i+1);
( %o2) 2
( %o3) [[3,1]]
y así, con la factorización en números primos de i − 1, vamos a poder distinguir qué
factorización es de la forma 2n , y por tanto, que número primo es de la forma i = 2n −1.
La salida ( %o3) [[3,1]] indica que la primera factorización en números primos de
i + 1 da el resultado 31 . Ejecutando sucesivamente la celda, obtenemos los siguientes
números primos en la forma buscada, 1 = 21 − 1, 3 = 22 − 1, 7 = 23 − 1, 31 = 25 − 1
y 127 = 27 − 1. Viendo esta secuencia de números, parece claro que los números
primos se corresponden con cada exponente primo. Así Maxima nos ha servido para
intuir una regularidad para la construcción de números primos. Lo intentamos verificar
con un número n primo arbitrario grande
( %i-) (numero:1000, n:next_prime(1000), i:2^n-1)$ primep(i);
( %o3) false
lo que nos indica que la regularidad que intuíamos no era tal. Los números de la forma
Mp = 2p − 1 se denominan números de Mersenne, y como hemos visto no todos ellos
son primos. Hasta el día de hoy, sólo se conocen 45 números primos de Mersenne, el
mayor de ellos y descubierto en el 2008, tiene más de 12 millones de cifras decimales.

2.4.8. Simplificación, expansión y factorización


En multitud de ocasiones, cuando se utilizan programas de cálculo simbólico es
necesario conseguir expresiones analíticas más sencillas y manejables. El Maxima
dispone de numerosos comandos para simplificar expresiones (de forma racional, tri-
gonométrica, con números complejos), expandir o desarrollar funciones (logaritmos,
potencias), y factorizar números o términos en ecuaciones. Los comandos más comu-
nes son “ratsimp” para la simplificación de expresiones racionales, “trigsimp” simplifica
2.4. PRIMERA SESIÓN CON WXMAXIMA 35

expresiones trigonométricas, “factor” que factoriza todo tipo de expresiones, y “expand”


que desarrolla todos los términos que resultan de una expresión.
Uno de los problemas que tienen los programas de cálculo simbólico es que con
frecuencia no hacen de manera automática simplificaciones que a nosotros nos resul-
tan evidentes, sólo cuando el usuario lo solicita se llevan a cabo estas operaciones de
simplificación. Veamos el siguiente ejemplo con el Maxima
( %i1) (x^2-1)/(x+1);
( %o1) xx+1
2 −1

Maxima no invoca la simplificación a no ser que el usuario se lo precise. La simplifica-


ción se realiza dividiendo numerador y denominador por x + 1, es decir, factorizando
x2 − 1 = (x + 1)(x − 1) en el numerador. Si así se lo hacemos saber al Maxima,
obtenemos el resultado esperado
( %i1) factor((x^2-1)/(x+1));
( %o1) x+1
La conclusión es que, en lo que se refiere a simplificar expresiones (que es una tarea
nada trivial), la utilidad del Maxima depende del grado de experiencia matemática del
usuario. En particular no podemos esperar que Maxima nos dé los resultados que
queremos sin conocer de antemano qué técnicas utiliza para las instrucciones que
2 +1
le pedimos. Por ejemplo, no será capaz de simplificar la expresión xx+i (siendo i la
unidad imaginaria) por medio del comando “factor”, que utiliza términos reales, pero sí
hará esta operación al ejecutar el comando de factorización compleja “rectform()”
( %i1) factor((x^2+1)/(x+ %i));
( %o1) xx+i
2 +1

pero con
( %i2) rectform( %);
( %o2) x − i
Resolvemos ahora un ejemplo sencillo de identificación de fórmulas trigonométri-
cas. Para ello, hacemos uso de los comandos usuales de funciones trigonométricas,
“sin()” y “cos()” donde el argumento se escribe en radianes (por ejemplo, cos(π) =
−1). Queremos determinar si la fórmula 2 sin(2x)(cos2 (x) − sin2 (x)) = cos(3x) cos(x) +
sin(3x) sin(x) es correcta. Dado que las funciones angulares son todas múltiplos en-
teros de x una opción es realizar las expansiones trigonométricas de los senos y co-
senos de 2x y 3x, verificando que resultan expresiones idénticas en ambos miembros
(matemáticamente, bastaría confirmar que su resta es nula). Realizamos los cálculos
en distintas celdas, y a cada uno de los output le asignamos un nombre de variable
relacionado con lo que se calcula. Para el sin(2x), obtenemos el resultado conocido
del ángulo doble
( %i1) sen2x: trigexpand(sin(2*x));
( %o1) 2 sin(x) cos(x)
y para el ángulo triple, obtenemos
( %i2) sen3x: trigexpand(sin(3*x)); cos3x: trigexpand(cos(3*x));
( %o2) 3 cos2 (x) sin(x) − sin3 (x)
( %o3) cos3 (x) − 3 cos(x) sin2 (x)
Una vez realizamos estos cálculos previos, verificamos la veracidad de la fórmula pro-
puesta, utilizando las variables definidas (y asignadas) sen2x, sen3x, cos3x,
( %i4) 2*sen2x*(cos(x)^2-sin(x)^2)-cos3x*cos(x)-sen3x*sin(x);
( %o4) − cos(x)(3 cos2 (x) sin(x)−sin3 (x))+sin(x)(3 cos(x) sin2 (x)−cos3 (x))+4 cos(x) sin(x)(cos2 (x)−
2
sin (x))
36 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

Como era de esperar, Maxima no da un resultado simplificado ya que no se lo hemos


pedido, las únicas acciones que ha realizado es asignar los ordenes de aparición de
los términos entre paréntesis. Por tanto, debemos aplicar una simplificación posterior
para poder confirmar que la fórmula trigonométrica es correcta. Podemos hacerlo con
el comando indirecto “factor”, puesto que al factorizar Maxima encontrará un factor 0,
y por tanto, el resultado será 0, ó con el comando directo de simplificación geométrica
“trigsimp”. El resultado es
( %i5) trigsimp( %);
( %o4) 0
que confirma que la fórmula era correcta, puesto que tenemos un desarrollo de sin(4x)
en cada término.
Analizamos ahora un ejemplo de fracciones continuas, uno de los casos más típi-
cos es
1
1+
1 + 1+ 1 1
1+...

donde el proceso se extiende al infinito. Queremos verificar que tal suma de términos
tiene un valor finito y calcularlo. Ya que todavía no hemos introducido la definición
de funciones en Maxima, ni la programación, vamos a desarrollar este ejemplo con
los contenidos que conocemos hasta ahora. Elegimos la variable x como la variable
independiente de la fracción continua
( %i1) x;
( %o1) x
Lógicamente como x no tiene valor asignado, Maxima lo reconoce como tal. Aplicamos
ahora la primera asignación
( %i2) fraccion:1+1/ %;
( %o2) 1 + x1
y ya tenemos el desarrollo de la fracción continua en su primer término, al tomar como
input el output ( %o1). Si aplicamos de nuevo esta asignación, obtenemos
( %i3) fraccion:1+1/ %;
( %o3) 1 + 1+1 1
x
etcétera. Vemos entonces que podemos construir la fracción continua mediante la
sucesiva aplicación de una asignación muy simple. Más adelante, con el uso de fun-
ciones, este ejemplo se resolverá más fácilmente. Basta definir una función sobre los
enteros n, en la forma f (n) = 1 + f (n−1)
1
, y exigir que el término con n = 0 corresponda
a la semilla inicial x. En este caso, la fracción con n términos tiene la expresión de
f (n). Retomemos nuestro resultado, suponiendo que hemos aplicado la asignación
15 veces. Si queremos determinar el valor de la suma (por ahora en x), le decimos a
Maxima que simplifique la fracción, con el resultado
( %i17) ratsimp( %);
( %o17) 987x+610
610x+377
Este es el valor de la fracción continua con 16 términos. Si quisiéramos calcular numé-
ricamente su valor para un x dado, asignamos el valor a x y evaluamos numéricamente
el output 17. Para x = 0, obtenemos
( %i18) x:0$
( %i19) %o17, numer;
( %o19) 1.618037135278515
2.4. PRIMERA SESIÓN CON WXMAXIMA 37

Por tanto, la fracción continua está definida para todo valor de x. En realidad, se puede
demostrar que el límite de esta fracción continua cuando el número de términos es
infinito es único e independiente de x, con el valor 1,61803398874989.

2.4.9. Sustituciones
Es corriente también en el manejo de cálculo simbólico tratar con ecuaciones y fun-
ciones con dependencia funcional simple, p. ej. f (x), y necesitar ampliar los resultados
extraídos a funciones de comportamiento más complejo, el más común de todos es la
creación de la función compuesta, f [g(x)]. Para ello el Maxima incorpora el comando
dependiente de tres argumentos “subst(variable y, variable x, expresión)”, que aplica la
sustitución x → y sobre el argumento “expresión”. Como ejemplo, verifiquemos si una
función de dos variables dada es homogénea de grado p, es decir, vamos a comprobar
si f (λx, λy) = λp f (x, y) para un determinado exponente p que dependerá de la función
escogida. Ya que todavía no hemos introducido la definición de funciones, realicemos
el análisis con una expresión general. La introducimos en el Maxima
( %i1) (x3 + y3) / ( x2 * y2 ) + 2*x2 * y / (-3*x2 * y2 + 2*y4 -
x3*y);
2 3 3
( %o1) 2 y4 −32xx2 yy2 −x3 y + yx2+x y2
Para analizar si es homogénea, realizamos las sustituciones sucesivas x → λx, y →
λy, y verificamos si la expresión final cumple f (λx, λy) = λp f (x, y) para algún valor de
p. Primero realizamos la sustitución en x
( %i2) subst(lambda * x,x, %o1);
2 2 3 3 3
( %o2) −x3 y λ32−3x xy2 λy2 λ2 +2 y4 + xx2λy2+yλ2
A continuación, para la sustitución en y, elegimos %o2 como expresión, en la que se
sustituye y por λy
( %i3) subst(lambda*y,y, %o2);
2 3 3 3 3 λ3
( %o3) 2 y4 λ4 −32xx2 yy2λλ4 −x3 y λ4 + y xλ2 y+x
2 λ4

Nos queda verificar que la expresión final es proporcional a la expresión inicial, en una
potencia de λ. Para ello, hacemos la comparación
( %i3) factor( %o3/ %o1);
( %o3) λ1
Por tanto, la función f (x, y) es homogénea de grado −1.

2.4.10. Definición de funciones con Maxima


En Maxima existen varios tipos de asignaciones. Hemos visto que el comando “:”
sirve para asignar valores fijos a variables (p. ej. x : %pi), mientras que el símbolo “=”
determina una ecuación (p. ej. x2 − 1 = 0). Para definir funciones Maxima emplea la
sintaxis “función(variables) := expresión”, por ejemplo, f(x) := x2 es la instrucción
empleada para definir la función f (x) = x2 .
( %i1) f(x) := x2;
( %o1) f (x) := x2 ;
Para comprobar que f realmente es una función podemos verificar que f (a) ha queda-
do asignado a a2 , sea cual sea el valor de a, y sea también cual sea el tipo de variable
(número real, entero, complejo, . . . ).
( %i1) f(a);
38 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

( %o1) a2 ;
Para definir funciones de varias variables lo único que debemos hacer es introducir
el el lado izquierdo de la asignación la lista de variables separadas por comas, por
ejemplo, con f(x, y, z) := sqrt(x2 + y2 + z2)) obtenemos una función que
nos da la distancia entre el origen y el punto con coordenadas (x, y, z).

2.4.11. Operaciones elementales con vectores y matrices


Además de expresiones y funciones escalares, con Maxima también podemos ma-
nipular fácilmente expresiones que contengan vectores y matrices. Para ello empleare-
mos listas con varios elementos. Para asignar al parámetro a una lista de 6 elementos
(p. ej. A, B, C, D, E, F ) la sintaxis es la siguiente
( %i1) a:[A,B,C,D,E,F];
( %o1) [A, B, C, D, E, F ]
Si ahora aplicamos cualquier función u operador sobre a, la función se aplicará sobre
todos los elementos (por ejemplo calcule a2 , a−1 o sen a). Para extraer elementos de la
lista la notación es “a[n]”, siendo n el valor del índice cuyo elemento nos interesa (p.
ej. a[1] nos devuelve A). Al programar en Maxima muchas veces querremos aplicar la
misma función a una lista de valores, por ese motivo es útil que las listas en Maxima
funcionen de este modo. De todas formas conviene tener cuidado, ya que aplicar una
función elemento a elemento sobre una lista no es una operación que tenga significado
como operación vectorial. Por ejemplo, si definimos la lista b como
( %i2) b:[q,w,e,r,t,y]$
y calculamos a*b, obtenemos una lista cuyos elementos son a[i]*b[i] con i entre 1
y 6. En este caso, si lo que queremos es calcular el producto escalar de las listas a y
b consideradas como vectores, el comando que debemos usar es “.”:
( %i3) a.b;
( %o3) yF + tE + rD + eC + wB + qA
La definición de matrices es muy simple en Maxima, mediante el comando de cons-
trucción “matrix([elementos fila 1],[elementos fila 2],. . . )”. Por ejemplo, definamos la
matriz 3 × 3 M en la forma
( %i1) M : matrix([3,-1,0],
 [2,-3,1], [4,4,-2]);
3 −1 0
( %o1)  2 −3 1 
4 4 −2
Maxima almacena las entradas Mij de la matriz en las forma “M[i,j]”, p. ej. podemos
comprobar que “M[2,3]=1”.
El mismo operador que hemos usado antes para calcular el producto escalar (“.”) es
el que se usa para el producto de matrices y para el producto de matrices por vectores
(que es un caso particular del producto de matrices). Por ejemplo, para calcular el
resultado de aplicar M sobre el vector (x, y, z) hacemos
( %i2) M. [x, y, z]; 
3x − y
( %io2)  z − 3 y + 2 x 
−2 z + 4 y + 4 x
Por supuesto, para poder aplicar el operador de producto matricial “.” es necesario que
las matrices o vectores sobre los que actúa tengan las dimensiones adecuadas, de lo
contrario nos dará un error.
2.4. PRIMERA SESIÓN CON WXMAXIMA 39

El Maxima ofrece otras formas de introducir matrices. Por ejemplo, también es po-
sible definir la matriz M de forma interactiva con el comando “entermatrix” de Maxima,
a medida que nos vaya pidiendo los datos de entrada, una vez que queda definida la
dimensión de M ,
( %i3) M : entermatrix(3,3);
Para facilitar la entrada de datos, Maxima nos pregunta sobre el tipo de matriz que que-
remos definir; por ejemplo, si nuestra matriz es simétrica, Maxima sólo nos preguntará
por los elementos por encima y sobre la diagonal, ya que los restantes quedarán fija-
dos por simetría. El enunciado exacto nos pide introducir un número para caracterizar
la matriz, 1 si es diagonal, 2 si es simétrica, 3 si es antisimétrica, y 4 si es general, co-
mo nuestro ejemplo. Seguidamente, incluimos los datos celda a celda. Existe un tercer
método que es útil si los elementos de la matriz siguen una forma funcional de su po-
sición por filas y columnas, esto es, si conocemos una función f (i, j) tal que asigne a
cada entrada Mij de la matriz su valor correspondiente. Para poder construir matrices
por este método empleamos un tipo especial de función llamado function array, que se
define igual que las funciones normales pero con los argumentos entre corchetes, en
lugar de paréntesis, y posteriormente empleamos el comando “genmatrix”. Por ejem-
plo, la matriz de Hilbert de dimensión n está dada por los valores Hij = (i + j − 1)−1 ,
con i y j entre 1 y n, por tanto definimos
( %i1) componentesH[i,j] := (i+j-1)-1$
Construyamos ahora la matriz de Hilbert 4×4, utilizamos el comando “genmatrix(elementos,
no filas, no columnas)”. Con este comando Maxima aplica la función “elementos[i,j]” so-
bre todos los puntos de la matriz de las dimensiones asignadas. En nuestro caso,
( %i2) H: genmatrix(componentesH,4,4);
1 21 13 14

 1 1 1 1 
( %o2)  2 3 4
 1 1 1 1 
5 
3 4 5 2
1 1 1 1
4 5 6 7
Una de las características principales de las matrices de Hilbert es que aunque sus
elementos son de orden unidad su determinante es sorprendentemente pequeño. Utili-
zamos el comando “determinant()” y confirmamos esta característica en nuestro caso,
con seis cifras significativas
( %i3) fpprec:6$ determinant(H), bfloat; ( %o3) 1.65344b-7
Recordamos que los determinantes sólo están definidos para matrices cuadradas.
Otras construcciones que Maxima admite de forma directa, son la matriz identidad
“ident(dimensión)”, la matriz nula “zeromatrix(dimensión)”, y cualquier matriz diagonal
con todos los elementos iguales “diagmatrix(dimensión,elemento)”. Además tiene un
comando específico para verificar si una lista de elementos construida es una matriz,
“matrixp(lista)”, con dos posibles outputs, verdadero o falso.
Retomamos ahora la matriz M definida numéricamente al comienzo de esta sec-
ción. Con las matrices se pueden realizar numerosas operaciones en Maxima, por
ejemplo con el comando “addrow(matriz, fila nueva)” podemos añadirle una fila nueva
( %i2) M1:
 addrow(M, [0,2,0] );
3 −1 0
 2 −3 1 
( %o2)  4 4 −2 

0 2 0
y con el comando “addcol(matriz, columna nueva)” podemos añadirle una columna
40 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

nueva
( %i2) M2: addcol(M, [-1,2,2] );
 
3 −1 0 −1
( %o2)  2 −3 1 2 
4 4 −2 2
Podemos multiplicar matrices recordando que la regla de multiplicación matricial
de dos matrices A y B determina que el número de columnas de A debe ser igual al
número de filas de B, esto es A(n × k) · B(k × m) = matriz(n × m). Esto confirma que
siempre se pueden multiplicar matrices cuadradas de la misma dimensión. En el caso
anterior, entonces, podemos realizar la multiplicación de M1 por M2 y también M1 por
M, o la potencia M ·M ≡ M 2 , mientras que la multiplicación M2 por M no está definida,
y en ese caso el Maxima nos daría el mensaje de error “MULTIPLYMATRICES: attempt
to multiply nonconformable matrices - an error”. Para la potencia de matrices (p. ej.
M ·M ), aparte del operador de multiplicación matricial (M.M), puede usarse el operador
de potencia matricial , pero no puede usarse el operador de potencia normal ,
ya que con ese operador lo que obtendríamos sería la matriz original con todos sus
elementos elevados a la potencia indicada elemento a elemento, lo cual no es una
operación que tenga ningún significado como operación con matrices.
( %i5) M2;
 
7 0 −1
( %o5)  4 11 −5 
12 −24 8
Un ejercicio que puede hacerse con las operaciones definidas hasta ahora es
comprobar el teorema de los determinantes (det(A · B) = det(A) det(B), det(An ) =
det(A)n ).

2.4.12. Matrices Ortogonales, Rotaciones

La localización en el espacio euclídeo tridimensional suele darse en función del


vector de posición en coordenadas cartesianas respecto al origen de coordenadas r =
(x, y, z). Podemos definir un segundo sistema de coordenadas cuyo origen coincida
con el del primer conjunto, pero cuyos ejes tengan una orientación espacial diferente,
de modo que en el segundo sistema de coordenadas el vector r está dado por r ′ =
(x′ , y ′ , z ′ ). Decimos entonces que el sistema de ejes primado ha rotado en el espacio
respecto al sistema de ejes no primado. Ya que la rotación es una operación lineal,
podremos escribir la ecuación de transformación r → r ′ en forma matricial: r ′ = A · r.
Está claro que al rotar el sistema de ejes, la longitud del vector r no cambia, lo que
exige que la matriz A (con la que describimos esa rotación) sea ortogonal, es decir,
la matriz transpuesta debe ser igual a la matriz inversa (AT = A−1 ). El ejemplo más
sencillo de matriz de rotación en 3 dimensiones es la matriz de rotación de ángulo φ
alrededor del eje z
 
cos φ sin φ 0
A =  − sin φ cos φ 0 
0 0 1
2.4. PRIMERA SESIÓN CON WXMAXIMA 41

que genera la transformación

x′ = x cos φ + y sin φ
y ′ = −x sin φ + y cos φ
z′ = z

Nótese que la matriz A se reduce a la matriz unidad cuando el ángulo de rotación es


φ = 0, lógicamente.
Pasamos a comprobar las propiedades de esta transformación con el Maxima. En
primer lugar, dado que la matriz de rotación depende del ángulo de rotación φ, y éste
puede tomar valores arbitrarios, vamos a definir la matriz A(φ) como función de φ
( %i1) A(phi):= matrix([cos(phi),sin(phi),0],[-sin(phi),
 cos(phi), 0], [0,0,1]);
cos φ sin φ 0
( %o1) A(φ) :=  − sin φ cos φ 0 
0 0 1
Comprobamos ahora que esta matriz es ortogonal. Para ello, debemos evaluar su
inversa y su transpuesta, que en Maxima corresponden a los comandos “invert()” y
“transpose()”, con el resultado esperado de ortogonalidad
( %i3) invert(A(phi)); transpose(A(phi));
El cálculo de la matriz inversa requiere del cálculo del determinante de la matriz, que
en este caso es det(A) = sin2 (φ) + cos2 (φ). Maxima no simplifica este valor a la unidad
a no ser que lo pidamos explícitamente, p. ej. con el comando “trigsimp”. También
podemos comprobar que la longitud de un vector arbitrario se mantiene invariante
bajo esta rotación. Aplicando la matriz de rotación sobre un vector (x, y, z) obtenemos
el vector primado (“vectorP”)
( %i5) vectorP:
 A.[x, y, z];
sin φ y + cos φ x
( %o5) cos φ y − sin φ x
z
y por medio de trigsimp(vectorP.vectorP); podemos comprobar que el módulo al
cuadrado de r ′ coincide con el de r.
En general, dado un sistema de referencia arbitrario en 3 dimensiones la orienta-
ción de cualquier otro sistema de referencia, con origen en el mismo punto, se obtiene
a partir de la del primero aplicando 3 rotaciones consecutivas, con ángulos de rotación
α, β y γ (conocidos como los ángulos de Euler), de la siguiente forma: En primer lugar
debemos girar un ángulo α en torno al eje z, posteriormente un ángulo β en torno al
nuevo eje y (dado por la posición del eje y tras la primera rotación), y finalmente un án-
gulo γ en torno al nuevo eje z (dado por la posición del eje z tras la segunda rotación).
Matemáticamente la matriz de rotación que describe esta operación será el producto
de estas tres rotaciones

R(α, β, γ) = Az (γ)Ay (β)Az (α)

tomadas en el sentido descrito anteriormente. Las matrices de la rotación según el eje


z son las mismas que en el caso anterior, y la matriz de rotación según el eje y es
 
cos φ 0 − sin φ
Ay =  0 1 0 
sin φ 0 cos φ
42 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

Para determinar la expresión general de la matriz de rotación en Maxima, definimos


Ay en la forma
( %i8) Ay(phi):= matrix([cos(phi),0,-sin(phi)],[0,1,0],[sin(phi), 0,cos(phi)])$

para posteriormente evaluar el producto de rotaciones


( %i9) R(alpha,beta,gamma)
 = A(gamma) . Ay(beta) . A(alpha);
cos α cos β cos γ − sin α sin γ cos α sin γ + sin α cos β cos γ − sin β cos γ
( %o9) R(α, β, γ) =  − cos α cos β sin γ − sin α cos γ cos α cos γ − sin α cos β sin γ sin β sin γ
cos α sin β sin α sin β cos β
Podemos confirmar de nuevo que esta matriz es ortogonal y que mantiene invariante
la norma del vector r. Destacar que en la anterior línea sólo hemos indicado la forma
final de la matriz R(α, β, γ) (realizando el producto matricial Az (γ)Ay (β)Az (α)) pero
no hemos introducido una definición. Con la definición (por medio de “:=”) Maxima se
conforma con indicar que R(α, β, γ) está dado por el producto de las tres matrices, que
queda sin evaluar hasta que realicemos una llamada a la función R. Como punto final
de este apartado, queremos verificar dos propiedades de la matriz de rotación basada
en los ángulos de Euler:

a. La matriz es invariante bajo la transformación α → α + π, β → −β, γ → γ − π.


Para verificar esto evaluamos
( %i10) R(alpha,beta,gamma) := A(gamma) . Ay(beta) . A(alpha)$;
( %i11) subst(alpha+ %pi,alpha, R(alpha,beta,gamma))$ subst(-beta,beta, %)$
RP: subst(gamma- %pi,gamma, %)$
( %i12) R(alpha,beta,gamma) - RP;
 
0 0 0
( %o12)  0 0 0 
0 0 0

b. La inversa de R(α, β, γ) se obtiene deshaciendo las rotaciones efectuadas, es


decir rotando según los ángulos contrarios en el orden adecuado:

R−1 (α, β, γ) = R(−γ, −β, −α)

Para verificar esto evaluamos


( %i13) R(-gamma,-beta,-alpha) - trigsimp(invert(R(alpha,beta,gamma)));
 
0 0 0
( %o13)  0 0 0 
0 0 0

2.4.13. Autovalores y Autovectores


El cálculo de autovalores y autovectores es una de las cosas más frecuentes en la
actividad de un físico, sea cual sea el campo en el que trabaje. Todos los paquetes de
cálculo simbólico incorporan herramientas para este tipo de operaciones, cuya eficacia
está limitada siempre por la dimensión de la matriz con la que trabajemos, con matrices
más o menos pequeñas esto siempre es muy fácil de hacer, pero con matrices muy
grandes (p. ej. 106 × 106 ) esto se convierte en algo realmente difícil.
2.4. PRIMERA SESIÓN CON WXMAXIMA 43

Tomemos como un primer ejemplo el cálculo de autovalores y autovectores de una


matriz simétrica. Según la teoría de matrices todos sus autovalores deben ser reales
y los autovectores mutuamente perpendiculares. Definimos la matriz bajo estudio
( %i1) A: matrix([0,1,0],[1,0,0],[0,0,0])$
Los autovalores son las raíces de la ecuación característica

det(A − λI) = 0

En Maxima, la resolución de ecuaciones polinómicas se efectúa mediante el co-


mando “solve(ecuación,incógnita)”. Definimos primero la matriz extendida y su deter-
minante
( %i2) matrizD
 : A - lambda*ident(3);
 D : determinant(matrizD);
−λ 1 0
( %o2)  1 −λ 0 
0 0 −λ
( %o3) λ − λ3
El polinomio en λ que hemos obtenido (en este caso p(λ) = λ − λ3 ) se denomina
polinomio característico de la matriz A, y la ecuación característica p(λ) = 0 determina
los autovalores. Lo resolvemos con Maxima
( %i4) solve(D=0,lambda);
( %o4) [lambda=-1, lambda=1,lambda=0]
Comprobamos que todos son reales, y al ser distintos, no existe degeneración. Para
calcular los autovectores recordamos que para cada autovalor λ, el autovector corres-
pondiente debe satisfacer
(A − λI) · v λ = 0
es decir, A · v λ = λv λ . Aplicamos las matriz A sobre un vector arbitrario (x, y, z)
( %i5) condicion: matrizD . [x, y, z]$
e imponemos que se cumpla para cada uno de los 3 autovalores que hemos encon-
trado:
( %i6) condicion1 : subst(-1,lambda,condicion)$
( %i7) condicion2 : subst(+1,lambda,condicion)$
( %i8) condicion3 : subst( 0,lambda,condicion)$
Resolviendo cada una de estas condiciones obtenemos los autovectores correspon-
dientes a cada uno de los autovalores
( %i9) solve([condicion1[1,1]=0,condicion1[2,1]=0,condicion1[3,1]=0],[x,y,z]);
solve: dependent equations eliminated: (1)
( %o9) [[x= %r1,y=- %r1,z=0]]
Este resultado nos indica que el autovector del autovalor√λ = −1 es de la forma v =
c (1, −1, 0), siendo c un factor arbitrario. Tomando c = 1/ 2 obtenemos el autovector
normalizado √ √
v −1 = (1/ 2, −1/ 2, 0)
En este caso, de las tres incógnitas que aparecen en el sistema de ecuaciones que
hemos enviado al Maxima sólo se ha podido determinar de manera unívoca una de
ellas (z = 0), las otras dos quedan determinadas en función de un parámetro al que el
Maxima asigna el nombre %r1. Es decir, √ el subespacio
√ propio del autovalor λ = −1 es
la recta con vector director v −1 = (1/ 2, −1/ 2, 0).
Para el siguiente autovalor encontramos
( %i10) solve([condicion2[1,1]=0,condicion2[2,1]=0,condicion2[3,1]=0],[x,y,z]);
44 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

solve: dependent equations eliminated: (1)


( %o10) [[x= %r2,y= %r2,z=0]]
de donde deducimos que el autovector normalizado correspondiente al autovalor +1
es √ √
v +1 = (1/ 2, 1/ 2, 0)
√ √
por tanto el subespacio para λ = 1 es la recta con vector director v +1 = (1/ 2, 1/ 2, 0).
Finalmente para el tercer autovalor encontramos
( %i11) solve([condicion3[1,1]=0,condicion3[2,1]=0,condicion3[3,1]=0],[x,y,z]);
solve: dependent equations eliminated: (3)
( %o11) [[x=0,y=0,z= %r3]]
de modo que
v 0 = (0, 0, 1)
Es decir, el subespacio propio de λ = 0 es la recta con vector director v 0 = (0, 0, 1),
y observamos que estos tres subespacios propios son mutuamente ortogonales, tal y
como esperábamos.
Hasta ahora hemos hecho esto paso a paso, para ver cómo funciona el comando
de resolver sistemas de ecuaciones algebraicas “solve()”. El cálculo de autovalores y
autovectores es tan habitual que existen comandos específicos para hacerlo de una
sola vez. El comando del Maxima que proporciona los autovalores de una matriz es
“eigenvalues()”, y para los autovectores “eigenvectors()”.
El comando “eigenvalues(A)”
( %i12) eigenvalues(A);
( %o12) [[-1,1,0],[1,1,1]]
que da un listado de los autovalores (primer corchete), y sus correspondientes mul-
tiplicidades (segundo corchete). En este caso son todos reales y simples. Para los
autovectores el comando “eigenvectors(A)”
( %i13) eigenvectors(A);
( %o13) [[-1,1,0],[1,1,1],[-1,1,0],[1,1,0],[0,0,1]]
nos vuelve a dar en primer lugar los autovalores y sus multiplicidades y en segundo
lugar los tres autovectores correspondientes (no normalizados).
Una de las aplicaciones más importantes del cálculo de autovalores y autovectores
es la diagonalización de matrices. En el caso anterior, dado que los tres autovectores
son linealmente independientes, la matriz A admite una representación diagonal en la
forma  
−1 0 0
A′ =  0 1 0 
0 0 0
Con ayuda de los autovectores es fácil determinar qué matriz P define este cambio de
base, en la forma
A′ = P −1 · A · P
La matriz P está dada por
P = (v −1 , v 1 , v 0 )
es decir, está formada por los autovectores como columnas (siendo irrelevante la nor-
malización de los autovectores, tal y como puede comprobarse fácilmente). Con el
Maxima, el cálculo quedaría como sigue. En primer lugar extraemos del cálculo de
autovectores, los tres vectores fila independientes
2.4. PRIMERA SESIÓN CON WXMAXIMA 45

( %i14) listado : eigenvectors(A)$


vectorf1 : listado[2][1][1]$
vectorf2 : listado[2][2][1]$
vectorf3 : listado[2][3][1]$
ya que por ejemplo, la localización del vector v −1 en la variable listado es la siguiente:
se sitúa en el segundo grupo de datos, donde se listan los autovectores, dentro de ese
grupo, se encuentra en el primer grupo (ya que λ = −1 es el primer autovalor) y está
en primer lugar (ya que sólo hay un vector en ese subespacio). Lo mismo sucede con
los restantes vectores (ya que en este caso todas las multiplicidades eran 1). Hecho
esto, podemos definir la matriz P como una matriz de una sola columna, igual al vector
columna v −1 y posteriormente añadir los otros dos autovectores como dos columnas
adicionales
( %i15) matrizP
  : transpose(vectorf1);
1
( %o15)  −1 
0
( %i16) matrizP : addcol(matrizP,transpose(vectorf2))$
matrizP :  addcol(matrizP,transpose(vectorf3));
1 1 0
( %o16)  −1 1 0 
0 0 1
y confirmamos la transformación de semejanza a la forma diagonal
( %i15) invert(matrizP)
  . A . matrizP;
−1 0 0
( %o15)  0 1 0 
0 0 0
Otro cálculo interesante es verificar que el espacio generado por los tres auto-
vectores linealmente independientes se corresponde con todo el espacio euclídeo de
tres dimensiones; para ello basta demostrar, y se deja como ejercicio, que la matriz I
definida como la expansión matricial en los tres autovectores normalizados

I = v −1 v T−1 + v 1 v T1 + v 0 v T0

es la matriz identidad 3 × 3. Por tanto, para cualquier vector r del espacio euclídeo
tenemos
r = I · r = v −1 v T−1 · r + v 1 v T1 · r + v 0 v T0 · r
que podemos escribir como el desarrollo del vector r en la base formada por los tres
autovectores normalizados

r = x−1 v −1 + x1 v 1 + x0 v 0

donde xi = v Ti · r es el producto escalar, en notación matricial.


Con estos ejemplos hemos visto todo lo necesario para empezar a manejar el
Maxima por medio del front end wxMaxima. La mejor forma de aprender cualquier
lenguaje de programación es usándolo para resolver problemas concretos, de modo
que en lo que sigue indicaremos algunos problemas especialmente representativos
que pueden resolverse con el Maxima.
Aparte del material indicado en la bibliografía básica de la asignatura, como ayuda
para realizar estos ejercicios dispone del menú de ayuda del wxMaxima y del comando
46 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

“describe()”, que le mostrará en pantalla un resumen de la sintaxis y funcionamiento


de cualquiera de los comandos del Maxima.
El menú “Archivo” del wxMaxima contiene los comandos habituales para salvar el
trabajo realizado en esta sesión en un archivo (p. ej. “Salvar Como”, para que nos
pregunte con qué nombre y en qué directorio queremos guardar el trabajo), o para
abrir archivos guardados en sesiones anteriores.
Para realizar unos pocos cálculos rápidos puede ser suficiente con introducir todo
el input necesario en una única sesión. De todas formas, es posible también hacer
programas más elaborados construyendo nuestra propia biblioteca de funciones. Para
ello lo más conveniente es definir cada función que queramos emplear posteriormente
en un archivo independiente, almacenados todos ellos en un árbol de directorios bien
ordenado, que nos facilite la tarea de encontrar la función que buscamos. Para abrir
uno de estos archivos y evaluar las instrucciones que contenga existen varias alter-
nativas, la más sencilla sería emplear el comando batchload("path/filename"), que
evalúa todas las instrucciones que haya en el archivo filename, sin mostrarnos ni el
input ni el output correspondiente. Hay otras opciones, como p. ej. batch que sí nos
mostraría el input y correspondiente output.

2.5. Aplicaciones del Maxima en Algebra


2.5.1. Cambios de base
Escriba una función que aplique cambios de base sobre vectores

input: coordenadas del vector en la base estándar


vectores que forman la nueva base
output: coordenadas del vector en la nueva base

Escriba un programa que aplique cambios de base sobre matrices

input: coordenadas de la matriz correspondiente a una aplicación lineal en la base


estándar
vectores que forman la nueva base
output: coordenadas de la matriz correspondiente a la aplicación lineal en la nueva
base

Invierta las anteriores relaciones para escribir una función que genere las com-
ponentes de vectores y matrices respecto de la base estándar a partir de sus
componentes respecto a una base arbitraria

input: coordenadas del vector o de la matriz respecto de una base arbitraria


vectores que forman la base arbitraria respecto de la base estándar
output: coordenadas del vector o de la matriz en la base estándar

Ejercicio 1. Dada una aplicación lineal calcule sus autovalores y autovectores. Aplique las
funciones que ha definido en el apartado anterior para calcular la matriz corres-
pondiente a esa aplicación lineal en la base formada por sus autovectores. ¿Se
encuentra el resultado que se esperaba?
2.6. CÁLCULO CON FUNCIONES DE UNA VARIABLE 47

Ejercicio 2. A partir de la función para cambios de base realice un programa que calcule el
producto escalar de dos vectores expresados por medio de sus componentes
respecto de una base cualquiera.

2.6. Cálculo con funciones de una variable


Familiarícese con los comandos empleados para calcular límites, derivadas, inte-
grales (definidas e indefinidas):

Para calcular límites:

• Límites bien definidos: limit(expresión, variable, valor)


• Límites laterales: limit(expresión, variable, valor, dirección)

Para calcular derivadas:

• Primera derivada: diff(expresión, variable)


• Derivadas de orden superior: diff(expresión, variable, orden)
• Derivadas parciales de orden arbitrario diff(expresión, variable1, orden1,
variable2, orden2, ..., variablen, ordenn)

Para calcular integrales:

• Integral indefinida (primitiva): integrate(expresión, variable)


• Integral definida: integrate(expresión, variable, límite inferior, límite
superior)
• Integral numérica (en este curso nos centraremos en el cálculo analítico
de integrales, de todas formas indicamos a continuación la instrucción para
integrales numéricas): quad_qag

2.6.1. Desarrollos en serie de Taylor


Familiarícese con el comando taylor() para realizar desarrollos en serie de Taylor.

Desarrollos en serie de Taylor:


taylor(expresión, variable, punto en torno al que desarrollamos, orden)

Ejercicio 1. Realice un programa que proporcione los desarrollos en serie de Taylor sucesi-
vos de una función desde orden cero hasta un orden n arbitrario

input: La función a desarrollar, el punto en torno al que desarrollamos y el orden


máximo n
output: La lista de desarrollos en serie de Taylor correspondiente
48 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

2.7. Visualización
Familiarícese con el uso del Maxima para gráficas en dos y tres dimensiones.

Representaciones gráficas:
• Gráficas en 2D: plot2d(expresión,[variable, límite inferior, límite
superior], opciones). Por ejemplo: plot2d(sin(x),[x,- %pi, %pi])
• Gráficas en 3D: plot3d(expresión,[variable1, lím. inferior 1, lím.
superior1], [variable2, lím. inferior1, lím. superior1], opciones).
Por ejemplo: plot3d(sin(x2+y2),[x,- %pi, %pi],[y,- %pi, %pi])

Ejercicio 1. Emplee la función plot2d() para visualizar en una gráfica una función y sus co-
rrespondientes desarrollos en serie de Taylor en torno a un punto dado a orden
cada vez superior (por ejemplo puede considerar la función sin(x) y sus desarro-
llos sucesivos para n entre 0 y 10).

2.8. Solución analítica y numérica de ecuaciones


Las instrucciones básicas del Maxima para resolver ecuaciones y sistemas de
ecuaciones son
Ecuaciones algebraicas: solve(ecuación, variable)
Sistemas de ecuaciones algebraicas: solve(lista de ecuaciones, lista de
variables)
Solución numérica de ecuaciones (método de Newton): primero load("newton1"),
y posteriormente newton(ecuación, variable, valor inicial, precisión)

Ejercicio 1. Dada una ecuación F (x, y) = 0 escriba una función usando el comando solve
que despeje de forma analítica y en función de x, y defina de esta forma la
correspondiente función y = f (x).
Ejercicio 2. Con mucha frecuencia aparecen ecuaciones en las que no es posible realizar
esta operación analíticamente, es ese caso no hay más remedio que resolver
la ecuación numéricamente, lo cual sólo es posible una vez que hemos sumi-
nistrado un valor numérico concreto para x. Escriba una función por medio del
comando newton() que proporcione y en función de x resolviendo la ecuación
F (x, y) = 0 numéricamente.

Notas:
Un dato necesario para resolver este ejercicio es el conjunto de funciones con-
cretas F (x, y) que definen las correspondientes ecuaciones que queremos resol-
ver. Para ello puede probar con las funciones F que se le ocurran, aparte de esto
en la página web de la asignatura propondremos algunos ejemplos concretos.
Dependiendo de la función F (x, y) que consideremos, la anterior ecuación puede
tener o no solución, es conveniente tener esta información de antemano, para
ello puede emplear el comando plot3d().
2.8. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES 49

En el caso de la solución numérica conviene saber que el método de Newton


(que ya estudiará en la asignatura de Métodos Numéricos) es un método itera-
tivo que, por medio de un algoritmo, va produciendo aproximaciones cada vez
más precisas de la solución buscada. Para funcionar este método precisa que
el programador introduzca un primer valor aproximado de la solución (el tercer
argumento de la función newton). El éxito del método depende, entre otras co-
sas, del primer valor con el que iniciamos las iteraciones. En algunos casos el
método sólo converge a la solución que buscamos si el primer valor que nosotros
suministramos no está demasiado alejado de la solución buscada. Para calcular
esta primera aproximación a la solución lo más sencillo es visualizar F (x, y) por
medio de plot3d().

Un consejo: considere funciones F (x, y) tales que la ecuación F (x, y) = 0 tenga


una solución única. En problemas con múltiples soluciones el método de Newton
no siempre converge, lo cual es un tema muy interesante que estudiará en la
asignatura de Métodos Numéricos.

2.8.1. Función implícita


En aquellos casos en los que no es posible despejar y en función de x de la ecua-
ción F (x, y) = 0, el teorema de la función implícita nos garantiza que si F (x0 , y0 ) = 0
y F (x, y) es continua y diferenciable en un entorno del punto (x0 , y0 ), entonces la con-
dición F (x, y) = 0 define la correspondiente función y = f (x), al menos en un entorno
pequeño del punto (x0 , y0 ). (La extensión del entorno en el que puede definirse esta
función (determinado por la función F ) es un resultado muy interesante que se estudia
en la asignatura de Análisis Matemático).

Ejercicio 1. Utilice el programa de la sección anterior para generar una aproximación a la


función y = f (x) en forma de serie de Taylor (de orden n arbitrario), válida en un
entorno de x0 .

Ejercicio 2. Visualice los resultados obtenidos mediante gráficas por medio de la función
plot2d().
Notas:

Para realizar este ejercicio deberá calcular las derivadas (desde la primera hasta
la n-ésima) de la función y = f (x) en el punto x0 . Para ello debe derivar respecto
de x la relación F [y(x), x] = 0 utilizando diff(), posteriormente deberá utilizar
subst() para sustituir x e y por x0 e y0 y finalmente deberá usar solve() para
despejar la derivada buscada.

Esta operación deberá hacerse de manera secuencial, desde la primera derivada


hasta la de orden n.

2.8.2. Función inversa


Como caso particular del teorema de la función implícita tenemos el teorema de la
función inversa, que nos garantiza que la relación y = f (x) define a x como función
de y, al menos localmente (relación que se obtiene resolviendo para x la ecuación
50 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

f (x)−y = 0). (La extensión del entorno en el que puede definirse la función x = f −1 (y)
(determinado por la función f ) es un resultado muy interesante que se estudia en la
asignatura de Análisis Matemático). Cuando no es posible despejar x en función de
y analíticamente no hay más remedio que hacerlo numéricamente, para ello en este
curso usaremos el comando newton().

Ejercicio 1. Dada la relación y = f (x), aplique el programa anterior para obtener una apro-
ximación en forma de serie de Taylor para la función x = f −1 (y), válida en un
entorno de y0 .

Ejercicio 2. Visualice los resultados obtenidos mediante gráficas por medio de la función
plot2d().

Notas:

Un dato necesario para resolver este ejercicio es el conjunto de funciones con-


cretas f (x) que vamos a considerar. Para ello puede probar con las funciones f
que se le ocurran, aparte de esto en la página web de la asignatura propondre-
mos algunos ejemplos concretos.

2.9. Ajustes
Dada una colección de puntos (xi , yi ) con i = 1, 2, . . . , N , que podrían ser p. ej. los
resultados de un experimento, necesitamos generar una función que los ajuste para
posteriormente realizar cálculos con ellos.
Siempre que dispongamos de un conjunto de datos y de un modelo o teoría que
nos diga qué tipo de relación funcional (dependiente de una serie de parámetros)
deberían cumplir esos datos, lo mejor es realizar un ajuste por mínimos cuadrados
para obtener los valores de los parámetros que mejor se ajustan a nuestros datos.
Cuando no dispongamos de ninguna ley o teoría que nos diga qué tipo de depen-
dencia funcional deberían cumplir nuestros datos experimentales ya no podremos rea-
lizar un ajuste por mínimos cuadrados. En ese caso, si necesitamos calcular un dato
que no está incluido en la serie de datos experimentales podemos hacerlo por medio
de una función de interpolación. Una función de interpolación es una función mate-
mática que para por todos nuestros datos experimentales. Existen diversas formas de
generar interpolaciones, las más frecuentes son la interpolación lineal, la interpolación
de Lagrange y la interpolación por splines, todas ellas tienen sus ventajas y sus in-
convenientes. Con cualquiera de estos métodos de interpolación lo más frecuente es
que la fórmula de interpolación proporcione valores más o menos aproximados para
puntos que se encuentren intercalados entre dos puntos experimentales consecutivos,
y que sean totalmente inexactas (produciendo errores inmensos) si pretendemos apli-
carlas para calcular valores que estén fuera del conjunto de puntos experimentales,
en cuyo caso estaríamos haciendo una extrapolación.
Familiarícese con las funciones que el Maxima proporciona para realizar ajustes e
interpolaciones

Ajustes por mínimos cuadrados:

• lsquares_estimates(datos, variable, modelo, parámetros)


2.10. ECUACIONES DIFERENCIALES ORDINARIAS 51

El mejor método para realizar ajustes es el de mínimos cuadrados, para


ello en Maxima utilizamos el comando lsquares_estimates() al que su-
ministramos los datos que queremos ajustar agrupados en una matriz (M
: matrix([x1, y1], [x2, y2], . . . [xN, yN])), la variable independiente (p. ej. x),
como modelo suministramos la forma general de la función de x a la que
queremos ajustar esos datos (p. ej. ax + b), esta forma general depende de
una serie de parámetros (en nuestro ejemplo a y b) cuyos nombres debemos
suministrar como último argumento de la función lsquares_estimates().

Interpolaciones:

• Interpolación lineal (unimos los puntos por tramos rectos): linearinterpol(datos)


• Interpolación lagrangiana (construimos un polinomio de Lagrange que pasa
por todos nuestros puntos): lagrange(datos)
• Interpolación por splines cúbicos (construimos una función polinomial a tro-
zos que pasa por todos nuestros puntos de forma continua y diferenciable):
cspline(datos)

Consulte describe() para una descripción más extensa de la sintaxis y para ver
ejemplos de uso de estos comandos.

Ejercicio 1. Dadas las colecciones de puntos experimentales con la forma (xi , yi ) que puede
encontrar en la página web de la signatura, realice las correspondientes interpo-
laciones.

Ejercicio 2. A la vista de las anteriores interpolaciones formule un modelo matemático apro-


ximado y realice el correspondiente ajuste por mínimos cuadrados.

Ejercicio 3. Visualice los resultados usando plot2d().

2.10. Ecuaciones diferenciales ordinarias


Desde el principio hemos hecho énfasis en que uno de nuestros principales obje-
tivos es resolver ecuaciones diferenciales, ordinarias y en derivadas parciales. En las
asignaturas de Métodos Matemáticos correspondientes estudiará la teoría y métodos
numéricos apropiados para este tipo de problemas. En esta asignatura nos conforma-
remos con saber usar los comandos que el Maxima proporciona para resolver ecua-
ciones diferenciales ordinarias. El caso de las ecuaciones en derivadas parciales es
algo más complicado y por ese motivo muy pocos programas de cálculo simbólico y
numérico tienen herramientas válidas más que para unos pocos casos concretos. De
todas, formas, en las correspondientes asignaturas de métodos matemáticos estudia-
rá que la mayoría de los métodos que existen para resolver ecuaciones diferenciales
en derivadas parciales consisten en traducir (o re-escribir) la ecuación diferencial en
derivadas parciales propuesta como un sistema de ecuaciones diferenciales ordina-
rias, que posteriormente se resuelve con los métodos existentes para EDOs, por tanto
es muy importante saber resolver EDOs y para ello afortunadamente existen multitud
de algoritmos numéricos extremadamente eficientes, que se estudian en asignaturas
52 TEMA 2. CÁLCULO SIMBÓLICO Y NUMÉRICO CON MAXIMA

de Métodos Numéricos. Las diversas formas que existen para re-escribir una ecua-
ción diferencial en derivadas parciales como un conjunto de EDOs es un tema muy
interesante que estudiará en la correspondiente asignatura de Métodos Matemáticos.
Familiarícese con los comandos de Maxima para resolver ecuaciones diferenciales
ordinarias de manera analítica y numérica.

Solución analítica de EDOs:

• EDOs lineales: desolve(ecuaciones, variables)


• EDOs lineales o no lineales de orden 2 o inferior: ode2(ecuaciones, variables)
• EDOs de orden 1 con una condición inicial:

ic1(solución general proporcionada por ode2,


condición inicial variable independientemente, condición inicial variable
dependiente)
• EDOs de orden 2 con 2 condiciones iniciales:

ic2(solución general proporcionada por ode2,


condición inicial variable independientemente, condición inicial variable
dependiente,
condición inicial para la derivada)
• EDOs de orden 2 con 2 condiciones de contorno:
bc2(solución general proporcionada por ode2,

condición de contorno 1 variable independientemente, condición de


contorno 1 variable dependiente,

condición de contorno 2 variable independientemente, condición de


contorno 2 variable dependiente)
Solución numérica de EDOs de primer orden:

• En primer lugar: load("dynamics")


• A continuación: rk(lista de EDOs, variable independiente, condición
inicial, dominio)

Ejercicio 1. Resuelva los problemas de condiciones iniciales propuestos en la página web


de la asignatura, analíticamente cuando sea posible y numéricamente en caso
contrario.

You might also like