Вы находитесь на странице: 1из 57

.c .

cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c n . c . c c
o n.co c i
a cio o n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p :
tt p://w w t t p :
h h ttp
htt una herramienta de cálculo
Maxima: h
Universidad de Cádiz - Diciembre, 2006
o .c c o . c c
n . c . c c n . c .c c
o n.co Mario Rodrı́guez Riotorto
c i
a cio o n . c o
io mario@edu.xunta.es

f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .cc c . c
o .cc c
n . c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed 1

: / / w w w :
htttp : /
Copyright 2006
c
/ w
Mario Rodriguez Riotorto
t t
h ttpp
h tp
Este documento es libre; se puede redistribuir y/o modificar bajo los términos de la
GNU General Public License tal como lo publica la Free Software Foundation. Para más
detalles véase la GNU General Public License en http://www.gnu.org/copyleft/gpl.html
h
o .c c c c
This document is free; you can redistribute it and/or modify it under the terms of the

o .
n .c .c c n . c . c c
GNU General Public License as published by the Free Software Foundation. See the
GNU General Public License for more details at http://www.gnu.org/copyleft/gpl.html
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Índice general n . c . c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
1. Generalidades
.
w .ed
3

/ / w w
2. Despegando con Maxima
w
5

: w
2.1. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
p
5
p :
httttp://w t t
2.2. Entornos de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3. Tomando contacto con el programa . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 h ttp
h
3. Matemáticas con Maxima
3.1. Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
18
h
o .c c 3.2. Resolución de ecuaciones . . .
3.3. Patrones y reglas . . . . . . .
.
.
.
.
.

o
.
.
.
c
. c .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
21

n . c . c c
3.4. Lı́mites, derivadas e integrales .
n .
.
c .
.
.
c c. . . . . . . . . . . . . . . . . . . . . . . . . . 24

o n.co 3.5. Vectores y campos . . . . . .


3.6. Ecuaciones diferenciales . . .
c i
a cioo
.
.
n
.
. . c
.
. o .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
31
io f o r m
3.7. Probabilidades y estadı́stica .
a
3.8. Interpolación numérica . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
40

e p
d pfo r m
.
4. Maxima como herramienta pedagógica
w .ed
44

/ /
5. Programación
w w w 46

p : w
5.1. Nivel Maxima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
p :
httttp://w
5.2. Nivel Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
t t
h ttp
h
A. Ejemplos de programación 51
h
. c
o .cc c . c
o .cc c
n . c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h 2
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Capı́tulo 1
n . c . c c
o n.co c i
a cioo n . c o
io Generalidades f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
: w
Maxima es un programa de Matemáticas escrito en Lisp.
p p :
httttp://w t t
Su nombre original fue Macsyma (MAC’s SYmbolic MAnipulation System, donde MAC, Ma-
chine Aided Cognition, era el nombre del Laboratory for Computer Science del MIT durante la h ttp
h
fase inicial del proyecto Macsyma). Se desarrolló en estos laboratorios entre los años 1969 y 1982
con fondos aportados por varias agencias gubernamentales norteamericanas (National Aeronautics
and Space Administration, Office of Naval Research, U.S. Department of Energy (DOE) y U.S. Air
h
o .c c
Force).

o . c c
n . c . c c n . c .c c
El concepto y la organización interna del programa están basados en la tesis doctoral que Joel
Moses elaboró en el MIT sobre integración simbólica. Según Marvin Minsky, director de esta tesis,
o n.co c i
a cioo n . c o
Macsyma pretendı́a automatizar las manipulaciones simbólicas que realizaban los matemáticos, a

io
fin de entender la capacidad de los ordenadores para actuar de forma inteligente.

f o r m
El año 1982 es clave. El MIT entrega Macsyma al DOE y éste a la empresa Symbolics Inc. para
a
e p
d pfo r m
su explotación comercial, haciendo el código propietario. Debido a la presión que la comunidad
cientı́fica ejerció sobre el MIT, éste editó otra versión recodificada ajena a la comercial, dando
.
w .ed
ası́ nacimiento al denominado DOE-Macsyma. Esta polı́tica del MIT con respecto a los proyectos

/ / w w
basados en Lisp y Macsyma coincide con la salida de Richard Stallman de la institución y la
w
: w
posterior creación de la Free Software Foundation.
p p :
httttp://w t t
A partir de 1982, William Schelter traduce DOE-Macsyma a Common Lisp. Parte de la comu-
nidad cientı́fica podrá utilizarlo, pero no tendrá derechos de redistribución. Es la época en la
h ttp
h
que aparecen en el mercado Maple y Mathematica. La versión comercial apenas se desarrolla, es
superada por estos dos programas y deja de desarrollarse en 1999.
En 1998 Schelter obtiene permiso del Departamento de Energı́a para distribuir Maxima (ası́ lla-
h
. c
o .cc c .
o .cc c
mado ahora para diferenciarlo de la versión comercial) bajo la licencia GPL (General Public Li-
c
cense) de la Free Software Foundation. En el año 2000 Maxima pasa a ser un proyecto hospedado

n . c
o n.co o n . c
en Sourceforge y en el 2001 fallece Schelter. Actualmente el proyecto se mantiene con el trabajo
o
c i
a cion . c
voluntario de un equipo internacional de 23 personas.
Toda la información relevante del proyecto está disponible en la URL
io r
fo rmam
http://maxima.sourceforge.net

e d p fo
desde donde se puede descargar la documentación y los ficheros de instalación. La vı́a más directa
.
w .ed p
y rápida de tomar contacto con el equipo de desarrollo es a través de la lista de correo
w
p : / / w ww http://maxima.sourceforge.net/maximalist.html

p :
httttp://w t t
Además, desde mediados de septiembre de 2006, se ha activado una lista de correos para usuarios
de habla hispana en h ttp
h 3
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w
CAPÍTULO 1. GENERALIDADES w .ed 4

: / / w w w :
htttp : / / w
http://sourceforge.net/mailarchive/forum.php?forum id=50322
t t
h ttpp
h tp
Uno de los aspectos más relevantes de este programa es su naturaleza libre; la licencia GPL en
la que se distribuye brinda al usuario ciertas libertades: h
o .c c libertad para utilizarlo,

o . c c
n .c .c c . c c
libertad para modificarlo y adaptarlo a sus propias necesidades,

n . c
o n.co libertad para distribuirlo,
c i
a cioo n . c o
io r m
libertad para estudiarlo y aprender su funcionamiento.

f o a
p
d pfo r m
La gratuidad del programa, junto con las libertades recién mencionadas, hacen de Maxima una
e
.
formidable herramienta pedagógica, accesible a todos los presupuestos, tanto institucionales como
w .ed
individuales.

/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Capı́tulo 2
n . c . c c
o n.co c i
a cioo n . c o
io Despegando con Maxima f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p :
2.1. Instalación w p :
httttp://w
Maxima funciona en Windows, Linux y Mac-OS.
t t
h ttp
h
En Windows, la instalación consiste en descargar el binario exe desde el enlace correspondiente
en la página del proyecto y ejecutarlo.
h
En Linux, la mayorı́a de las distribuciones tienen ficheros precompilados con las extensiones

o .c c
rpm o deb, según el caso.
o . c c
n . c . c c n . c .c c
Las siguientes indicaciones hacen referencia al sistema operativo Linux.

o n.co c . c o
Si se quiere instalar Maxima en su estado actual de desarrollo, será necesario descargar los
i o
ficheros fuente completos del CVS de Sourceforge y proceder posteriormente a su compilación. Se
a cio n
io f o m
deberá tener operativo un entorno Common Lisp en la máquina (clisp, cmucl, sbcl y gcl son
r a
todas ellas alternativas libres válidas), ası́ como todos los programas que permitan ejecutar las

p
d pfo r m
instrucciones que se indican a continuación, incluidas las dependencias tcl-tk y gnuplot. Grosso

e
.
modo, los pasos a seguir son los siguientes1 :
w .ed
/ / w
1. Descargar las fuentes a un directorio local siguiendo las instrucciones que se indican en el
w w
: w
enlace al CVS de la página del proyecto.
p p :
httttp://w
2. Acceder a la carpeta local de nombre maxima y ejecutar las instrucciones t t
h ttp
h./bootstrap
./configure --enable-clisp --enable-lang-es-utf8
h
. c
o .cc c make
make check
. c
o .cc c
n . c
o n.co
sudo make install

o n . c o
i
make clean

c
a cion . c
io m
3. Para ejecutar Maxima desde la lı́nea de comandos escribir
r
fo rma
maxima

.e d p fo
ww .ed p
si se quiere trabajar con la interfaz gráfica (ver sección siguiente), teclear

p : / / w ww p :
httttp://w t
xmaxima
1 Se supone que se trabajará con clisp, siendo la codificación del sistema unicode. t
h ttp
h 5
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 6

: / / w w w :
2.2.
htttp
Entornos
: /
de/ w
ejecución t t
h ttpp
h tp
Como queda comentado al final de la sección anterior, una vez instalado Maxima, se dispone
de dos entornos de ejecución, uno basado en texto, ejecutándose desde la lı́nea de comandos, h
Figura 2.1, y otro basado en el entorno gráfico tcl-tk, Figura 2.2. Ambos son partes constituyentes

o .c cdel programa Maxima.


o . c c
n .c .c c n . c . c c
Otro entorno gráfico es Wxmaxima, Figura 2.3, que aún no siendo parte del proyecto Maxima,

o n.co o
se distribuye conjuntamente con el ejecutable para Windows. En Linux, una vez instalado Maxima,

c
se podrá instalar este entorno separadamente2 .
i
a cioo n . c
io Una cuarta alternativa, que resulta muy vistosa por hacer uso de TEX, es la de ejecutar Maxima
desde el editor Texmacs3 , Figura 2.4.
f o r m a
p r m
Además de los citados, en los últimos tiempos han aparecido varios proyectos de entornos

e d pfo
de Maxima. .
basados en la web; se puede acceder a ellos a través del enlace Related Projects de la página web

w .ed
/ / w w wcon el programa
p : w p :
httttp://w t
2.3. Tomando contacto
t
h ttp
h
En esta sesión se intenta realizar un primer acercamiento al programa a fin de familiarizarse
con el estilo operativo de Maxima, dejando sus habilidades matemáticas para más adelante. El
código que se muestra está copiado y pegado del entorno de texto.
h
o .c c o . c c
Una vez iniciada la ejecución del programa, se nos presenta una cabecera:

n .c . c c
Maxima 5.9.3.1cvs http://maxima.sourceforge.net

n . c .c c
o n.co o
Using Lisp CLISP ()

c i o . c
Distributed under the GNU Public License. See the file COPYING.
a cio n
io Dedicated to the memory of William Schelter.

o r m a
This is a development version of Maxima. The function bug_report()
f
provides bug reporting information.

e p
d pfo r m
(%i1)
.
w .ed
/ / w
donde el sı́mbolo (%i1) nos indica que Maxima está esperando la primera entrada del usuario
w w
(i de input). Ahora se puede escribir una instrucción y terminarla con un punto y coma (;) para

p : w p :
httttp://w t
que el programa la ejecute; por ejemplo,
(%i1) diff(1-exp(-k*x),x); t
h ttp
(%o1)
(%i2)
h k %e
- k x
h
. c
o .ccc . c c
donde le pedimos la derivada de la función y = 1 − exp(−kx) respecto de x, a lo que Maxima
o .cc
n .c
o n.co o n c
responde con ke−kx , etiquetando este resultado con (%o1) (o de output). El sı́mbolo %e es la forma
. o
que tiene Maxima de representar a la base de los logaritmos naturales, de igual forma que %pi

c i
a cion . c
representa al número π. Nótese que tras la respuesta, la etiqueta (%i2) nos indica que Maxima

io espera una segunda instrucción.


Continuando con la sesión, r
fo rmam
(%i2) %pi + %pi;
. e d p fo
(%o2)
w w .ed p
2 %pi
(%i3) float(%);

p : / / w ww p :
httttp://w t
2 http://wxmaxima.sourceforge.net
3 http://www.texmacs.org
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 7

: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o .c c o . c c
n .c .c c n . c . c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h Figura 2.1: Maxima desde la lı́nea de comandos.
h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 8

: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o .c c o . c c
n .c .c c n . c . c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h Figura 2.2: Xmaxima, el entorno gráfico de tcl-tk.
h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 9

: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o .c c o . c c
n .c .c c n . c . c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h Figura 2.3: Wxmaxima, el entorno gráfico basado en wxwidgets.
h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 10

: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o .c c o . c c
n .c .c c n . c . c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww
Figura 2.4: Maxima desde Texmacs.

p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 11

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o3) 6.283185307179586
Maxima hace simplificaciones algebraicas, como π + π = 2π, las cuales devuelve en forma
simbólica. El sı́mbolo %, cuando se utiliza aislado, representa la última respuesta dada por Maxima; h
ası́, en la entrada número tres se solicita que el último resultado se devuelva en formato decimal

o .c cde coma flotante.

o . c c
n .c .c c n . c . c c
Maxima está escrito en Lisp, por lo que ya se puede intuir su potencia a la hora de trabajar

o n.co o
con listas; en el siguiente diálogo, el texto escrito entre las marcas /* e */ son comentarios que

c i o . c
no afectan a los cálculos, además se observa cómo se hace una asignación con el operador de dos
a cio n
io puntos (:) a la variable xx,

f o r m a
m
(%i4) /* Se le asigna a la variable x una lista */
p
d pfo r
xx: [cos(%pi), 4/16, [a, b], (-1)^3, integrate(u^2,u)];
. e
1
w w .ed u
3

(%o4)

p : / / w w
[- 1, -, [a, b], - 1, --]
w p :
httttp://w t t
4 3
(%i5) /* Se calcula el número de elementos del último resultado */
h ttp
h h
length(%);
(%o5) 5
(%i6) /* Se transforma una lista en conjunto, */

o .c c /* eliminando redundancias. Los


/* corchetes se transforman en llaves
*/
*/
o . c c
n .c . c c setify(xx);
n . c .c c
o n.co 1 u
3
c i
a cioo n . c o
io (%o6)
4
f o3r
{- 1, -, [a, b], --}
m a
e p
d pfo r m
De la misma manera que % representa al último resultado, también se puede hacer referencia a
.
w .ed
una salida o entrada arbitraria, tal como muestra el siguiente ejemplo, donde también se observa

/ / w
cómo hacer sustituciones, lo que puede utilizarse para la evaluación numérica de expresiones:
w w
p : w p :
httttp://w t
(%i7) /* Sustituciones a hacer en x */
xx, u=2, a=c;
1 8
t
h ttp
(%o7)
h [- 1, -, [c, b], - 1, -]
4 3
h
(%i8) /* Forma alternativa para hacer lo mismo */

. c
o .ccc xx, [u=2, a=c];
. c
o .cc c
n .c
o n.co (%o8)
1 8
[- 1, -, [c, b], - 1, -]
o n . c o
4 3
c i
a cion . c
io (%i9) %o4[5], u=[1,2,3];
1 8
r
fo rmam
(%o9)

.e d p
[-, -, 9]

fo
w
3 3
w .ed p
En esta última entrada, %o4 hace referencia al cuarto resultado devuelto por Maxima, que es

p : / / w ww
la lista guardada en la variable xx, de modo que %o4[5] es el quinto elemento de esta lista, por

p :
httttp://w t
lo que esta expresión es equivalente a a xx[5]; después, igualando u a la lista [1,2,3] este quinto
elemento de la lista es sustituı́do sucesivamente por estas tres cantidades. Maxima utiliza los dos t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 12

: / / w w w :
htttp : / / w
puntos (:) para hacer asignaciones a variables, mientras que el sı́mbolo de igualdad se reserva para
t t
h ttpp
h tp
la construcción de ecuaciones.
El final de cada instrucción debe terminar con un punto y coma (;) o con un sı́mbolo de dólar
($); en el primer caso, Maxima muestra el resultado del cálculo y en el segundo lo oculta. En la
h
entrada %i12 se optó por el $ para evitar una lı́nea adicional que no interesa ver:

o .c c(%i11) a: 2+2;
o . c c
n .c .c c
(%o11) 4
n . c . c c
o n.co (%i12) b: 6+6$
c i
a cioo n . c o
io
(%i13) 2*b;
(%o13)
f
24
o r m a
p
d pfo r m
Un aspecto a tener en cuenta es que el comportamiento de Maxima está controlado por los
e
.
valores que se le asignen a ciertas variables globales del sistema. Una de ellas es la variable numer,
w .ed
/ w
que por defecto toma el valor lógico false, lo que indica que Maxima evitará dar resultados en

w w
formato decimal, prefiriendo expresiones racionales:
/
p : w p :
httttp://w t t
(%i14) numer;
(%o14) false
h ttp
h
(%i15) sqrt(8)/12;

2
- 1/2 h
o .c c
(%o15) ------
3
o . c c
n .c . c c
(%i16) numer:true$
n . c .c c
o n.co (%i17) sqrt(8)/12;
(%o17) .2357022603955159
c i
a cioo n . c o
io (%i18) numer:false$
r m
/*se reinstaura valor por defecto */

f o a
p
d pfo r m
Las matrices también tienen su lugar en Maxima; la manera más inmediata de construirlas es

e
con la instrucción matrix:
.
w .ed
/ / w
(%i19) A: matrix([sin(x),2,%pi],[0,y^2,5/8]);
w w
p : w
[ sin(x) 2 %pi ]
p :
httttp://w t t
[ ]
(%o19) [ 2 5 ]
h ttp
h [
[
0 y - ]
8 ]
(%i20) B: matrix([1,2],[0,2],[-5,integrate(x^2,x,0,1)]);
h
. c
o .ccc [ 1
[
2 ]
]
. c
o .cc c
n .c
o n.co
[ 0 2 ]

o n . c o
(%o20)
[
[ ]
1 ]
c i
a cion . c
io [ - 5 - ]
[ r
fo rma
3 ] m
d p
(%i21) A.B; /* producto matricial */
.e fo
[

ww .ed p %pi
[ sin(x) - 5 %pi 2 sin(x) + --- + 4 ]
]

p : / / w ww 3 ]

p :
httttp://w t t
(%o21) [ ]
[ 25 2 5 ]
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 13

: / / w w w :
htttp : / / w t t
h ttpp
h tp
[ - -- 2 y + -- ]
[ 8 24 ]
En cuanto a gráficos, Maxima hace uso por defecto del programa externo gnuplot. Las siguien- h
tes instrucciones generan diferentes tipos de gráficos, cuyas reproducciones4 se pueden ver en la

o .c c . c c
Figura 2.5, ordenadas de izquierda a derecha y de arriba hacia abajo.

o
n .c .c c
(%i22) plot2d(exp(-x^2),[x,-2,5])$
n . c . c c
o n.co (%i23)
(%i24)
plot2d([-x^2,1+x,7*sin(x)],[x,-2,5])$
c i
a cioo n . c o
plot2d([parametric,t,t*sin(1/t),[t,0.01,0.2]],[nticks,500])$
io (%i25)
r m
plot3d(exp(-x^2-y^2),[x,-2,2],[y,-2,0])$

f o a
m
(%i26) plot3d([cos(t),sin(t),2*t],[t,-%pi,%pi],[u,0,1])$
(%i27) p
d pfo
plot3d([cos(x)*(3+y*cos(x/2)),
. e r
w w .ed
sin(x)*(3+y*cos(x/2)),y*sin(x/2)],
[x,-%pi,%pi],[y,-1,1],[’grid,50,15])$
(%i28)
: / / w w
/* Un par de ejemplos de estadı́stica descriptiva */

p w p :
httttp://w t t
load(descriptive)$ load (numericalio)$
(%i30) s2 : read_matrix (file_search ("wind.data"))$
h ttp
h h
(%i31) boxplot(s2,outputdev="eps")$
(%i32) dataplot(s2,outputdev="eps")$
Gnuplot es un programa gráfico muy potente; la forma que se tiene de aprovechar sus capaci-

o .c c . c c
dades desde Maxima consiste en escribir dentro del apartado gnuplot_preamble (ver ejemplo a

o
n .c . c c n . c .c c
pie de página) todas las directrices que el usuario considere oportunas; sin embargo, tales direc-

o n.co o
trices se deben hacer en el lenguaje de scripts de gnuplot, lo que puede llegar a ser embarazoso

c i o . c
para el usuario medio. Maxima utiliza también el entorno tcl-tk, que permite más libertad a la
a cio n
io hora de programar gráficos; aunque esta alternativa estuvo en hibernación en los últimos tiempos,

o r m a
está recobrando nuevos brı́os en la actualidad. Ninguna de estas dos soluciones es completamente
f
p r m
satisfactoria en su estado actual, pero está claro que antes o después habrá que tomar algunas

e d pfo
.
decisiones sobre cómo generar todo tipo de gráficos desde Maxima.

w .ed
A fin de preparar publicaciones cientı́ficas, ya se ha visto cómo se pueden generar archivos

/ / w w
gráficos en calidad Postscript; si se quiere redactar publicaciones en formato LATEX, la función tex
w
: w
de Maxima será una útil compañera; en el siguiente ejemplo se calcula una integral y a continuación
p p :
httttp://w t t
se pide la expresión resultante en formato TEX:
(%i36) ’integrate(sqrt(a+x)/x^5,x,1,2) = integrate(sqrt(2+x)/x^5,x,1,2); h ttp
/
2 h h
. c
o .ccc [ sqrt(x + 2)
(%o36) I ----------- dx =
. c
o .cc c
n .c
o n.co
] 5

o n . c o
i
/ x
1
c
a cion . c
io r m
5 sqrt(2) log(5 - 2 sqrt(2) sqrt(3)) + 548 sqrt(3)

fo rma
--------------------------------------------------
2048

.e d p fo
w .ed p
4 Reconozco que aquı́ hay algo de trampa. Los gráficos de la Figura 2.5 fueron creados con gnuplot en formato

w
eps, para lo cual hubo que añadir cierto código a las sentencias que se describen; en particular, el primer fichero

: / / w ww
gráfico se generarı́a con el código

p p :
httttp://w t t
plot2d(exp(-x**2),[x,-2,5],[gnuplot preamble,”set terminal postscript eps;set out ’grafico1.eps’”])

h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
CAPÍTULO 2. DESPEGANDO CON MAXIMA
w w .ed 14

: / / w w w :
1

htttp : / / w 10
t t
h ttpp
h tp
%e^-x^2 -x^2
x+1
0.9 7*sin(x)

0.8

0.7
5

0
h
o .c c 0.6

0.5

o . c c -5

n .c .c c 0.4

n . c . c c -10

o n.co 0.3

c i
a cioo n . c o -15

io
0.2

0.1

f o r m a
-20

0
-2 -1

e
0

p
d pfo r m 1 2 3 4 5
-25
-2 -1 0 1 2 3 4 5

.
0.15
t, sin(1/t)*t

w .ed
%e^(-y^2-x^2)

0.1

/ / w w w
0.05

p : w 1

p :
httttp://w t t
0.9
0.8

h ttp
0.7
0 0.6
0.5
0.4

h h
0.3
-0.05 0.2
0.1
0

0
-0.1 -0.2
-0.4
-0.6
-0.8

c c
-2 -1
-1.5
-1 -1.2

c c
-0.15 -0.5 -1.4

. .
0 -1.6
0.5
1 -1.8

o o
1.5
2 -2

n .c . c c -0.2
0 0.02 0.04 0.06 0.08

n . c 0.1

.c c
0.12 0.14 0.16 0.18 0.2 0.22

o n.co c i
a cioo n . c o [cos(t),sin(t),2*t] Function

io f o r m a
p m
8 1
6
4
2
0

. e d pfo r 0.5

0
-2
-4
-6

w w .ed -0.5

-8

p : / / w w w 0.8
1
-1

3
4

p :
httttp://w t
0.6 2

t
0.4
0.2 1
-1 -4

h ttp
0 -3 0
-0.5 -0.2 -2 -1
-0.4 -1
0 -0.6 0 -2
1 -3
0.5 -0.8 2
3
1 -1 4 -4

30 h 20
18
16
14
12
10
8
6
25
20
15
10
5
0
25
20
15
10
5
0
25
20
15
10
5
0
25
20
15
10
5
0
h
4

c c
2 -5 -5 -5 -5
0246810
12
14
16
18
20 -5 0 510152025 0246810
12
14
16
18
20
22 0 5101520253035 0 51015202530

c c
25

.c .
o .cc 20

. c .
o .cc
25
20
15
10
5
0
-5
25
20
15
10
5
0
25
20
15
10
5
0
-5
25
20
15
10
5
0
-5
25
20
15
10
5
0
-5

n
o n.co 15

c i o n . c o 22
20
18
16
14
-5 0 510152025

22
20
18
16
14
0246810
12
14
16
18
20
22

20
18
16
0246810
12
14
16
18
20
22

22
20
18
16
14
0 5101520253035

22
20
18
16
14
0 51015202530

a cion
12 12 14 12 12
y

10 10 12 10 10
8
6 8
6 10
8 8
6 8
6

io
4
2 4
2 6 4
2 4
2
0 0 4 0 0

m
-5 0 510152025 -5 0 510152025 246810
1214
1618
20 0 5101520253035 0 51015202530
10

p r
fo rma
35
30
25
20
15
10
5
35
30
25
20
15
10
5
35
30
25
20
15
10
5
16
14
12
10
8
6
4
35
30
25
20
15
10
5

d
0 0 0 2 0

o
5

e
-5 0 510152025 -5 0 510152025 0246810
12
14
16
18
20
22 5 1015202530 0 51015202530

.
w .ed p f 30
25
20
15
30
25
20
15
30
25
20
15
30
25
20
15
25
20
15
10

w
0 10 10 10 10
5 5 5 5 5
1 2 3 4 5 6 0 0 0 0 0

w ww
-5 0 510152025 -5 0 510152025 0246810
12
14
16
18
20
22 0 5101520253035 5 1015202530

/
sample

p : / p :
httttp://w t t
Figura 2.5: Ejemplos de la interacción entre Maxima y gnuplot.
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 15

: / / w w w :
htttp : / / w t t
h ttpp
h tp
15 sqrt(2) log(3 - 2 sqrt(2)) + 244
- -----------------------------------

(%i37) tex(%);
6144 h
o .c c o . c
$$\int_{1}^{2}{{{\sqrt{x+2}}\over{x^5}}\;dx}={{5\,\sqrt{2}\,\log
c
\left(5-2\,\sqrt{2}\,\sqrt{3}\right)+548\,\sqrt{3}}\over{2048}}-{{15

n .c .c c n . c . c
\,\sqrt{2}\,\log \left(3-2\,\sqrt{2}\right)+244}\over{6144}}$$
c
o n.co c i o . c o
Al pegar y copiar el código encerrado entre los dobles sı́mbolos de dólar a un documento LATEX,
a cio n
io el resultado es el siguiente:
Z 2√ √
f o r m a
√ √  √ √ √ 
x+2
dx =
e p
d pfo r m
5 2 log 5 − 2 2 3 + 548 3 15 2 log 3 − 2 2 + 244

1 x5
.
w .ed
2048 6144

/ / w
Un comentario sobre la entrada %i36. Se observa en ella que se ha escrito dos veces el mismo

w w
código a ambos lados del signo de igualdad. La única diferencia entre ambos es el apóstrofo que

p : w p :
httttp://w t
antecede al primer integrate; éste es un operador (llamado de comilla simple) que Maxima utiliza
para evitar la ejecución de una instrucción, de forma que en el resultado la primera integral no se
calcula, pero sı́ la segunda, dando lugar a la igualdad que se obtiene como resultado final.
t
h ttp
h
Puede darse el caso de que llegue el momento en el que el usuario decida evaluar una expresión
que previamente marcó con el operador comilla (tales expresiones reciben en Maxima el apelativo
h
de nominales); el siguiente ejemplo muestra el uso del sı́mbolo especial nouns,

o .c c
(%i38) z: ’diff(tan(x),x);
o . c c
n .c . c c d
n . c .c c
o n.co (%o38) -- (tan(x))
c i
a cioo n . c o
io
dx
(%i39) z+z;
f o r m a
(%o39)
e p d
d pfo r m
2 (-- (tan(x)))
.
w .ed dx
(%i40) z, nouns;

/ / w w w
p : w 2
p :
httttp://w t t
(%o40) sec (x)
Es posible que el usuario necesite trabajar sobre un mismo problema durante varias sesiones, h ttp
h
por lo que le interesará guardar aquellas partes de la sesión actual que necesitará más adelante.
Si se quiere almacenar la expresión guardada en z, junto con el resultado de su evaluación (salida h
%o40), podrá hacer uso de la función save:

. c
o .ccc(%i41) save("sesion", z, vz=%o40);
. c
o .cc c
n .c
o n.co
(%o41) sesion

o n . c o
(%i42) quit();
c i
a cion . c
io r
fo rmam
Obsérvese que en primer lugar se escribe el nombre del fichero y a continuación los nombres de
las variables a almacenar; como el valor de z no se habı́a asignado a ninguna variable, es necesario

.e d p
ponerle uno, en este caso vz. La última instrucción es la que termina la ejecución del programa.

fo
(%i1) load("sesion");
ww .ed p
Una vez iniciada una nueva sesión, se cargará el fichero sesion con la función load:

(%o1)
p : / / w ww sesion
p :
httttp://w t t
(%i2) z;
d
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 16

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o2) -- (tan(x))

(%i3) vz;
dx

2
h
o .c c(%o3) sec (x)

o . c c
n .c .c c n . c . c c
Se puede acceder a la ayuda relativa a cualquiera de las funciones que han aparecido hasta

o n.co o
ahora, y otras que irán apareciendo, haciendo uso de la función describe, o equivalentemente, del
operador ?:
c i
a cioo n . c
io (%i4) ? diff

f o r m a
0: (maxima.info)impdiff.
e p
d pfo r m
.
w .ed
1: Definiciones para impdiff.

/ / w
2: antidiff :Definiciones para Diferenciación.
w w
: :
3: AntiDifference :Definiciones para zeilberger.

p w p
httttp://w t t
4: covdiff :Definiciones para itensor.
5: diff <1> :Definiciones para itensor.
h ttp
h h
6: diff :Definiciones para Diferenciación.
7: evundiff :Definiciones para itensor.
8: extdiff :Definiciones para itensor.

o .c c9: idiff :Definiciones para itensor.


10: liediff :Definiciones para itensor.
o . c c
n .c . c c . c
11: poisdiff :Definiciones para las Funciones Especiales.
n .c c
o n.co 12: ratdiff :Definiciones para Polinomios.
13: rediff :Definiciones para itensor.
c i
a cioo n . c o
io f o r m
14: setdifference :Definiciones para los conjuntos.

a
15: symmdifference :Definiciones para los conjuntos.
p
d pfo
16: undiff :Definiciones para itensor.
e r m
.
Enter space-separated numbers, ‘all’ or ‘none’: 5
w .ed
/ / w w w
-- Función: diff (<expr>, <v_1>, [<n_1>, [<v_2>, <n_2>] ...])

p : w p :
httttp://w t
Se trata de la función de Maxima para la diferenciación, ampliada
para las necesidades del paquete ‘itensor’. Calcula la derivada de
<expr> respecto de <v_1> <n_1> veces, respecto de <v_2> <n_2>
t
h ttp
h
veces, etc. Para el paquete de tensores,la función ha sido
modificada de manera que <v_i> puedan ser enteros desde 1 hasta el
h
c c
valor que tome la variable ‘dim’. Esto permite que la derivación

c . c
o .cc . c
se pueda realizar con respecto del <v_i>-ésimo miembro de la lista

c o .cc
n .
o n.co o .
‘vect_coords’. Si ‘vect_coords’ guarda una variable atómica,
n o
entonces esa variable será la que se utilice en la derivación. Con
i
c
a cion . c
esto se hace posible la utilización de una lista con nombres de

io m
coordenadas subindicadas, como ‘x[1]’, ‘x[2]’, ...
r
fo rma
e d p
En primer lugar, Maxima nos muestra una lista con todas las funciones y variables que contienen

fo
la cadena diff; una vez seleccionada la que nos interesa (5), se lee la información correspondiente.
.
w .ed p
Algunos usuarios encuentran engorroso que la ayuda se interfiera con los cálculos; esto se puede
w
arreglar con un mı́nimo de bricolage informático. Al tiempo que se instala Maxima, se almacena

: / / w ww
también el sistema de ayuda en formato html en una determinada carpeta; el usuario tan sólo
p p :
httttp://w t t
tendrá que buscar esta carpeta, en la que se encontrará la página principal maxima.html, y hacer
uso de la función system de Maxima que ejecuta comandos del sistema, la cual admite como
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 2. DESPEGANDO CON MAXIMA 17

: / / w w w :
htttp : / / w
argumento una cadena alfanumérica con el nombre del navegador (en el ejemplo, mozilla) seguido
t t
h ttpp
h tp
de la ruta hacia el documento maxima.html,
(%i5) system("mozilla /usr/local/share/maxima/5.9.3/doc/html/es/maxima.html")$ h
o .c c . c
Este proceso se puede automatizar si la instrucción anterior se guarda en un fichero de nombre
c
maxima-init.mac y se guarda en una carpeta oculta de nombre .maxima en el directorio principal
o
n .c .c c n . c . c c
del usuario. Ası́, cada vez que arranque Maxima, se abrirá el navegador con el manual de referencia

o n.co del programa.

c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
o .c c o . c c
n .c . c c n . c .c c
o n.co c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Capı́tulo 3
n . c . c c
o n.co c i
a cioo n . c o
io Matemáticas con Maxima f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p :
3.1. Números w p :
httttp://w
Maxima puede trabajar con números enteros tan grandes como sea necesario,
t t
h ttp
h
(%i1) 200!;
(%o1) 788657867364790503552363213932185062295135977687173263294742\
h
o .c c o . c
533244359449963403342920304284011984623904177212138919638830257642\
c
790242637105061926624952829931113462857270763317237396988943922445\

n . c . c c n . c .c c
621451664240254033291864131227428294853277524242407573903240321257\

o n.co c i
a cioo n . c o
405579568660226031904170324062351700858796178922222789623703897374\

io
720000000000000000000000000000000000000000000000000
(%i2) factor(%);
r m
/* factoriza el resultado anterior */

f o a
(%o2) 2
197 97 49 32
3 5 7
e
11
19
p 16

d pfo
13
r
17 m
11
19
10 8 6 6 5 4
23 29 31 37 41 43
4

4 3 3 3 2 2
.
w .ed2 2 2 2 2

/ / w
47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
w w
: w
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
p p :
httttp://w
Por defecto, no transforma las fracciones a su forma decimal, aunque sı́ las simplifica,
t t
h ttp
(%o3)
h
(%i3) zz: (3/12-3 *8/5)^-5 ;
3200000
- ----------
h
. c
o .cc c 6240321451

. c
o .cc c
La expresión decimal de un número racional se puede obtener con una llamada a la función

n . c
o n.co o n . c
float, que devuelve el resultado como un número de coma flotante de doble precisión,
o
(%i4) float(%);
c i
a cion . c
io (%o4)
r m
- 5.127940964462986E-4

fo rma
e d p
Si se quiere más precisión, se puede recurrir a los números decimales grandes, para lo cual se

fo
indica en primer lugar la precisión deseada con la variable global fpprec y se hace la transformación
.
con bfloat,
ww .ed p
p : / / w ww
(%i5) fpprec: 200$ bfloat(zz);

p :
httttp://w t
(%o6) - 5.12794096446298596293256880814488029168034600338090820571\
736601714365755675235967904307883385669518132648516346437807887855\
t
h ttp
h 18
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 19

: / / w w w :
htttp : / / w t t
h ttpp
h tp
230937205128922131867273899509251418529208712713155391584330100241\
17746366396b-4
Los números complejos se construyen haciendo uso de la constante imaginaria %i, h
o .c c(%i7) z1: 3+4*%i;
(%o7) 4 %i + 3
o . c c
n .c .c c
(%i8) z2: exp(7*%pi/8*%i);
n . c . c c
o n.co 7 %i %pi
c i
a cio
-------- o n . c o
io (%o8)
f
%e
o r8
m a
(%i9) z1+z2;
e p
d pfo r m
.
w .ed
7 %i %pi

/ / w w w
--------
8

p : w p :
httttp://w t
(%o9) %e + 4 %i + 3
(%i10) rectform(%); /* forma cartesiana */
7 %pi 7 %pi
t
h ttp
(%o10) h %i (sin(-----) + 4) + cos(-----) + 3
8 8
h
o .c c
(%i11) polarform(%); /* forma polar */
7 %pi 2 7 %pi 2
o . c c
n .c . c c
(%o11) sqrt((sin(-----) + 4) + (cos(-----) + 3) )
n . c .c c
o n.co 8 8

c i
a cioo n . c o 7 %pi

io f o r m a
sin(-----) + 4
8

e p
d pfo r m %i atan(--------------)

.
w .ed
7 %pi

/ / w w w
cos(-----) + 3
8

p : w p :
httttp://w t
%e
(%i12) abs(%); /* módulo */
2 7 %pi 7 %pi 2 7 %pi 7 %pi
t
h ttp
h
(%o12) sqrt(sin (-----) + 8 sin(-----) + cos (-----) + 6 cos(-----)
8 8 8 8
h
+ 25)

. c
o .ccc(%i13) float(%); /* módulo en formato decimal */
. c
o .cc c
n .c
o n.co 3.2.
(%o13) 4.84955567695155

o n . c o
c i
a cion . c
io Resolución de ecuaciones
r
fo rmam
.e d p
La función algsys resuelve sistemas de ecuaciones algebraicas. Admite como argumentos dos
fo
ww .ed p
listas, en la primera se escribe la ecuación o ecuaciones del sistema, en las que si se omite la igualdad
se interpretan como igualadas a cero; en la segunda lista se colocan los nombres de las incógnitas.

p : / w ww
Veamos algunos ejemplos:
/
Ecuación polinómica de tercer grado
p :
httttp://w 4x3 − 2x2 + 5x − 7 = 0 t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 20

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i1) algsys([4*x^3-2*x^2+5*x -7=0],[x]);
3 sqrt(3) %i - 1 3 sqrt(3) %i + 1
(%o1) [[x = ----------------], [x = - ----------------], [x = 1]]
4 4
h
o .c c . c c
Se piden las soluciones no complejas de la ecuación anterior
o
n .c .c c
(%i2) realonly: true$
n . c . c c
o n.co (%i3) algsys([4*x^3-2*x^2+5*x -7],[x]);
c i
a cioo n . c o
io
(%o3) [[x = 1]]

f o r m
(%i4) realonly: false$ /* se restaura su valor por defecto */
a
Sistema no lineal
e p
d pfo r m
. 3 ∗ x2 − y 2 = 6


w w .ed x = y+9

: / / w w w
(%i5) algsys([3*x^2-y^2=6,x=y+9],[x,y]);
p p :
httttp://w t t
sqrt(255) + 9
(%o5) [[x = - -------------, y = h ttp
h 2
sqrt(3) sqrt(5) sqrt(17) + 27
- -----------------------------],
h
o .c c 2

o . c c
c c
sqrt(255) - 9 sqrt(3) sqrt(5) sqrt(17) - 27

n .c
o n.co . c n . c
[x = -------------, y = -----------------------------]]
o o .c
2 2
c i
a cio n . c
io f o r m
Un sistema no lineal con coeficientes paramétricos y complejos

a
p m

. e d pfo r
 3u − av = t
2+i
u+t = 3v + u

w w .ed  t
u = 1

p : / / w w w
(%i6) algsys([3*u-a*v=t,(2+%i)/(u+t)=3*v+u,t/u=1],[u,v,t]);
p :
httttp://w
%i a 2 a
sqrt(----- + -----)
t t
h ttp
h a + 6 a + 6 2 sqrt(%i + 2)
(%o6) [[u = -------------------, v = ---------------------------,
h
sqrt(2) sqrt(2) sqrt(a) sqrt(a + 6)

. c
o .ccc %i a 2 a
. c
o .cc c
n .c
o n.co
sqrt(%i + 2) sqrt(a)
sqrt(----- + -----)
a + 6
o n .
a + 6c o
c i .
t = --------------------], [u = - -------------------,
a cion c
io sqrt(2) sqrt(a + 6)
2 sqrt(%i + 2)
r
fo rmam
sqrt(2)
sqrt(%i + 2) sqrt(a)

.e d p
v = - ---------------------------, t = - --------------------]]

fo
p
sqrt(2) sqrt(a) sqrt(a + 6) sqrt(2) sqrt(a + 6)

ww .ed
Cuando Maxima no es capaz de resolver el sistema algebraicamente, recurre a métodos de

: / / w ww
aproximación numérica, como en el caso de la ecuación polinómica
p p :
httttp://w x5 + x4 + x3 + x2 + x = 0 t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 21

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i7) algsys([x^5+x^4+x^3+x^2+x],[x]);
(%o7) [[x = 0], [x = - .5877852522924731 %i - .8090169943749475],
[x = .5877852522924731 %i - .8090169943749475],
[x = .3090169943749475 - .9510565162951535 %i],
h
o .c c[x = .9510565162951535 %i + .3090169943749475]]

o . c c
n .c .c c . c c
Más allá de las ecuaciones algebraicas, Maxima no dispone de algoritmos de resolución simbóli-

n . c
o n.co Resolución de la ecuación
c
a cioo n . c o
ca, aunque sı́ existe un módulo para la aplicación del método de Newton.
i
io f o r m a
2uu − 5 = u

p r m
(%i8) load("mnewton")$ /* carga el paquete correspondiente */

e d pfo
(%o9) .
(%i9) mnewton([2*u^u-5],[u],[1]);

w .ed
[[u = 1.70927556786144]]
Y del sistema
/ / w w w
p : w

x + 3 log(x) − y 2 = 0
p :
httttp://w 2x2 − xy − 5x + 1 = 0
t t
h ttp
(%o10) h
(%i10) mnewton([x+3*log(x)-y^2, 2*x^2-x*y-5*x+1],[x, y], [5, 5]);
[[x = 3.756834008012769, y = 2.779849592817897]]
(%i11) mnewton([x+3*log(x)-y^2, 2*x^2-x*y-5*x+1],[x, y], [1, -2]);
h
o .c c
(%o11) [[x = 1.373478353409809, y = - 1.524964836379522]]

o . c c
n .c . c c n . c .c c
En los anteriores ejemplos, el primer argumento es una lista con la ecuación o ecuaciones a

o n.co i o c o
resolver, las cuales se suponen igualadas a cero; el segundo argumento es la lista de variables y el
c
a cio n .
último el valor inicial a partir del cual se generará el algoritmo y cuya elección determinará las
io diferentes soluciones del problema.

f o r m a
e p
d pfo r m
3.3. Patrones y reglas
.
w .ed
/ / w w
En un programa de cálculo simbólico, éste no sólo debe tener información sobre una función u
w
: w
operación a partir de su definición, sino que también habrá propiedades y reglas de transformación
p p :
httttp://w t t
de expresiones de las que un programa como Maxima debe tener noticia.
Antes de abordar este tema, convendrá reparar en dos funciones que suelen ser de utilidad en h ttp
h
este contexto y que se relacionan con las listas; la función apply, que se utiliza para pasar como
argumentos de una función a todos los elementos de una lista, y la función map, que se utiliza para
aplicar una función a cada uno de los elementos de una lista,
h
. c
o .ccc(%i1) apply(min,[7,3,4,9,2,4,6]);
. c
o .cc c
n .c
o n.co
(%o1) 2

o n . c o
(%i2) map(cos,[7,3,4,9,2,4,6]);

c i
a cion . c
(%o2) [cos(7), cos(3), cos(4), cos(9), cos(2), cos(4), cos(6)]

io r
fo rmam
Obsérvese que la función a aplicar en apply debe ser tal que admita múltiples argumentos; por

.e d p
ejemplo, la función suma "+" podrı́a haberse utilizado sin problemas, no ası́ "-", que sólo admite

fo
un máximo de dos argumentos. Sin embargo, las funciones a utilizar por map deben ser de un único
argumento.
ww .ed p
: / / w ww
A veces se quiere utilizar en map una función que no está definida y que no va a ser utilizada más
que en esta llamada a map. En tales casos se puede hacer uso de las funciones lambda; supóngase
p p :
httttp://w t t
que a cada elemento x de una lista se le quiere aplicar la función f (x) = sin(x) + 21 , sin necesidad
de haberla definido previamente, h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 22

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i3) map(lambda([x], sin(x) + 1/2),[7,3,4,9]);

(%o3)
1 1 1 1
[sin(7) + -, sin(3) + -, sin(4) + -, sin(9) + -]
2 2 2 2
h
o .c c . c c
Como se ve, la función lambda admite dos argumentos; el primero es una lista (no se puede
o
n .c .c c n . c . c c
evitar la redundancia) de argumentos, siendo el segundo la expresión que indica qué se hace con

o n.co o
los elementos de la lista anterior.

c i o . c
Nos planteamos ahora la siguiente situación: necesitamos trabajar con una función G(x, y) que,
a cio n
io independientemente de que esté definida o no, sabemos que es igual a la expresión H(x,y)

f o r m a
x en todo
su dominio, siendo H(x, y) otra función; queremos que la primera expresión sea sustituı́da por la
p
d pfo r m
segunda y además queremos tener bajo control estas sustituciones. Todo ello se consigue trabajando
e
con patrones y reglas.
.
w .ed
/ w
Antes de definir la regla de sustitución es necesario saber a qué patrones será aplicable, para

w w
lo cual admitiremos que los argumentos de G(x, y) pueden tener cualquier forma:
/
p : w p :
httttp://w t t
(%i4) matchdeclare ([x,y], true);
(%o4) done
h ttp
h
En este caso, las variables patrón serán x e y, siendo el segundo argumento una función de
predicado1 que devolverá true si el patrón se cumple; en el caso presente, el patrón es uni-
h
versal y admite cualquier formato para estas variables. Si quisiésemos que la regla se aplicase

o .c c . c c
sólo a números enteros, se deberı́a escribir matchdeclare ([x,y], integerp); si quisiésemos que
o
n .c . c c n . c .c c
la regla se aplicase siempre que x sea un número, sin imponer restricciones a y, escribirı́amos

o n.co o
matchdeclare (x, numberp, y, true). Como se ve, los argumentos impares son variables o lis-

c i o . c
tas de variables y los pares las condiciones de los patrones.
a cio n
io f o r m
Se define ahora la regla de sustitución indicada más arriba, a la que llamaremos regla1,

a
e p
(%i5) defrule (regla1, G(x,y), H(x,y)/x);

d pfo r m
H(x, y)
(%o5)
.
w .ed
regla1 : G(x, y) -> -------

/ / w w w
x

: w
Aplicamos ahora la regla a las expresiones G(f, 2 + k) y G(G(4, 6), 2 + k),
p p :
httttp://w
(%i6) apply1(G(f,2+k),regla1); t t
h ttp
h
H(f, k + 2)
(%o6) -----------
f
h
. c
o .ccc(%i7) apply1(G(G(4,6),2+k),regla1);
H(4, 6)
. c
o .cc c
n .c
o n.co
4 H(-------, k + 2)

o n . c o
(%o7)
4
-------------------
c i
a cion . c
io H(4, 6)
r
fo rmam
.e d p
Como se ve en este último ejemplo, la regla se aplica a todas las subexpresiones que contengan

fo
a la función G. Además, apply1 aplica la regla desde fuera hacia adentro. La variable global

w .ed p
maxapplydepth indica a Maxima hasta qué nivel puede bajar en la expresión para aplicar la regla;
w
p : / / w ww
su valor por defecto es 10000, pero se lo podemos cambiar,

p :
httttp://w t
1 Se denominan ası́ todas aquellas funciones que devuelven como resultado de su evaluación true o false.

t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 23

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i8) maxapplydepth;
(%o8)
(%i9) maxapplydepth:1;
(%o9)
10000

1
h
o .c c(%i10) apply1(G(G(4,6),2+k),regla1);

o . c c
c
H(G(4, 6), k + 2)

n .c .c (%o10) -----------------
n . c . c c
o n.co G(4, 6)
c i
a cioo n . c o
io f o m
Quizás sea nuestro deseo realizar la sustitución desde dentro hacia fuera, controlando también
r a
a qué niveles se aplica; applyb1 y maxapplyheight son las claves ahora.
(%i11) maxapplyheight:1;
e p
d pfo r m
(%o11) .
w .ed 1

/ / w
(%i12) applyb1(G(G(4,6),2+k),regla1);
w w
p : wH(4, 6)
p :
httttp://w t t
(%o12) G(-------, k + 2)
4
h ttp
h
Obsérvese que hemos estado controlando el comportamiento de las funciones G y H sin haberlas
definido explı́citamente, pero nada nos impide hacerlo, h
o .c c
(%i13) H(u,v):= u^v+1;
v
o . c c
n .c . c c
(%o13) H(u, v) := u + 1
n . c .c c
o n.co (%i14) applyb1(G(G(4,6),2+k),regla1);
4097
c i
a cioo n . c o
io (%o14) G(----, k + 2)
4
f o r m a
e p
d pfo r m
ción F verifica la igualdad .
Continuemos esta exposición con un ejemplo algo más sofisticado. Supongamos que cierta fun-

w .ed
/ / w w w
p : w
F (x1 + x2 + . . . + xn ) = F (x1 ) + F (x2 ) + . . . + F (xn ) + x1 x2 . . . xn
p :
httttp://w
y que queremos definir una regla que realice esta transformación. Puesto que la regla se aplicará sólo t t
h ttp
h
cuando el argumento de F sea un sumando, necesitamos una función de predicado que defina este
patrón, h
(%i15) esunasuma(expr):= not atom(expr) and op(expr)="+" $

. c
o .ccc(%i16) matchdeclare(z,esunasuma)$
. c
o .cc c
n .c
o n.co o n . c
En la definición de la nueva regla, le indicamos a Maxima que cada vez que se encuentre

o
c i
a cion . c
con la función F y que ésta tenga como argumento una suma, la transforme según se indica:
map(F, args(z)) aplica la función a cada uno de los sumandos de z, sumando después estos
io r m
resultados con la función apply, finalmente a este resultado se le suma el producto de los sumandos
de z,
fo rma
.e d p fo
(%i17) defrule(regla2, F(z), apply("+",map(F, args(z))) + apply("*", args(z)));

w .ed p
(%o17) regla2 : F(z) -> apply(+, map(F, args(z))) + apply(*, args(z))
w
: / / w ww
Veamos unos cuantos resultados de la aplicación de esta regla,

p p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 24

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i18) apply1(F(a+b), regla2);
(%o18)
(%i19)
(%o19)
F(b) + a b + F(a)
apply1(F(a+b), regla2) - apply1(F(a+c), regla2) ;
- F(c) - a c + F(b) + a b
h
o .c c(%i20)
(%o20)
apply1(F(a+b+c), regla2);

o . c c
c
F(c) + a b c + F(b) + F(a)

n .c .c (%i21) apply1(F(4), regla2);


n . c . c c
o n.co (%o21) F(4)
c i
a cioo n . c o
io
(%i22) apply1(F(4+5), regla2);
(%o22) F(9)
f o r m a
(%i23)
(%i24) apply1(F(4+5), regla2);
e p
d pfo r m
simp:false$ /* inhibe la simplificación de Maxima */

(%o24) .
w .ed
4 5 + (F(4) + F(5))
(%i25) simp:true$

/ / w w
/* restaura la simplificación de Maxima */
w
(%i26) %o24;
p : w p :
httttp://w t t
(%o26) F(5) + F(4) + 20
En los ejemplos recién vistos, hemos tenido que indicar expresamente a Maxima en qué momento h ttp
h
debe aplicar una regla. Otro mecanismo de definición de reglas es el aportado por tellsimp y
tellsimpafter; el primero define reglas a aplicar antes de que Maxima aplique las suyas propias, h
y el segundo para reglas que se aplican después de las habituales de Maxima.

o .c c . c c
Otra función útil en estos contextos es declare, con la que se pueden declarar propiedades
o
n .c . c c n . c .c c
algebraicas a nuevos operadores. A continuación se declara una operación de nombre "o" como

o n.co o
infija (esto es, que sus operandos se colocan a ambos lados del operador); obsérvese que sólo cuando

c i o . c
la operación se declara como conmutativa Maxima considera que a o b es lo mismo que b o a,
a cio n
io además, no ha sido necesario definir qué es lo que hace la nueva operación con sus argumentos,

f o r m a
(%i27)
(%o27)
infix("o");

e p
d pfo r
o m
(%i28) is(a o b = b o a);
.
w .ed
(%o28)

/ / w w w
false
(%i29)
:
declare("o", commutative);

p w p :
httttp://w t t
(%o29) done
(%i30) is(a o b = b o a);
h ttp
(%o30)
h true
h
. c
o .ccc3.4. Lı́mites, derivadas e integrales
. c
o .cc c
n .c
o n.co o n . c
Las funciones limit, diff e integrate son las que nos interesan ahora. Los siguientes ejemplos

o
sobre lı́mites son autoexplicativos:
c i
a cion . c
io (%i1) limit(1/sqrt(x),x,inf);
(%o1) 0
r
fo rmam
(%o2) - 1
.e d p
(%i2) limit((exp(x)-exp(-x))/(exp(x)+exp(-x)),x,minf);

fo
ww .ed p
Donde hemos calculado lı́mx→∞ √1x y lı́mx→−∞ eex −e
x −x

+e−x , respectivamente. Nótese que los sı́mbo-

p : / / w ww
los inf y minf representan a ∞ y −∞.

p :
httttp://w t
1
Algunos lı́mites necesitan información adicional, como lı́mx→1 x−1 , pudiendo solicitar los lı́mites
laterales, t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 25

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i3) limit(1/(x-1),x,1);
(%o3) und
(%i4) limit(1/(x-1),x,1,plus);
(%o4) inf
h
o .c c(%i5) limit(1/(x-1),x,1,minus);
(%o5)
o . c c
c
minf

n .c .c n . c . c c
o n.co c o n . c o
El sı́mbolo und hace referencia al término ingés undefined.
i
El cálculo de derivadas requiere el concurso de la función diff; a continuación algunos ejemplos
a cio
io r m
(%i6) diff(x^log(a*x),x); /* primera derivada */
f o a
(%o6) x
log(a x) log(a x)

e p
d pfo m
log(x)
r
(-------- + ------)
.
w .ed
x x

/ / w
(%i7) diff(x^log(a*x),x,2); /* derivada segunda */
w w
:
log(a x) log(a x)
p w log(x) 2
p :
httttp://w t t
(%o7) x (-------- + ------)
x x
h ttp
h + x
log(a x) log(a x)

2
log(x)

2
2
(- -------- - ------ + --)
2
h
o .c c x x

o .
x
c c
(%i8) factor(%); /* ayudamos a Maxima a mejorar el resultado */

n .c . c c log(a x) - 2 2
n . c .c c
o n.co (%o8) x
i o
(log (a x) + 2 log(x) log(a x)
c
a cio
2
n . c o
io r m
- log(a x) + log (x) - log(x) + 2)

f o a
p
d pfo r m
Pedimos ahora a Maxima que nos calcule el siguiente resultado que implica derivadas parciales,

e
.
w .ed
ϑ10

/ / w w
ϑx3 ϑy 5 ϑz 2
w
(ex sin(y) tan(z)) = 2ex cos(y) sec2 (z) tan(z).

p : w p :
httttp://w
(%i9) diff(exp(x)*sin(y)*tan(z),x,3,y,5,z,2);
x 2 t t
h ttp
(%o9)
h 2 %e cos(y) sec (z) tan(z)
Maxima también nos puede ayudar a la hora de aplicar la regla de la cadena en el cálculo de
h
. c
o .ccc .
o .cc c
derivadas de funciones vectoriales con variable también vectorial. Supónganse que cierta variable
c
z depende de otras dos x y y, las cuales a su vez dependen de u y v. Veamos cómo se aplica la

n .c
o n.co
ϑz
regla de la cadena para obtener ϑv ϑz 2
, ϑyϑv ϑz 2
o ϑuϑv

o n .
.
c o
(%i10) depends(z,[x,y],[x,y],[u,v]);
c i
a cion . c
io (%o10)
m
[z(x, y), x(u, v), y(u, v)]
(%i11) diff(z,v,1);
r
fo rma
dy dz

.e d p
dx dz

fo
(%o11)

ww .ed
dv dy p
-- -- + -- --
dv dx

p / w ww
(%i12) diff(z,y,1,v,1);
: / 2 2
p :
httttp://w dy d z dx d z
t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 26

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o12) -- --- + -- -----
dv

(%i13) diff(z,u,1,v,1);
dy
2 dv dx dy
h
o .c c 2
dy dy d z
2
dx d z
2
d y dz
o . c c
n .c .c c
(%o13) -- (-- --- + -- -----) + ----- --
n . c . c c
o n.co du dv
dy
2 dv dx dy du dv dy
c i
a cioo n . c o
io 2

f o r m 2
a
2

m
dx dx d z dy d z d x dz
p
d pfo r
+ -- (-- --- + -- -----) + ----- --
. e
w w .ed
du dv
dx
2 dv dx dy du dv dx

: / / w w w
En cualquier momento podemos solicitarle a Maxima que nos recuerde el cuadro de dependen-
p p :
httttp://w t t
cias,
(%i14) dependencies; h ttp
(%o14) h [z(x, y), x(u, v), y(u, v)] h
También podemos eliminar dependencias,

o .c c
(%i15) remove(x,dependency);
o . c c
n .c . c c
(%o15) done
n . c .c c
o n.co (%i16) dependencies;
(%o16) [z(x, y), y(u, v)]
c i
a cioo n . c o
io (%i17) diff(z,y,1,v,1);
2
f o r m a
dy d z
e p
d pfo r m
(%o17)
.
-- ---
w .ed
/ / w wdv

w dy
2

p : w p :
httttp://w t t
Veamos cómo deriva Maxima funciones definidas implı́citamente. En el siguiente ejemplo, para
evitar que y sea considerada una constante, le declararemos una dependencia respecto de x, h ttp
h
(%i18) depends(y,x)$
(%i19) diff(x^2+y^3=2*x*y,x);
h
. c
o .ccc(%o19)
2 dy dy
3 y -- + 2 x = 2 x -- + 2 y
. c
o .cc c
n .c
o n.co
dx dx

o n . c o
i . c
Cuando se solicita el cálculo de una derivada sin especificar la variable respecto de la cual se
c
a cion
io
deriva, Maxima utilizará el sı́mbolo del para representar las diferenciales,
(%i20) diff(x^2); r
fo rmam
(%o20)

.e d p
2 x del(x)
fo
w .ed p
lo que se interpretará como 2xdx. Si en la expresión a derivar hay más de una variable, habrá di-
ferenciales para todas,
w
p : / / w ww p :
httttp://w t
(%i21) diff(x^2+y^3=2*x*y);
2 2 dy
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 27

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o21) 3 y del(y) + (3 y -- + 2 x) del(x) =
dx
dy
2 x del(y) + (2 x -- + 2 y) del(x)
h
o .c c dx

o . c c
n .c .c c n . c . c c
Recuérdese que durante este cálculo está todavı́a activa la dependencia declarada en la entrada

o n.co o
(%i18).

c i o . c
Finalmente, para acabar esta sección, hagamos referencia al desarrollo de Taylor de tercer grado
a cio n
io de la función

f o r m a y= 2
x ln x

e p
d pfo r m x −1
en el entorno de x = 1,
.
w .ed
/ / w w
(%i22) taylor((x*log(x))/(x^2-1),x,1,3);
2
w 3

p : w p :
httttp://w t
1 (x - 1) (x - 1)
(%o22)/T/ - - -------- + -------- + . . .
2 12 12
t
h ttp
h
(%i23) expand(%);
3 2
h
o .c c
(%o23)
x x 5 x
-- - -- + --- + -
1

o . c c
n .c . c c 12 3 12 3
n . c .c c
o n.co i o c o
A continuación un ejemplo de desarrollo multivariante de la función y = exp(x2 sin(xy)) alre-
c
a cio n .
io
dedor del punto (2, 0) hasta grado 2 respecto de cada variable,

f o r m a
(%i24) taylor(exp(x^2*sin(x*y)),[x,2,2],[y,0,2]);
2
e p
d pfo r m
.
(%o24)/T/ 1 + 8 y + 32 y + . . .
w .ed
2

/ / w w w
+ (12 y + 96 y + . . .) (x - 2)

p : w p :
httttp://w t
2 2
+ (6 y + 120 y + . . .) (x - 2) + . . .
(%i25) expand(%);
t
h ttp
h2 2 2 2 2
(%o25) 120 x y - 384 x y + 320 y + 6 x y - 12 x y + 8 y + 1
h
. c
o .ccc . c
o .cc c
Las integrales definidas e indefinidas las controla la función integrate; siguen algunos ejemplos

n .c
o n.co
(%i26) integrate(cos(x)^3/sin(x)^4,x);
2
o n . c o
3 sin (x) - 1
c i
a cion . c
io (%o26)
m
-------------
r
fo rma
3

.e d p
3 sin (x)
fo
Integral is divergent
ww .ed p
(%i27) integrate(cos(x)^3/sin(x)^4,x,0,1);

p : / w ww
-- an error. Quitting. To debug this try debugmode(true);
/
(%i28) integrate(cos(x)^3/sin(x)^4,x,1,2);
p :
httttp://w
1 1 1 1
t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 28

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o28) ------ - --------- - ------ + ---------
sin(2) 3
3 sin (2)
sin(1)

(%i29) integrate(cos(x)^3/sin(x)^4,x,a,2);
3
3 sin (1) h
o .c cIs a - 2 positive, negative, or zero?

o . c c
n .c .c c
p;
n . c . c c
o n.co (%o29)
1 1 1
c i
a cioo n
1
. c
- ------ + --------- + ------ - ---------o
io sin(a) 3

f o r m
sin(2)
a
3

m
3 sin (a) 3 sin (2)

. e p
d pfo r
La primera integral indefinida no requiere explicación; la segunda da un error debido a la

w .ed
singularidad en x = 0; la tercera es una integral definida y la última, siendo también definida, nos
w
: w w w
pide información sobre el parámetro a.
/ /
Cuando Maxima no puede resolver la integral, siempre queda el recurso de los métodos numéri-
p p :
httttp://w t t
cos. El paquete quadpack, escrito inicialmente en Fortran y portado a Lisp para Maxima, es el
encargado de estos menesteres; dispone de varias funciones, pero nos detendremos tan sólo en dos h ttp
h
de ellas, siendo la primera la utilizada para integrales definidas en intervalos acotados,
(%i30) /* El integrador simbólico no puede con esta integral */
h
o .c c integrate(exp(sin(x)),x,2,7);
7
o . c c
n .c . c c /
n . c .c c
o n.co (%o30)
[
I %e
sin(x)
dx
c i
a cioo n . c o
io ]
/
f o r m a
2
e p
d pfo r m
.
(%i31) /* Resolvemos numéricamente */
w .ed
(%o31)
/ / w w
quad_qag(exp(sin(x)),x,2,7,3);

w
[4.747336298073747, 5.27060206376023E-14, 31, 0]

p : w p :
httttp://w t t
La función quad_qag tiene un argumento extra, que debe ser un número entero entre 1 y 6, el
cual hace referencia al algoritmo que la función debe utilizar para la cuadratura; la regla heurı́stica h ttp
h
a seguir por el usuario es dar un número tanto más alto cuanto más oscile la función en el intervalo
de integración. El resultado que obtenemos es una lista con cuatro elementos: el valor aproximado
de la integral, la estimación del error, el número de veces que se tuvo que evaluar el integrando y,
h
. c
o .ccc . c
o .cc c
finalmente, un código de error que será cero si no surgieron problemas.
La otra función de integración numérica a la que hacemos referencia es quad_qagi, a utilizar

n .c
o n.co o n . c
en intervalos no acotados. En el siguiente ejemplo se pretende calcular la probabilidad de que una
o
c i
a cion . c
variable aleatoria χ2 de n = 4 grados de libertad, sea mayor que la unidad (Pr(χ24 > 1)),

io (%i32) n:4$
r
fo rmam
(%i33) integrate(x^(n/2-1)*exp(-y/2)/2^(n/2)*gamma(n/2),x,1,inf);
Integral is divergent

.e d p fo
ww .ed p
-- an error. Quitting. To debug this try debugmode(true);
(%i34) quad_qagi(x^(n/2-1)*exp(-x/2)/2^(n/2)*gamma(n/2),x,1,inf);

p : / / w ww
(%o34) [.9097959895689501, 1.913452127046495E-10, 165, 0]

p :
httttp://w t
(%i35) load(distrib)$
(%i36) 1 - cdf_chi2(1,n),numer;
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 29

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o36) .9097959895689502
El integrador simbólico falla emitiendo un mensaje sobre la divergencia de la integral. La función
quad_qagi ha necesitado 165 evaluaciones del integrando para alcanzar una estimación numérica h
de la integral, la cual se corresponde aceptablemente con la estimación que hacen los algoritmos

o .c c . c c
del paquete de distribuciones de probabilidad (ver Sección 3.7).

o
n .c .c c n . c . c c
Otras funciones de cuadratura numérica son quad_qags, quad_qawc, quad_qawf, quad_qawo y

o n.co o
quad_qaws, cuyas peculiaridades podrá consultar el lector interesado en el manual de referencia.

c i
a cioo n . c
io 3.5. Vectores y campos
f o r m a
p
d pfo r m
En Maxima, los vectores se introducen como simples listas, siendo el caso que con ellas se pueden
e
.
w .ed
realizar las operaciones de adición, producto por un número y producto escalar de vectores,

/
(%i1) [1,2,3]+[a,b,c];
/ w w w
(%o1)
p : w
[a + 1, b + 2, c + 3]
p :
httttp://w
(%i2) s*[a,b,c];
(%o2) [a s, b s, c s] t t
h ttp
h
(%i3) [1,2,3].[a,b,c]; /* producto escalar */
(%o3) 3 c + 2 b + a h
o .c c
al efecto:
o . c
El cálculo del módulo de un vector se puede hacer mediante la definición previa de una función
c
n .c . c c n . c .c c
o n.co o
(%i4) modulo(v):=
if listp(v)
c i
a cioo n . c
io then sqrt(apply("+",v^2))

o r m a
else error("Mucho ojito: ", v, " no es un vector !!!!")$
f
(%i5) xx:[a,b,c,d,e]$

e p
d pfo r m
(%i6) yy:[3,4,-6,0,4/5]$
(%i7) modulo(xx-yy); .
w .ed
4 2
/ / w2
w w
2 2 2

: w
(%o7) sqrt((e - -) + d + (c + 6) + (b - 4) + (a - 3) )
p p :
httttp://w t t
5
Los operadores diferenciales que son de uso común en el ámbito de los campos vectoriales están h ttp
h
programados en el paquete vect, lo que implica que debe ser cargado en memoria antes de ser
utilizado. Sigue a continuación una sesión de ejemplo sobre cómo usarlo.
h
Partamos de los campos escalares φ(x, y, z) = −x + y 2 + z 2 y ψ(x, y, z) = 4x + log(y 2 + z 2 )

. c
o .ccc . c c
y demostremos que sus lı́neas de nivel son ortogonales probando que ∇φ · ∇ψ = 0, siendo ∇ el
o .cc
n .c
o n.co
operador gradiente,

o n . c o
(%i8) /* Se carga el paquete */
c i
a cion . c
io
load(vect)$

r m
(%i9) /* Se definen los campos escalares */
fo rma
e d p
phi: y^2+z^2-x$ psi:log(y^2+z^2)+4*x$

fo
(%i11) /* Calculamos el producto escalar de los gradientes */
.
2 2 w .ed
grad(phi) . grad(psi);

w p 2 2
(%o11)
: / / w ww
grad (z + y - x) . grad (log(z + y ) + 4 x)
p p :
httttp://w
Como se ve, Maxima se limita a devolvernos la misma expresión que le introducimos; el estilo de
t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 30

: / / w w w :
htttp : / / w
trabajo del paquete vect requiere el uso de dos funciones: express y ev, la primera para obtener
t t
h ttpp
h tp
la expresión anterior en términos de derivadas y la segunda para forzar el cálculo de éstas.
(%i12) express(%);
d 2 2 d 2 2
h
o .c c(%o12) (-- (z + y - x)) (-- (log(z + y ) + 4 x))

o . c c
c
dz dz

n .c .c d 2 2 d 2 2
n . c . c c
o n.co + (-- (z + y - x)) (-- (log(z + y ) + 4 x))
c i
a cioo n . c o
io
dy dy
d 2 2 d 2
f
2
o r m a
dx dx
e p
d pfo m
+ (-- (z + y - x)) (-- (log(z + y ) + 4 x))
r
(%i13) ev(%,diff); .
w .ed
/ / w w
2
w
2

p : 4 z
w 4 y
p :
httttp://w t t
(%o13) ------- + ------- - 4
2 2 2 2
h ttp
h
(%i7) ratsimp(%);
(%o7)
z + y z + y

0
h
o .c c . c c
Al final, hemos tenido que ayudar un poco a Maxima para que terminase de reducir la última
o
n .c . c c
expresión.

n . c .c c
Sea ahora el campo vectorial definido por F = xyi + x2 zj − ex+y k y pidámosle a Maxima que
o n.co c i o . c o
calcule su divergencia, (∇ · F), rotacional (∇ × F)y laplaciano (∇2 F)
a cio n
io (%i8) F: [x*y,x^2*z,exp(x+y)]$

f o r m a
(%i9) div (F); /* divergencia */

e p
d pfo
2
r m
y + x
(%o9)
.
w .ed
div [x y, x z, %e ]
(%i10) express (%);

/ / w w w
p :
d 2
w
d y + x d

p :
httttp://w t t
(%o10) -- (x z) + -- (%e ) + -- (x y)
dy dz dx
h ttp
(%o11) h
(%i11) ev (%, diff);

(%i12) curl (F); /* rotacional */


y h
. c
o .ccc(%o12)
2
curl [x y, x z, %e
y + x
]
. c
o .cc c
n .c
o n.co
(%i13) express (%);

o n . c o
d
(%o13) [-- (%e
y + x d 2 d
c i
a cion
d
) - -- (x z), -- (x y) - -- (%e
. cy + x
),

io dy dz dz
r
fo rmam dx
d 2 d

.e d p fo -- (x z) - -- (x y)]

(%i14) ev (%, diff);


ww .ed p dx dy

p : / / w ww
y + x 2 y + x

p :
httttp://w t
(%o14) [%e - x , - %e , 2 x z - x]
(%i15) laplacian (F); /* laplaciano */ t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 31

: / / w w w :
htttp : / / w t t
h ttpp
h tp
2 y + x
(%o15)
(%i16)
laplacian [x y, x z, %e
express (%);
2 2
]
h
o .c c(%o16)
d 2
--- ([x y, x z, %e
y + x d 2
]) + --- ([x y, x z, %e
o . c c
y + x
])

n .c .c c 2 2
n . c . c c
o n.co dz dy
c i
a cio
2 o n . c o
io f o r m d
a
2
+ --- ([x y, x z, %e
y + x
])

e p
d pfo r m 2
.
w .ed
dx
(%i17) ev (%, diff);

/ / w w w y + x

p : w p :
httttp://w t
(%o17) [0, 2 z, 2 %e ]
Nótese en todos los casos el usos de la secuencia express - ev. Por último, el paquete vect t
h ttp
h
incluye también la definición del producto vectorial, al cual le asigna el operador ~,
(%i18) [a, b, c] ~ [x, y, z];
h
o .c c
(%o18)
(%i19) express(%);
[a, b, c] ~ [x, y, z]

o . c c
n .c . c c
(%o19) [b z - c y, c x - a z, a y - b x]
n . c .c c
o n.co c i
a cioo n . c o
io 3.6. Ecuaciones diferenciales
f o r m a
p
d pfo r m
Con Maxima se pueden resolver simbólicamente algunas ecuaciones diferenciales ordinarias de
e
.
w .ed
primer y segundo orden mediante la instrucción ode2.

/ / w w w
Para expresar una de estas ecuaciones se hace uso de diff,
dy
Una ecuación diferencial de primer orden tiene la forma general F (x, y, y 0 ) = 0, donde y 0 = dx .

p : w p :
httttp://w t t
h ttp
(%i1) /* ecuación de variables separadas */
ec:(x-1)*y^3+(y-1)*x^3*’diff(y,x)=0;

(%o1) h 3 dy 3
x (y - 1) -- + (x - 1) y = 0
dx
h
. c
o .ccc . c c
siendo obligatorio el uso de la comilla simple (’) antes de diff al objeto de evitar el cálculo de
o .cc
n .c
o n.co o n . c
la derivada, que por otro lado darı́a cero al no haberse declarado la variable y como dependiente

o
de x. Para la resolución de esta ecuación tan solo habrá que hacer

c i
a cion . c
io
(%i2) ode2(ec,y,x);
2 y - 1
r
fo rma
2 x - 1
m
(%o2)
2
. e p
------- = %c - -------
d 2
fo
2 y
ww .ed p
2 x

p : / / w ww
donde %c representa una constante, que se ajustará de acuerdo a la condición inicial que se le

p :
httttp://w t
imponga a la ecuación. Supóngase que se sabe que cuando x = 2, debe verificarse que y = −3, lo
cual haremos saber a Maxima a través de la función ic1, t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 32

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i3) ic1(%o2,x=2,y=-3);

(%o3)
2 y - 1
2
x + 72 x - 36
------- = - --------------
h
o .c c 2 2

o . c c
c
2 y 72 x

n .c .c n . c . c c
o n.co c
a cioo n . c o
Veamos ejemplos de otros tipos de ecuaciones diferenciales que puede resolver Maxima,
i
io
(%i4) /* ecuacion homogénea */

o r m
ode2(x^3+y^3+3*x*y^2*’diff(y,x),y,x);
f a
3

e
4
p
d pfo r m
.
4 x y + x
(%o4)
w .ed
----------- = %c
w
p : / / w w
4
w
En este caso, cuando no se incluye el sı́mbolo de igualdad, se da por hecho que la expresión es
p :
httttp://w
igual a cero.
t t
h ttp
h
(%i5) /* reducible a homogénea */
ode2(’diff(y,x)=(x+y-1)/(x-y-1),y,x);
2 2 x - 1
h
o .c c log(y + x - 2 x + 1) + 2 atan(-----)
y
o . c c
n .c . c c
(%o5) -------------------------------------- = %c
n . c .c c
o n.co 4
(%i6) /* ecuación exacta */
c i
a cioo n . c o
io r m
ode2((4*x^3+8*y)+(8*x-4*y^3)*’diff(y,x),y,x);

f o a
(%o6)
4

e p
4

d pfo
- y + 8 x y + x = %c
r m
(%i7) /* Bernoulli */
.
w .ed
/ / w
ode2(’diff(y,x)-y+sqrt(y),y,x);
w w
(%o7)
:
2 log(sqrt(y) - 1) = x + %c

p w p :
httttp://w t t
(%i8) solve(%,y);
x + %c x/2 + %c/2
h ttp
(%o8)
h
[y = %e + 2 %e + 1]
En este último caso, optamos por obtener la solución en su forma explı́cita. h
Una ecuación diferencial ordinaria de segundo orden tiene la forma general F (x, y, y 0 , y 00 ) = 0,

. c
o .ccc c c
siendo y 00 la segunda derivada de y respecto de x. Como ejemplo,
.
o .cc
n .c
o n.co
(%i9) ’diff(y,x)=x+’diff(y,x,2);

o n . c o
dy
2
d y
c i
a cion . c
io (%o9) -- = --- + x
dx 2 r
fo rmam
dx
.e d p fo
(%i10) ode2(%,y,x);

ww .ed
2 p
p : / / w ww
x x + 2 x + 2

p :
httttp://w t
(%o10) y = %k1 %e + ------------ + %k2
2 t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 33

: / / w w w :
htttp : / / w
Maxima nos devuelve un resultado que depende de dos parámetros, %k1 y %k2, que para ajustar-
t t
h ttpp
h tp
los necesitaremos proporcionar ciertas condiciones iniciales; si sabemos que cuando x = 1 entonces
dy
y = −1 y y 0 = dx
x=1
= 2, haremos uso de la instrucción ic2, h
(%i11) ic2(%,x=1,y=-1,diff(y,x)=2);

o .c c 2
o . c c
n .c .c c x + 2 x + 2 7

n . c . c c
o n.co o
(%o11) y = ------------ - -
2 2
c i
a cioo n . c
io f o r m
En el caso de las ecuaciones de segundo orden, también es posible ajustar los parámetros de la
a
solución especificando condiciones de contorno, esto es, fijando dos puntos del plano por los que
p
d pfo r m
pase la solución; ası́, si la solución obtenida en (%o10) debe pasar por los puntos (−1, 3) y (2, 35 ),
e
hacemos
.
w .ed
w w w
(%i12) bc2(%o10,x=-1,y=3,x=2,y=5/3);
/ /
p :x + 1
w2 3
p :
httttp://w t t
35 %e x + 2 x + 2 15 %e + 20
(%o12) y = - ---------- + ------------ + ----------- h ttp
h 3
6 %e - 6
2 3
6 %e - 6 h
o .c c Nótese que este cálculo se le solicita a Maxima con bc2.

. c c
La resolución de sistemas de ecuaciones diferenciales se hace con llamadas a la función desolve.
o
n .c . c c n . c .c c
En este contexto es preciso tener en cuenta que se debe utilizar notación funcional dentro de la

o n.co c
a cioo n . c o
expresión diff; un ejemplo aclarará este punto, resolviendo el sistema
i
io
(

m
df (x)
= 3f (x) − 2g(x)

p f o r dx

a
dg(x)

m
= 2f (x) − 2g(x)
r
dx

. e d pfo
w w .ed
(%i13) desolve([’diff(f(x),x)=3*f(x)-2*g(x),

p : / / w w w
’diff(g(x),x)=2*f(x)-2*g(x)],

p :
httttp://w t
[f(x),g(x)]);

(2 g(0) - f(0)) %e
- x
t
h ttp
h
(%o13) [f(x) = ---------------------
3
h
2 x

. c
o .ccc (2 g(0) - 4 f(0)) %e
. c
o .cc c
n .c
o n.co
- -----------------------, g(x) =
3
o n . c o
- x
c i
a cion
2 x
. c
io (4 g(0) - 2 f(0)) %e
m
(g(0) - 2 f(0)) %e
r
fo rma
----------------------- - ---------------------]
3

.e d p f
3
o
w .ed p
Como se ve, las referecias a las funciones deben incluir la variable independiente y las ecua-

w
ciones estarán acotadas entre corchetes, ası́ como los nombres de las funciones. Observamos en la

: / / w ww
respuesta que nos da Maxima la presencia de f(0) y g(0), lo cual es debido a que se desconocen

p p :
httttp://w t t
las condiciones de contorno del sistema.

h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 34

: / / w w w :
htttp : / / w
En este último ejemplo, supongamos que queremos resolver el sistema de ecuaciones diferenciales
t t
h ttpp
h tp h

df (x)

 dx = f (x) + g(x) + 3h(x)
dg(x)
dx = g(x) − 2h(x)
 dh(x) = f (x) + h(x)

o .c c dx

o . c c
bajo las condiciones f (0) = −1, g(0) = 3 y f (0) = 1. En primer lugar introduciremos estas

n .c .c c n . c . c c
condiciones con la función atvalue, para posteriormente solicitar la resolución del sistema,
o n.co (%i14) atvalue(f(x),x=0,-1)$
c i
a cioo n . c o
io (%i15)
(%i16)
atvalue(g(x),x=0,3)$
atvalue(h(x),x=0,1)$
f o r m a
(%i17)
p
d pfo r m
desolve([’diff(f(x),x)=f(x)+g(x)+3*h(x),
e
.
’diff(g(x),x)=g(x)-2*h(x),
w .ed
/ /
2 x
w w
’diff(h(x),x)=f(x)+h(x)], [f(x),g(x),h(x)]);

w 2 x - x

p : w p :
httttp://w t
(%o17) [f(x) = x %e + %e - 2 %e ,

g(x) = - 2 x %e
2 x
+ 2 %e
2 x
+ %e
- x
,
t
h ttp
h(x) = x %e
h
2 x
+ %e
- x
]
h
o .c c
bien de ecuaciones diferenciales de primer orden
o . c
Además de las funciones anteriores, el paquete plotdf permite generar campos de direcciones,
c
n .c . c c n . c .c c
o n.co o
dy

c i
dx
a cioo n . c
= F (x, y),

io bien de sistemas

f o r m
a dx
= G(x, y)
p m
dt

. e d pfo r dy
dt = F (x, y)

w w .ed
Los argumentos a pasar a la función plotdf son la función F , en el primer caso, y una lista
con las funciones F y G en el segundo. Las variables serán siempre x e y. Como ejemplo, pidamos

/ / w w
a Maxima que genere el campo de direcciones de la ecuación diferencial dx

p : w
dy
= 1 + y + y2

p :
httttp://w
(%i18) load(plotdf)$
(%i19) plotdf(1 + y + y^2); t t
h ttp
h
El gráfico que resulta es el de la Figura 3.1 izquierda, en el que además se observan dos trayec-
torias que se dibujaron de forma interactiva al hacer clic sobre dos puntos del plano.
h
. c
o .ccc .
o .cc c
La función plotdf admite varias opciones, algunas de las cuales aprovechamos en el siguiente
c
ejemplo. Supongamos el modelo predador-presa de Lotka-Volterra, dependiente de dos parámetros

n .c
o n.co
h y k,  dx
o n . c o
c i
a cion
dy
c
dt = 2x + hxy
.
dt = −x + kxy

io r
fo rmam
El siguiente código permite generar el campo de direcciones correspondiente, dándoles inicial-

e d p
mente a h y k los valores -1.2 y 0.9, respectivamente; además, aparecerán sobre la ventana gráfica

fo
dos barras de deslizamiento para alterar de forma interactiva estos dos parámetros y ver los cambios
.
w .ed
que se producen en el campo.
w p
p : / / w ww
(%i20) plotdf([2*x+k*x*y, -y+h*x*y],

p :
httttp://w t
[parameters,"k=-1.2,h=0.9"],
[sliders,"k=-2:2,h=-2:2"]);
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 35

: / / w w w :
htttp : / / w t t
h ttpp
h tp h
8

c c
4

co .c c c o . c c
n .
o n.co .c i o n . o . c
c
0
0

io c
a cio n .
-4

f o r m a
e p
d pfo r m -5

.
w .ed
-8

/ / w w w
-8

p : -4

w 0 4 8
-10
-5 0 5 10

p :
httttp://w
Figura 3.1: Campos de direcciones creados con la función ’plotdf’: a la izquierda el campo de la t t
h ttp
dy
ecuación dx
h= 1 + y + y 2 , a la derecha el correspondiente al modelo predador-presa.
h
o .c c o . c c
En la Figura 3.1 derecha se observa el gráfico obtenido despúes de pedir trayectorias concretas

n .c . c c n . c .c c
que pasan por varios puntos del plano (en el archivo gráfico no aparecen las barras de deslizamiento).

o n.co i o c o
Cuando la función ode2 no es capaz de resolver la ecuación propuesta, se podrá recurrir al
c
a cio n .
método numérico de Runge-Kutta, el cual se encuentra programado en el paquete diffeq. Como
io r m
primer ejemplo, nos planteamos la resolución de la ecuación

f o a
e p
d pfo r
dy
m= −2y 2 + exp(−3t),
.
w .ed
dt

/ / w w
con la condición y(0) = 1. La función ode2 es incapaz de resolverla:
w
p : w p :
httttp://w t
(%i21) ec: ’diff(y,t)+2*y^2-exp(-3*t)=0;

(%o21)
dy 2
-- + 2 y - %e
- 3 t
= 0
t
h ttp
h
(%i22) ode2(ec,y,t);
dt h
. c
o .ccc(%o22) false

. c
o .cc c
Abordamos ahora el problema con un enfoque numérico, para lo cual definimos la expresión

n .c
o n.co o n . c o
f (t, y) =
c i
dy

a cion
dt . c
= −2y 2 + exp(−3t)

io en Maxima,
r
fo rmam
(%i23) load(diffeq)$
.e d p fo
w .ed
(%i24) f(t,y):= -2*y^2+exp(-3*t) $

w
(%i25) res: runge1(f,0,5,0.5,1); p
: / / w ww
(%o25) [[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0],

p p :
httttp://w t t
[1.0, .5988014211752297, .4011473182183033, .2915932807721147,
.2260784415237641, 0.183860316087325, .1547912058210609,
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 36

: / / w w w :
htttp : / / w t t
h ttpp
1 2
discrete1 discrete1

h tp
0.9 1.5

0.8

0.7

0.6
1

0.5
h
c c
0

c c
0.5

.co . c
0.4

. c o . c
-0.5

n
o n.co .c 0.3

i o n c o . c -1

-1.5

.
0.2

io
0.1

m c
a cio n -2

0
0 1 2

p f o r m a
3 4 5
-2.5
0 10 20 30 40 50 60 70 80 90 100

2.5

. e
a)
d pfo r discrete1
2.5
b)
discrete1

w w .ed 2

w
1.5 1.5

p : / / w w 1

p :
httttp://w t t
0.5 0.5

0 0

h ttp
h h
-0.5 -0.5

-1 -1

-1.5 -1.5

c c
-2 -2

c o .c c
-2.5
-2.5 -2 -1.5 -1 -0.5 0 0.5

c o .
1
c c
1.5 2
-2.5
-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2

n .
o n.co . c c)

i o n . o .c d)

c
a cio n . c
Figura 3.2: Resolución numérica de ecuaciones diferenciales con ’diffeq’: a), solución de la ecuación
io de primer orden dy
d2 y
= 0,2(1 − y 2 ) dy
2

f o r m
dt = −2y + exp(−3t), y(0) = 1; b), solución de la ecuación de segundo orden

a 0 0
dt2
00
diagrama (y, y ).
e p
d pfo m
dt − y, con las condiciones y(0) = 0,1 y y (0) = 1; c), diagrama (y, y ); d),
r
.
w .ed
/ / w w w
p : w p :
httttp://w t
.1336603954558797, .1176289334565761, .1050518038293819,
.09491944625388439], [- 1.0, - 0.49399612385452,
- .2720512734596094, - .1589442862446483, - .09974417126696171,
t
h ttp
h
- .06705614729331426, - .04779722499498942, - .03570266617749457,
- .02766698775990988, - .02207039201652747, - .01801909665196759]]
h
(%i26) plot2d([discrete,res[1],res[2]])$

. c
o .ccc . c
o .cc c
La función runge1 necesita cinco argumentos: la función derivada dy dt , los valores inicial, t0 , y

n .c
o n.co o n . c
final, t1 , de la variable independiente, la amplitud de los subintervalos y el valor que toma y en
o
i . c
t0 . El resultado es una lista que a su vez contiene tres listas: las abscisas t, las ordenadas y y las
c
a cion
io
correspondientes derivadas. Al final del ejemplo anterior, se solicita la representación gráfica de la

r m
solución, cuyo aspecto es el mostrado por la Figura 3.2 a).
fo rma
.e d p
Nos planteamos ahora la resolución de la ecuación diferencial de segundo orden

fo d2 y

ww .ed p dt 2
= 0,2(1 − y 2 )
dy
dt
− y,

p : / / w ww
con y(0) = 0,1 y y 0 (0) = 1 para lo cual definimos en Maxima la función
p :
httttp://w g(t, y, y 0 ) =
d2 y
dt2
= 0,2(1 − y 2 )y 0 − y, t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 37

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i27) g(t,y,yp) := 0.2*(1-y^2)*yp - y $
(%i28) res: runge2(g,0,100,0.1,0.1,1)$
(%i29) plot2d([discrete,res[1],res[2]],
[gnuplot_curve_styles,["with lines"]])$
h
o .c c(%i30) plot2d([discrete,res[2],res[3]],

o . c c
c
[gnuplot_curve_styles,["with lines"]])$

n .c .c (%i31) plot2d([discrete,res[2],res[4]],
n . c . c c
o n.co i o
[gnuplot_curve_styles,["with lines"]])$
c
a cio n . c o
io
2

f o m
La función runge2 necesita seis argumentos: la función derivada ddt2y , los valores inicial, t0 , y
r a
final, t1 , de la variable independiente, la amplitud de los subintervalos y los valores que toman y y
p
d pfo r m
su primera derivada en t0 . El resultado es una lista que a su vez contiene cuatro listas: las abscisas
e
.
t, las ordenadas y, las correspondientes primeras derivadas y, por último, las segundas derivadas.
w .ed
/ w
Al final de este último ejemplo se solicitan algunos gráficos asociados a la solución, los formados

w w
con los pares (t, y), (y, y 0 ) y (y, y 00 ), que son los correspondientes a los apartados b), c) y d) de la
/
Figura 3.2.
p :
tt p://w w t t p :
h h ttp
3.7.
htt
Probabilidades y estadı́stica
El paquete distrib contiene la definición de las funciones de distribución de probabilidad más
h
o .c c o . c c
comunes, tanto discretas (binomial, de Poisson, de Bernoulli, geométrica, uniforme discreta, hi-
pergeométrica y binomial negativa), como continuas (normal, t de Student, χ2 de Pearson, F de

n .c . c c n . c .c c
Snedecor, exponencial, lognormal, gamma, beta, uniforme continua, logı́stica, de Pareto, de Wei-
o n.co c i
a cioo n . c o
bull, de Rayleigh, de Laplace, de Cauchy y de Gumbel). Para cada una de ellas, se puede calcular

io
la probabilidad acumulada, la función de densidad o los cuantiles,
(%i1) load(distrib)$
f o r m a
(%i2) assume(s>0)$
e p
d pfo r m
(%i3) cdf_normal(x,mu,s);
.
w .ed
/ / w w w
x - mu
erf(---------)

p : w sqrt(2) s 1
p :
(%o3)
httttp://w -------------- + -
2 2
t t
h ttp
(%i4)
h
pdf_poisson(5,1/s);
- 1/s
h
%e

. c
o .ccc(%o4) -------
. c
o .cc c
n .c
o n.co
120 s
5

o n . c o
(%i5) quantile_student_t(0.05,25);
c i
a cion . c
io (%o5) - 1.708140543186975
r
fo rmam
También se pueden calcular los momentos de primer y segundo orden,

. e d p fo
p
(%i6) mean_weibull(3,67);

ww .ed 1

p : / / w ww 67 gamma(-)
3
p :
(%o6)
httttp://w -----------
t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 38

: / / w w w :
htttp : / / w t t
h ttpp
h tp
3
(%i7) var_binomial(34,1/8);

(%o7)
119
---
h
o .c c 32

o . c c
n .c .c c
distribuciones anteriores,
n . c . c c
Por último, también es posible la simulación de muestras independientes de cualquiera de las

o n.co (%i8) random_negative_binomial(9,1/5,15);


c i
a cioo n . c o
io r m
(%o8) [65, 28, 44, 31, 19, 22, 28, 37, 42, 29, 47, 32, 53, 39, 57]

f o a
p r m
En cuanto a la estadı́stica descriptiva, se remite al interesado a ”Primeros pasos en Maxima”.

e d pfo
.
En un futuro próximo, Maxima contendrá un paquete que incluye procedimientos inferenciales

w .ed
y de contraste estadı́stico de hipótesis, tanto paramétricos como no paramétricos. Sigue a conti-

/ / w
nuación una sesión sobre regresión lineal simple2
w w
p : w p :
httttp://w t
(%i9) load("stats.mac")$
Warning: global variable ’numer’ is set to ’true’.
Warning: global variable ’fpprintprec’ is set to 7.
t
h ttp
h
(%i10) datos:[[125,140.7],[130,155.1],[135,160.3],[140,167.2],[145,169.8]]$
(%i11) z:simple_linear_reg(datos,conflevel=0.99);
h
o .c c [
[
SIMPLE LINEAR REGRESSION ]
]
o . c c
n .c . c c [ model = 1.406 x - 31.19 ]
n . c .c c
o n.co [
[ correlation = .9611685
c i
a cioo]
]
n . c o
io [
[
f o r m
v_estimation = 13.57967
a
]
]
[
e p
d pfo r m ]
(%o11)
.
[ b_conf_int = [.04469634, 2.767304] ]
w .ed
[

/ / w w w
[ hypotheses = H0: b = 0 ,H1: b # 0 ]
]

p : w p :
httttp://w t
[ ]
[
[
statistic = 6.032687 ]
]
t
h ttp
h[
[
distribution = [student_t, 3] ]
]
h
[ p_value = .003805955 ]

. c
o .ccc . c
o .cc c
Maxima nos muestra los resultados más importantes: la ecuación de la recta de regresión,

n .c
o n.co o n . c
el coeficiente de correlación, la estimación insesgada de la varianza de los errores aleatorios del
o
c i
a cion . c
modelo yi = a + bxi + i , con {i } iid N (0, σ 2 ). Además, obtenemos el intervalo de confianza

io
para la pendiente de la recta de regresión, qué hipótesis se está contrastando sobre b (la nula y

r m
la alternativa), el estadı́stico del contraste, su distribución y el p-valor correspondiente; en este
fo rma
H1 : b 6= 0.
.e d p
caso, hay suficiente evidencia (con nivel de significación 0.01) para rechazar H0 : b = 0 en favor de

fo
w .ed p
Veamos cómo hacer uso de estos resultados; en primer lugar, nos puede interesar una represen-
w
tación gráfica de los datos, junto con la recta estimada (Figura 3.3),

p : / / w ww
2 Debido a que este paquete aún está en fase de desarrollo, es posible que en su versión final los resultados no se

p :
httttp://w t t
h ttp
muestren tal cual se ve en estos ejemplos.

h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 39

: / / w w w :
htttp
180
: / / w t t
h ttpp
h tp
discrete1

175
1.406*x-31.19

h
o .c c 170

o . c c
n .c .c c 165

n . c . c c
o n.co c i
a cioo n . c o
io
160

f o r m a
155

e p
d pfo r m
150 .
w .ed
/ / w w w
145
p : w p :
httttp://w
140
t t
h ttp
h
135
h
120 125 130 135 140 145 150

o .c c o . c c
n .c . c c n . c .c c
Figura 3.3: Ajuste del modelo de regresión lineal.

o n.co c i
a cioo n . c o
io f o r m a
(%i12) plot2d([[discrete, datos], take_inference(model,z)],
[x,120,150],

e p
d pfo r m
.
[gnuplot_curve_styles, ["with points","with lines"]] )$
w .ed
/ / w
En caso de querer estimar la respuesta y para el valor x = 133,
w w
p : w
(%i13) take_inference(model,z), x=133;
p :
(%o13)
httttp://w 155.808
t t
h ttp
h
Pero Maxima puede hacer más por nosotros. Además de los resultados mostrados, la variable z
guarda otros que no muestra, porque entiende que no son de uso frecuente; esta variable almacena
también las medias y varianzas de x e y, el coeficiente de determinación ajustado, los intervalos
h
. c
o .ccc .
o .cc c
de confianza para los parámetros a y σ 2 del modelo, los intervalos de confianza para la media
c
condicionada y para una nueva observación y, finalmente, los pares de residuos (â+ b̂xi , yi −â− b̂xi ),

n .c
o n.co o n . c
imprescindibles para el análisis de la bondad de ajuste del modelo y que se representan en la
o
z:
c i
a cion . c
Figura 3.4 como resultado de la instrucción %i16. Veamos cómo seguir haciendo uso de la variable

io (%i14) take_inference(means,z);
r
fo rmam
(%o14)

.e d p
[135.0, 158.62]

fo
p
(%i15) /* Intervalo de confianza para nueva predicción */

w .ed
take_inference(new_pred_conf_int,z), x=133;
w
(%o15)

p : / / w ww
[132.0729, 179.5431]
(%i16) plot2d([discrete,take_inference(residuals,z)])$
p :
httttp://w
En fin, para saber qué resultados están almacenados en la variable z, no hay más que escribir t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 40

: / / w w w :
htttp
4
: / / w t t
h ttpp
h tp
discrete1

3 h
o .c c 2

o . c c
n .c .c c n . c . c c
o n.co 1

c i
a cioo n . c o
io 0

f o r m a
e p
d pfo r m
-1
.
w .ed
/ / w w w
-2

p : w p :
httttp://w
-3 t t
h ttp
h
-4
h
140 145 150 155 160 165 170 175

o .c c o . c c
n .c . c c n . c .c c
Figura 3.4: Predicciones y residuos: (â + b̂xi , yi − â − b̂xi ).

o n.co c i
a cioo n . c o
io (%i17) items_inference(z);
f o r m a
p
d pfo r m
(%o17) [model, means, variances, correlation, adc, a_estimation,
e
.
a_conf_int, b_estimation, b_conf_int, hypotheses, statistic,
w .ed
/ w
distribution, p_value, v_estimation, v_conf_int,

w w
cond_mean_conf_int, new_pred_conf_int, residuals]
/
p : w p :
3.8. httttp://wnumérica
Interpolación
t t
h ttp
h
El paquete interpol permite abordar el problema de la interpolación desde tres enfoques:
h
lineal, polinomio de Lagrange y splines cúbicos.

. c
o .ccc . c c
A lo largo de esta sección vamos a suponer que disponemos de los valores empı́ricos de la
o .cc
n .c
o n.co
siguiente tabla:

o n . c o
x
c7
i
a cion
8
. c
1 3 6

io r
y

fo rmam 2 2 5 2 7

.e d p
Nos planteamos en primer lugar el cálculo de la función de interpolación lineal, para lo cual

fo
haremos uso de la función linearinterpol,
(%i1) load(interpol)$
ww .ed p
(%i2)
/ / w ww
datos: [[7,2],[8,2],[1,5],[3,2],[6,7]]$

p : p :
httttp://w t
(%i3) linearinterpol(datos);
(%o3) - ((9 x - 39) charfun2(x, minf, 3) t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 41

: / / w w w :
htttp : / / w t t
h ttpp
h tp
- 12 charfun2(x, 7, inf) + (30 x - 222) charfun2(x, 6, 7)
+ (18 - 10 x) charfun2(x, 3, 6))/6
(%i4) f(x):=’’%;
(%o4) f(x) := - ((9 x - 39) charfun2(x, minf, 3)
h
o .c c - 12 charfun2(x, 7, inf) + (30 x - 222) charfun2(x, 6, 7)
+ (18 - 10 x) charfun2(x, 3, 6))/6
o . c c
n .c .c c n . c . c c
o n.co o
Empezamos cargando el paquete que define las funciones de interpolación y a continuación

c i o . c
introducimos los pares de datos en forma de lista. La función linearinterpol devuelve una ex-
a cio n
io o m
presión definida a trozos, en la que charfun2(x,a,b) devuelve 1 si el primer argumento pertence
r a
al intervalo [a, b) y 0 en caso contrario. Por último, definimos cierta función f previa evaluación
f
p r m
(dos comillas simples) de la expresión devuelta por linearinterpol. Esta función la podemos

e d pfo
.
utilizar ahora tanto para interpolar como para extrapolar:

w .ed
/ / w
(%i5) map(f,[7.3,25/7,%pi]);
w w
p : 62
w
18 - 10 %pi

p :
httttp://w t t
(%o5) [2, --, - -----------]
21 6
h ttp
h
(%i6) %,numer;
(%o6) [2, 2.952380952380953, 2.235987755982988] h
Unos comentarios antes de continuar. Los datos los hemos introducido como una lista de pares

o .c c c c
de números, pero también la función admite una matriz de dos columnas o una lista de números,

o .
n .c . c c n . c .c c
asignándole en este último caso las abscisas secuencialmente a partir de la unidad; además, la lista
de pares de la variable datos no ha sido necesario ordenarla respecto de la primera coordenada,
o n.co c i o
asunto del que ya se encarga Maxima por cuenta propia.
a cio n . c o
io El polinomio de interpolación de Lagrange se calcula con la función lagrange; en el siguiente

o r m a
ejemplo le daremos a los datos un formato matricial y le indicaremos a Maxima que nos devuelva
f
p r
el polinomio con variable independiente w,

e d pfo m
.
w .ed
(%i7) datos2: matrix([7,2],[8,2],[1,5],[3,2],[6,7]);

/ / w w
[ 7 2 ]
[
w ]

p : w p :
httttp://w t
[ 8 2 ]

(%o7)
[
[ 1 5 ]
] t
h ttp
h [
[ 3 2 ]
] h
. c
o .ccc [
[ 6 7 ]
]

. c
o .cc c
n .c
o n.co
(%i8) lagrange(datos2,varname=’w);

o n . c o
i
4 3 2

c
a cion
73 w - 1402 w + 8957 w - 21152 w + 15624
. c
io (%o8)
r m
-------------------------------------------
420
fo rma
(%i9) g(w):=’’%;

.e d p fo
4

w
3
w .ed p 2
73 w - 1402 w + 8957 w - 21152 w + 15624

p : / / w ww
(%o9) g(w) := -------------------------------------------

p :
httttp://w t
420
(%i10) map(g,[7.3,25/7,%pi]), numer;
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 42

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%o10) [1.043464999999768, 5.567941928958183,
2.89319655125692]
Disponemos en este punto de dos funciones de interpolación; representémoslas gráficamente h
junto con los datos empı́ricos,

o .c c(%i11) plot2d([’(f(x)),g(x),[discrete,datos]],[x,0,10],
o . c c
n .c .c c [gnuplot_curve_styles,
n . c . c c
o n.co ["with lines",
"with lines",
c i
a cioo n . c o
io r m
"with points pointsize 3"]])$

f o a
p
d pfo r m
cuyo resultado se ve en el apartado a) de la Figura 3.5.

e
.
El método de los splines cúbicos consiste en calcular polinomios interpoladores de tercer grado
w .ed
entre dos puntos de referencia consecutivos, de manera que sus derivadas cumplan ciertas condi-

/ w w w
ciones que aseguren una curva sin cambios bruscos de dirección. La función que ahora necesitamos
/
es cspline,
p : w p :
httttp://w
(%i12) cspline(datos); t t
h ttp
h 3 2
(%o12) ((3477 x - 10431 x - 18273 x + 74547)
3 2
h
o .c ccharfun2(x, minf, 3) + (- 15522 x + 372528 x - 2964702 x
+ 7842816) charfun2(x, 7, inf)
o . c c
n .c . c c 3 2
n . c .c c
o n.co + (28290 x - 547524 x + 3475662 x - 7184700)
3 2
c i
a cioo n . c o
io + 345924) charfun2(x, 3, 6))/9864
f o r m
charfun2(x, 6, 7) + (- 6574 x + 80028 x - 289650 x
a
(%i13) s1(x):=’’%$
e p
d pfo r m
.
w .ed
(%i14) map(s1,[7.3,25/7,%pi]), numer;

/ / w
(%o14) [1.438224452555094, 3.320503453379951,
w w 2.227405312429501]

p : w p :
httttp://w t t
La función cspline admite, además de la opción ’varname que ya se vió anteriormente, otras
dos a las que se hace referencia con los sı́mbolos ’d1 y ’dn, que indican las primeras derivadas h ttp
h
en las abscisas de los extremos; estos valores establecen las condiciones de contorno y con ellas
Maxima calculará los valores de las segundas derivadas en estos mismos puntos extremos; en caso
de no suministrarse, como en el anterior ejemplo, las segundas derivadas se igualan a cero. En el
h
. c
o .cccsiguiente ejemplo hacemos uso de estas opciones,
. c
o .cc c
n .c
o n.co
(%i15) cspline(datos,’varname=’z,d1=1,dn=0);

o n . c o
i
3 2

c
a cion
(%o15) ((21051 z - 130635 z + 218421 z - 7317)
. c
io 3
r
fo rmam 2
charfun2(z, minf, 3) + (- 55908 z + 1285884 z - 9839808 z

d
+ 25087392) charfun2(z, 7, inf)

.e p fo
3 2

ww .ed p
+ (66204 z - 1278468 z + 8110656 z - 16797024)

p : / / w ww 3 2

p :
httttp://w t
charfun2(z, 6, 7) + (- 16180 z + 204444 z - 786816 z
+ 997920) charfun2(z, 3, 6))/20304
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 3. MATEMÁTICAS CON MAXIMA 43

: / / w w w :
htttp : / / w t t
h ttpp
70 10

h tp
f(x) s1(x)
(73*x^4-1402*x^3+8957*x^2-21152*x+15624)/420 s2(x)
discrete3 discrete3
5

h
60

0
50

-5
40

o .c c 30

o . c c -10

c c c c
-15

n .
o n.co .c 20

i o n . o . c -20

10

c
a cio n . c -25

io 0

f o r m a
-30

p m
-10 -35

r
0 2 4 6 8 10 0 2 4 6 8 10

.
a)
e d pfo b)

w w .ed
Figura 3.5: Interpolación: a) lineal y de Lagrange; b) Splines cúbicos.

p : / / w w w p :
httttp://w t t
h ttp
h
(%i16) s2(z):=’’%$
(%i17) map(s2,[7.3,25/7,%pi]), numer;
(%o17) [1.595228723404633, 2.881415315197325,
h
o .c c 2.076658794432381]

o . c c
n .c . c c n . c .c c
Con esto hemos obtenido dos interpoladores distintos por el método de los splines cúbicos; con

o n.co o
el siguiente código pedimos su representación gráfica, cuyo resultado se observa en el apartado b)
de la Figura 3.5.
c i
a cioo n . c
io r m
(%i18) plot2d([’(s1(x)),’(s2(x)),[discrete,datos]],[x,0,10],

f o a
m
[gnuplot_curve_styles,
["with lines",
. e p
d pfo r
w w .ed
"with lines",
"with points pointsize 3"]])$

p : / / w w w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Capı́tulo 4
n . c . c c
o n.co c i
a cioo n . c o
io Maxima como herramienta f o r m a
p r m
pedagógica w.eddpfo
/ w w w . e
t t p :/ /ww t t p :
h ttp:/
En los últimos tiempos se promueve el uso de las tecnologı́as informáticas en todos los niveles h ttp
h
de la enseñanza. Centrándonos en los sistemas de cálculo simbólico, se pueden citar algunas ideas
que, como todas las ideas, son por naturaleza opinables y sujetas a múltiples matices.
h
o .c c Las ventajas:

o . c c
n . c . c c n . c .c c
Permite experimentar directamente sobre modelos reales, de mayor dificultad matemática,
evitando la dispersión de esfuerzos en cálculos tediosos.
o n.co c i
a cioo n . c o
Hay sesiones con los alumnos en los que se desea trabajar más el concepto que las habilidades
io manipulativas.

f o r m a
p
d pfo r m
El alumno aprenderá más rápidamente a utilizarlo si asiste a explicaciones donde el profesor
e
.
lo usa junto con un cañón proyector.
w .ed
/ / w w
Ayuda a interpretar los aspectos geométricos de los fenómenos bajo estudio; los gráficos son
w
: w
inmediatos, al contrario que cuando se hacen a mano en la pizarra.
p p :
httttp://w
Promoción del trabajo creativo frente al rutinario. t t
h ttp
h
La licencia libre de Maxima permite que los alumnos puedan disponer de él en casa; pudiendo
diseñarse nuevas formas de trabajo personal. h
. c
o .cc c .
o .cc c
Puede fomentar la colaboración entre profesionales de la educación. Es bueno crear equipos
c
que compartan experiencias educativas; lo que a uno se le está escapando, otro lo ve claro.

n . c
o n.co o n . c o
Al disponer Maxima de un lenguaje muy sencillo, el alumno que tenga que programar algo-

c i
a cion . c
ritmos lo puede hacer más fácil, ir al grano, sin preocuparse de declaraciones de variables,

io m
herencias de clases, crear otras estructuras de datos previas, etc.
r
fo rma
.e p
Permite más tiempo para reflexionar sobre los modelos y los resultados.
d fo
Los inconvenientes:

ww .ed p
p : / w ww
No siempre existe una disponibilidad razonable de los recursos informáticos y de hardware.
/ p :
httttp://w t t
Necesita más tiempo de dedicación por parte del profesor, no reconociéndose suficientemente
a nivel administrativo su esfuerzo adicional. h ttp
h 44
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
CAPÍTULO 4. MAXIMA COMO HERRAMIENTA PEDAGÓGICA 45

: / / w w w :
htttp : / / w
Las actividades y el proceso de enseñanza – aprendizaje deben ser diferentes a los plante-
t t
h ttpp
h tp
amientos clásicos. Idear nuevas tareas, nuevas formas y nuevos estilos.

Al profesor se le debe facilitar información sobre el software; si tiene que aprender por su
cuenta habrá rechazo, ya que verá ante sı́ un doble trabajo: aprender a utilizar el programa
h
o .c c y aprender a usarlo como herramienta pedagógica.

o . c c
n .c .c c n . c . c c
El profesor debe adquirir ciertos conocimientos mı́nimos de programación, con el fin de poder

o n.co i o c o
diseñar actividades a conveniencia y explotar las posibilidades del programa.
c
a cio n .
io Los riesgos:

f o r m a
p r m
Evitar convertir una clase de Matemáticas en una clase de Maxima. Los errores sintácticos

e d pfo
posible. .
frenan la marcha de la clase; es imprescindible que los alumnos tengan que escribir lo menos

w .ed
/ / w w w
Evitar que el alumno abandone sus esfuerzos por adquirir habilidades y automatismos ma-

p : w p :
httttp://w t
nuales.

Riesgo de pérdida del sentido crı́tico: fe ciega en los resultados del ordenador.
t
h ttp
h
Los entornos gráficos pueden dispersar la atención del alumno (menús, opciones, botones,
ventanas, más ventanas). El entorno de texto puede ayudar a centrar la atención.
h
o .c c . c c
No pretender que esta sea la gran revolución de la pedagogı́a matemática. Maxima será útil
o
n .c . c c n . c .c c
en algunos casos, e inútil en otros. No forzar situaciones, pero hay contextos que lo piden a

o n.co gritos.
c i
a cioo n . c o
io f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Capı́tulo 5
n . c . c c
o n.co c i
a cioo n . c o
io Programación f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
: w
A diferencia de los programas de Matemáticas privativos, cuyo código es cerrado e inaccesible
p p :
httttp://w t t
para el usuario, Maxima se puede programar a dos niveles: en el lenguaje propio de Maxima, que
es muy sencillo, y al que dedicaremos la próxima sección, y en el lenguaje en el que está diseñado h ttp
h
todo el sistema, Lisp, al que dedicaremos algunos párrafos en la segunda sección de este capı́tulo.
h
o .c c
5.1. Nivel Maxima
o . c c
n . c . c c n . c .c c
Esencialmente, programar consiste en escribir secuencialmente un grupo de sentencias sintácti-

o n.co c i
a cioo n . c o
camente correctas que el intérprete pueda leer y luego ejecutar; la manera más sencilla de empa-
quetar varias sentencias es mediante paréntesis, siendo el resultado del programa la salida de la

io última sentencia:

f o r m a
(%i1) (a:3, b:6, a+b);

e p
d pfo r m
(%o1)
(%i2) a; .
w .ed
9

(%o2)
/ / w w w
3
(%i3) b;
p : w p :
httttp://w t t
(%o3) 6
Como se ve en las salidas %o2 y %o3, este método conlleva un peligro, que consiste en que h ttp
h
podemos alterar desapercibidamente valores de variables que quizás se estén utilizando en otras
partes de la sesión actual. La solución pasa por declarar variables localmente, cuya existencia no
h
se extiende más allá de la duración del programa, mediante el uso de bloques; el siguiente ejemplo

. c
o .cc c . c c
muestra el mismo cálculo anterior declarando c y d locales, además se ve cómo es posible asignarles
o .cc
n . c
o n.co o n .
valores a las variables en el momento de crearlas:
c o
(%i4) block([c,d:6],
c i
a cion . c
io
c:3,
c+d );
r
fo rmam
(%o4)
(%i5) c;
.e d p fo
9

(%o5)
(%i6) d;
ww .ed p c

(%o6)
p : / / w ww d
p :
httttp://w
A la hora de hacer un programa, lo habitual es empaquetarlo como cuerpo de una función, de
t t
h ttp
h 46
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w
CAPÍTULO 5. PROGRAMACIÓN w .ed 47

: / / w w w :
htttp : / / w
forma que sea sencillo utilizar el código escrito tantas veces como sea necesario sin más que escribir
t t
h ttpp
h tp
el nombre de la función con los argumentos necesarios; la estructura de la definición de una función
necesita el uso del operador :=
f(<arg1>,<arg2>,...):=<expr>
h
o .c c . c c
donde <expr> suele ser una única sentencia o un bloque con variables locales; véanse los si-
o
n .c .c c
guientes ejemplos:
n . c . c c
o n.co c
(%i7) loga(x,a):= ev(log(x) / log(a), numer) $
i
a cioo n . c o
io
(%i8) loga(7, 4);
(%o8)
o r
1.403677461028802
f m a
(%i9) fact(n):=block([prod:1],

e p
d pfo r m
.
for k:1 thru n do prod:prod*k,
prod )$
w w .ed
(%i10) fact(45);

: / / w w w
(%o10) 119622220865480194561963161495657715064383733760000000000
p p :
httttp://w
En el primer caso (loga) se definen los logaritmos en base arbitraria (Maxima sólo tiene de-
finidos los naturales); además, previendo que sólo los vamos a necesitar en su forma numérica,
t t
h ttp
h
solicitamos que nos los evalúe siempre en formato decimal. En el segundo caso (fact) hacemos uso
de un bucle para calcular factoriales. Esta última función podrı́a haberse escrito recursivamente
h
mediante un sencillo condicional,

o .c c
(%i11) fact2(n):= if n=1 then 1
o . c c
n .c . c c else n*fact2(n-1) $
n . c .c c
o n.co (%i12) fact2(45);
c i
a cioo n . c o
io
(%o12) 119622220865480194561963161495657715064383733760000000000
O más fácil todavı́a, :-),
f o r m a
(%i13) 45!;
e p
d pfo r m
.
w .ed
(%o13) 119622220865480194561963161495657715064383733760000000000

/ w w w
Acabamos de ver dos estructuras de control de flujo comunes a todos los lenguajes de progra-
/
p : w
mación, las sentencias if-then-else y los bucles for. En cuanto a las primeras, puede ser de
p :
httttp://w
utilidad la siguiente tabla de operadores relacionales
t t
h ttp
h =
#
>
...igual que...
...diferente de...
...mayor que...
h
. c
o .ccc <
. c
o .cc c
...menor que...
...mayor o igual que...

n .c
o n.co
>=
<=
o n . c
...menor o igual que...
o
c i
a cion . c
io
Los operadores lógicos que frecuentemente se utilizarán con las relaciones anteriores son and,
or y not, con sus significados obvios.
r
fo rmam
.e d p
(%i14) makelist(is(log(x)<x-1), x, [0.9,1,1.1]);
fo
(%o14)

ww .ed p
[true, false, true]
(%i15) if sin(4)< 9/10 and 2^2 = 4 then 1 else -1 ;
(%o15)

p : / / w ww 1

p :
httttp://w t
(%i16) if sin(4)< -9/10 and 2^2 = 4 then 1 else -1 ;
(%o16) - 1
t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w
CAPÍTULO 5. PROGRAMACIÓN w .ed 48

: / / w w w :
htttp : / / w
Se ilustra en el ejemplo anterior (%i14) cómo se evalúa con la función is el valor de verdad de
t t
h ttpp
h tp
una expresión relacional ante la ausencia de un condicional o de un operador lógico; la siguiente
secuencia aclara algo más las cosas:
(%i17) sin(4)< 9/10 ;
h
o .c c(%o17)
9

o . c c
c
sin(4) < --

n .c .c 10
n . c . c c
o n.co (%i18) is(sin(4)< 9/10);
c i
a cioo n . c o
io
(%o18) true

f o r m a
Pero ante la presencia de un operador lógico o una sentencia condicional, is ya no es necesario:

e
(%i19) sin(4)< 9/10 and 2^2 = 4; p
d pfo r m
(%o19) .
w .ed
true

/ / w
(%i20) if sin(4)< 9/10 then 1;
w w
(%o20)
p : w 1
p :
httttp://w
En cuanto a los bucles, for es muy versátil; tiene las siguientes variantes:
t t
h ttp
h
for <var>:<val1> step <val2> thru <val3> do <expr>
for <var>:<val1> step <val2> while <cond> do <expr>
for <var>:<val1> step <val2> unless <cond> do <expr>
h
o .c c Algunos ejemplos que se explican por sı́ solos:
o . c c
n .c . c c
(%i21) for z:-5 while z+2<0 do print(z) ;
n . c .c c
o n.co - 5
- 4
c i
a cioo n . c o
io - 3

f o r m a
(%o21)
(%i22)
e p
done

d pfo r m
for z:-5 unless z+2>0 do print(z) ;
- 5
.
w .ed
- 4

/ / w w w
- 3

p : w p :
httttp://w t t
- 2
(%o22) done
h ttp
(%i23)
1
3.375
h
for cont:1 thru 3 step 0.5 do (var: cont^3, print(var)) ;
h
. c
o .ccc8.0
15.625
. c
o .cc c
n .c
o n.co
27.0

o n . c o
(%o23)
(%i24) [cont, var];
done
c i
a cion . c
io (%o24)
r m
[cont, 27.0]

fo rma
.e d p
Véase en este último resultado cómo la variable cont no queda con valor ninguno asignado,

fo
mientras que var sı́; la razón es que cont es local al bucle, expirando cuando éste termina.

w .ed p
Otra variante de for es cuando el contador recorre los valores de una lista; su forma es
w
p : / / w ww
for <var> in <lista> do <expr>

p :
httttp://w t t
y un ejemplo:
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
CAPÍTULO 5. PROGRAMACIÓN
w w .ed 49

: / / w w w :
htttp : / / w t t
h ttpp
h tp
(%i25) for z in [sin(x), exp(x), x^(3/4)] do print(diff(z,x)) $
cos(x)

%e
x h
o .c c 3
------
o . c c
n .c .c c 1/4
n . c . c c
o n.co 4 x
c i
a cioo n . c o
io f o m
Cuando se hace un programa, lo habitual es escribir el código con un editor de texto y almacenar-
r a
lo en un archivo con extensión mac. Una vez dentro de Maxima, la instrucción load("ruta/fichero.mac")$

p
d pfo r m
leerá las funciones escritas en él y las cargará en la menmoria, listas para ser utilizadas.

e
.
Si alguna de las funciones definidas en el fichero fichero.mac contiene algún error, devolviéndo-
w .ed
nos un resultado incorrecto, Maxima dispone del modo de ejecución de depurado (debugmode), que

/ w w w
ejecuta el código paso a paso, pudiendo el programador chequear interactivamente el estado de las
/
p : w
variables o asignarles valores arbitrariamente. Supongamos el siguiente contenido de cierto fichero
p :
prueba.mac
httttp://w t t
h ttp
h
1: foo(y) :=
2: block ([u:y^2],
3: u: u+3,
h
o .c c
4:
5:
u: u^2,
u);
o . c c
n .c . c c n . c .c c
o n.co o
Ahora, la siguiente sesión nos permite analizar los valores de las variables en cierto punto de la
ejecución de la función:
c i
a cioo n . c
io (%o26)
f
prueba.mac
o r m
(%i26) load("prueba.mac"); /* cargamos fichero */
a
(%i27) :break foo 3 p
d pfo r m
/* punto de ruptura al final de lı́nea 3*/
e
.
w .ed
Bkpt 0 for foo (in prueba.mac line 4)
(%i27) foo(2);

/ / w w/* llamada a función */

w
: :
Bkpt 0:(prueba.mac 4)

p w p
httttp://w t t
prueba.mac:4:: /* se detiene al final de lı́nea 4 */
(dbm:1) u; /* ¿valor de u? */
h ttp
h h
7
(dbm:1) y; /* ¿valor de y? */
2

. c
o .ccc(dbm:1) u: 1000;
1000
/* cambio valor de u */

. c
o .cc c
n .c
o n.co
(dbm:1) :continue /* continúa ejecución */

o n . c o
(%o27) 1000000

c i
a cion . c
io Para más información tecléese ? depura.

r
fo rmam
5.2. Nivel Lisp
.e d p fo
ww .ed p
A veces se presentan circunstancias en las que es mejor hacer programas para Maxima directa-

p : / / w ww
mente en Lisp; tal es el caso de las funciones que no requieran de mucho procesamiento simbólico,

p :
httttp://w t
como funciones de cálculo numérico o la creación de nuevas estructuras de datos.
Sin dar por hecho que el lector conoce el lenguaje de programación Lisp, nos limitaremos a dar t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w
CAPÍTULO 5. PROGRAMACIÓN w .ed 50

: / / w w w :
htttp : / / w
unos breves esbozos. Empecemos por ver cómo almacena Maxima internamente las expresiones
t t
h ttpp
h tp
matemáticas como listas Lisp:
(%i1) 3/4;
3
h
o .c c(%o1) -

o . c c
c
4

n .c .c (%i2) :lisp $%o1


n . c . c c
o n.co ((RAT SIMP) 3 4)
c i
a cioo n . c o
io
(%i2) :lisp ($num $%o1)
3
f o r m a
p r m
La expresión 34 se almacena internamente como la lista ((RAT SIMP) 3 4). Al entrar en modo

e d pfo
.
Lisp mediante el sı́mbolo :lisp le estamos pidiendo a Maxima que nos devuelva la expresión %o1;
w .ed
la razón por la que se antepone el sı́mbolo de dólar es que desde Lisp, los objetos de Maxima,

/ w w w
tanto variables como nombres de funciones, llevan este prefijo. En la segunda instrucción que
/
p : w
introducimos a nivel Lisp, le indicamos que aplique a la fracción la función de Maxima num, que
p :
httttp://w
devuelve el numerador de una fracción.
Del mismo modo que desde el nivel de Lisp ejecutamos una instrucción de Maxima, al nivel t t
h ttp
h
de Maxima también se pueden ejecutar funciones de Lisp. Como ejemplo, veamos qué pasa con la
función de redondeo, la cual no existe en Maxima: h
o .c c
(%i3) round(4.897);
(%o3) round(4.897)
o . c c
n .c . c c n . c .c c
Pero sı́ hay una función en Lisp que realiza este cálculo; si queremos que Maxima la invoque,
o n.co c i o . c o
sólo necesitamos llamarla con el prefijo ?, tal como indica este ejemplo:
a cio n
io (%i4) ?round(4.897);
(%o4)
f o r5m a
e p
d pfo r m
siones simbólicas: .
A efectos de saciar nuestra curiosidad, veamos cómo se almacenan internamente otras expre-

w .ed
(%i5) x+y*2;
/ / w w w
p : w p :
httttp://w t
(%o5) 2 y + x
(%i6) [1,2];
(%o6) [1, 2]
t
h ttp
h
(%i7) :lisp $%o5
((MPLUS SIMP) $X ((MTIMES SIMP) 2 $Y))
h
. c
o .ccc(%i7) :lisp $%o6
((MLIST SIMP) 1 2)
. c
o .cc c
n .c
o n.co o n . c
Para terminar, un ejemplo de cómo definir a nivel de maxima una función de redondeo,
o
(%i8) :lisp (defun $redondea (x) (round x))
c i
a cion . c
io $REDONDEA
(%i9) redondea(4.7777); r
fo rmam
(%o9)

.e d p
5
fo
w .ed p
Se ha hecho un gran esfuerzo para que Maxima sea lo más universal posible en cuanto a
w
entornos Common Lisp, de tal manera que en la actualidad Maxima funciona perfectamente con

: / / w ww
compiladores libres como clisp, gcl, cmucl o sbcl.
p p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
: / / w w w :
htttp : / / w t t
h ttpp
h tp h
o . c c o . c c
n . c .c c
Apéndice A
n . c . c c
o n.co c i
a cioo n . c o
io Ejemplos de programación f o r m a
e p
d pfo r m
.
w .ed
/ / w w w
/*
p : w
COPYRIGHT NOTICE
p :
httttp://w
Copyright (C) 2006 Mario Rodriguez Riotorto t t
h ttp
h
This program is free software; you can redistribute
it and/or modify it under the terms of the
h
o .c c
GNU General Public License as published by
the Free Software Foundation; either version 2
o . c c
n . c . c c . c
of the License, or (at your option) any later version.

n .c c
o n.co c i o
This program is distributed in the hope that it

a cio n . c o
io will be useful, but WITHOUT ANY WARRANTY;

o r m a
without even the implied warranty of MERCHANTABILITY

f
e p
d pfo r m
or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details at
.
w .ed
http://www.gnu.org/copyleft/gpl.html
*/

/ / w w w
p : w p :
/*
httttp://wINTRODUCCION
Ejemplos de programacion de funciones orientadas t t
h ttp
h
a la docencia.

En los comentarios se ha evitado el uso de acentos


h
. c
o .cc c
y caracteres especiales, a fin de evitar errores
de lectura en plataformas con diferentes
. c
o .cc c
n . c
o n.co
codificaciones de las fuentes.

o n . c o
c i
a cion
Este conjunto de funciones esta almacenado en el
. c
io r m
fichero cadiz.mac; para cargar en memoria el

fo rma
paquete, ejecutese desde Maxima

.e d p fo
p
load("ruta_a/cadiz.mac");

ww .ed
: / / w ww
Para comentarios, sugerencias y aclaraciones,
mario ARROBA edu PUNTO xunta PUNTO es

p p :
httttp://w t t
*/

h ttp
h 51
h
. c
o .cc c . c
o .cc c
n . c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
APÉNDICE A. EJEMPLOS DE PROGRAMACIÓN 52

: / / w w w :
htttp : / / w
/* Transformaciones de la funcion seno. Opciones: */
t t
h ttpp
h tp
/* ’amp: amplitud */
/* ’fase: fase
/* ’frec: frecuencia
/* ’desp: desplazamiento vertical
*/
*/
*/
h
o .c c/* Las opciones se separan por comas y se esta- */

o . c c
c c
/* blecen con el formato: */

n .c
o n.co .c /* opcion = valor

o n .
*/
c o . c
/* Ejemplos de uso:
/* seno(amp=4);
c i
a cio
*/

n
*/
. c
io /*
/*
seno(frec=2*%pi/3, amp=5);

f o r m a
seno(frec=%pi/2, amp=5, fase=5, desp=6);
*/
*/
/* seno();

e p
d pfo r m */
seno([select]):=
.
w .ed
block([options, defaults, aux, am, fa, fr, dv, ymin, ymax],

/ w w w
/* nombres de opciones y sus valores por defecto */

/
: w
options : [’amp, ’fase, ’frec, ’desp],
p p :
httttp://w t t
defaults : [ 1, 0, 1, 0 ],
/* actualiza opciones del usuario */
h ttp
h
for i in select do(
aux: ?position(lhs(i),options),
if numberp(aux) and aux <= length(options) and aux >= 1
h
c c
then defaults[aux]: rhs(i)),

c o .c c c o . c c
. .
/* actualiza variables locales */

n
o n.co . c am: defaults[1], /* amplitud */

i o n c o .c
io
fa: defaults[2], /* fase */
fr: defaults[3], /* frecuencia */ c
a cio n .
r m a
dv: defaults[4], /* desplazamiento vertical */

f o
ymin: min(-10,-abs(am)+dv),
ymax: max(10,abs(am)+dv),
e p
d pfo r m
.
w .ed
/ / w
/* representa el seno y su transformada,

w w
con ’gnuplot_preamble’ se hacen los retoques

p : w p :
httttp://w t
necesarios para que aparezcan la malla, los
ejes, el titulo y las dimensiones de la
ventana grafica */ t
h ttp
h
plot2d([sin(x), dv + am * sin (fa + fr * x)], [x, -10, 10],
[gnuplot_preamble,
sconcat("set title ’Transformaciones del seno’;",
h
. c
o .ccc .
o .cc c
"set grid; set xzeroaxis lt -1; set yzeroaxis lt -1;",
c
"set arrow 1 from -10, ", dv, " to 10, ", dv, " nohead lt 2;",

n .c
o n.co
if -fa > -10 and -fa < 10

o n . c o
c i
a cion . c
then sconcat("set arrow 2 from ", -fa, ", ", ymin,
" to ", -fa, ", ", ymax, " nohead lt 2;")

io else "",
r
fo rmam
"set yrange [", ymin, ":", ymax, "]")]),

.e d p
/* muestra en terminal la funcion */

fo
print("Transformacion de la funcion sinusoidal:"),
print(" Amplitud

ww .ed p
=", am),

w ww
print(" Fase =", fa),
print("

p : / /
Frecuencia =", fr),

p :
httttp://w t t
print(" Desp. vert. =", dv),
’y = dv + am * sin (fa + fr * ’x) )$
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
APÉNDICE A. EJEMPLOS DE PROGRAMACIÓN 53

: / / w w w :
htttp : / / w
/* Definicion de la integral mediante las sumas */
t t
h ttpp
h tp
/* de Riemann. Permite seleccionar si se dibujan */
/* los rectangulos inferiores o superiores.
/* Argumentos:
/* funcion: funcion a integrar
*/
*/
*/
h
o .c c/* rango: de la forma [x,-5,10] */

o . c c
c c
/* n: numero de rectangulos */

n .c
o n.co .c /* tipo: ’sup o ’inf

o n .
*/
c o . c
/* Ejemplo de uso:
/* riemann(u^3,[u,0,5],10,’inf);
c i
a cio n
*/
*/
. c
io /*
riemann(funcion,rango,n,tipo):=
f o r m
riemann(exp(-v^2),[v,-2,2],10,’sup);

a
*/

p
d pfo r m
block([abscisas,ordenadas,d,numer:true,ratprint:false,int,suma],

e
.
/* variables globales numer y ratprint se modifican temporalmente */

w .ed
d: (rango[3]-rango[2])/n,

/ w w w
if not member(tipo,[’sup,’inf])

/
: w
then error("Tipo de sumas incorrecto: debe ser ’sup o ’inf"),
p p :
httttp://w t t
abscisas: makelist(rango[2]+k*d-d/2,k,1,n),
if tipo = ’inf
h ttp
h
then ordenadas: makelist([k, min(ev(funcion,rango[1]=k-d/2),ev(funcion,rango[1]=k+d/2))],
k,abscisas)
else ordenadas: makelist([k, max(ev(funcion,rango[1]=k-d/2),ev(funcion,rango[1]=k+d/2))],
h
c c
k,abscisas),

c o .c c
plot2d([[discrete,ordenadas],funcion],rango,

c o . c c
. .
[gnuplot_curve_styles,

n
o n.co . c n
["with boxes fs solid 0.3 border -1",

i o c o .c
io
[gnuplot_preamble, c
"with lines lt 3 lw 2"]],

a cio n .
r m a
["set title ’Sumas de Riemann’; set nokey"]]),

f o
e p
d pfo r m
int: integrate(funcion,rango[1],rango[2],rango[3]),
suma: apply("+",d*makelist(k[2],k,ordenadas)),
print(""),
.
w .ed
/ / w
print("Area bajo la curva ..=", int),

w w
print("Area rectangulos ....=", suma),

p : w p :
httttp://w t
print("Diferencia (int-sum) =", int-suma),
print("") )$
t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
APÉNDICE A. EJEMPLOS DE PROGRAMACIÓN 54

: / / w w w :
htttp : / / w
/* Definicion de la integral mediante las sumas */
t t
h ttpp
h tp
/* de Riemann. Dibuja rectangulos inferiores y */
/* superiores.
/* Argumentos:
/* funcion: funcion a integrar
*/
*/
*/
h
o .c c/* rango: de la forma [x,-5,10] */

o . c c
c c
/* n: numero de rectangulos */

n .c
o n.co .c /* Ejemplo de uso:

o n .
*/
c o . c
/*
/*
riemann2(u^3,[u,0,5],10);
riemann2(sin(x)+1,[x,0,5],5);
c i
a cio
*/

n
*/
. c
io riemann2(funcion,rango,n):=

f o r m a
block([abscisas,ordenadas,d,numer:true,ratprint:false,inf,sup,int,sumasup,sumainf],

p
d pfo r m
/* variables globales numer y ratprint se modifican temporalmente */

e
.
d: (rango[3]-rango[2])/n,

w .ed
abscisas: makelist(rango[2]+k*d-d/2,k,1,n),

/ w w w
inf: makelist([k, min(ev(funcion,rango[1]=k-d/2),ev(funcion,rango[1]=k+d/2))],k,abscisas),

/
: w
sup: makelist([k, max(ev(funcion,rango[1]=k-d/2),ev(funcion,rango[1]=k+d/2))],k,abscisas),
p p :
httttp://w t t
plot2d([[discrete,sup],[discrete,inf],funcion],rango,
[gnuplot_curve_styles,
h ttp
h ["with boxes fs solid 0.3 border -1",
"with boxes fs solid 0.3 border -1",
"with lines lt 3 lw 2"]],
h
c c
[gnuplot_preamble,

c o .c c c o . c
["set title ’Sumas de Riemann’; set nokey"]]),

c
n .
o n.co . c n .
int: integrate(funcion,rango[1],rango[2],rango[3]),

i o o .c
c
sumasup: apply("+",d*makelist(k[2],k,sup)),

a cio n . c
io
sumainf: apply("+",d*makelist(k[2],k,inf)),
print(""),

f o r m a
e p
d pfo r m
print("Area bajo la curva ..=", int),
/* a continuacion, diferencia de las sumas superior e inferior */

.
w .ed
print("Diferencia (sup-inf) =", sumasup-sumainf),
print("") )$

/ / w w w
p : w p :
httttp://w t t
h ttp
h h
. c
o .ccc . c
o .cc c
n .c
o n.co o n . c o
c i
a cion . c
io r
fo rmam
.e d p fo
ww .ed p
p : / / w ww p :
httttp://w t t
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
APÉNDICE A. EJEMPLOS DE PROGRAMACIÓN 55

: / / w w w :
htttp : / / w
/* Genera informacion relativa al calculo de los limites. */
t t
h ttpp
h tp
/* Argumentos: */
/*
/*
/*
expr: expresion objetivo
var: nombre de la variable independiente
val: valor hacia el que tiende var
*/
*/
*/
h
o .c c/* xmin, xmax: subdominio para el grafico

o . c c
*/

c c
/* argumento opcional dir: indica si me aproximo */

n .c
o n.co .c /*

o n . c
por la izquierda (minus) o por la derecha (plus)

o . c
*/
/* Ejemplos de uso:
/* limite((z^3-z^2+5)/(z-4),z,7,5,9);
c i
a cio n . c */
*/

io /*
/*
f o r m
limite((z^3-z^2+5)/(z-4),z,7,5,9,’minus);

a
limite((z^3-z^2+5)/(z-4),z,7,5,9,’plus);
*/
*/

e p
d pfo r m
npar:6$ /* variable global: controla numero de pares de la tabla */

.
limite(expr,var,val,xmin,xmax,[dir]):=

w .ed
block([xx,yy,tab,lim,side:0],

/ w w w
/* asignando valor a side */

/
:
if length(dir) > 0
p w p :
httttp://w t t
then if dir[1] = ’minus
then side: -1
h ttp
h else if dir[1] = ’plus
then side: 1, h
c c
/* calculo de las abscisas */

c o .c c
if side # 0

c o . c c
. .
then xx: float(makelist(val+side/2^k,k,0,npar))

n
o n.co . c i o n c o .
else xx: float(append(makelist(val-1/2^k,k,0,npar),
c
io c
a cio n .
reverse(makelist(val+1/2^k,k,0,npar)))),

/* achegamento tabular */

f o r m a
e p
d pfo r m
yy: map (lambda ([u], subst(u,var,expr)), xx),
tab: transpose(matrix(append([var],xx),

.
w .ed
append([expr],yy))),
print("
print("
/ / w
Estudio del limite"),

w w
=================="),

p : w p :
httttp://w t
print(tab),

/* calculo del limite */ t


h ttp
h
if side = -1
then (lim: limit(expr,var,val,’minus),
print(float(lim)=lim),
h
. c
o .ccc print(’limit(expr,var,val,’minus)= lim) )
else if side = 1
. c
o .cc c
n .c
o n.co o n . c
then (lim: limit(expr,var,val,’plus),

o
print(float(lim)=lim),

c i
a cion . c
print(’limit(expr,var,val,’plus)= lim) )

io r
fo rmam
else (lim: limit(expr,var,val),
print(float(lim)=lim),

.e d p
print(’limit(expr,var,val)= lim) ),

fo
w .ed p
/* representacion grafica */

w
w ww
plot2d([expr,[discrete, args(rest(tab))]],[var,xmin,xmax],

p : / /[gnuplot_curve_styles,

p :
httttp://w t t
["with lines","with impulses"]]),
’fin )$
h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co
.c .cc
http://www.edpformacion.co.cc
http://www.edpformacion.co.cc
o .cc . c . c
o .cc c
n
o n.co c i o n . c o
io r m a cion
p f o r m a
. e d pfo
w w .ed
APÉNDICE A. EJEMPLOS DE PROGRAMACIÓN 56

: / / w w w :
htttp : / / w
/* Funciones para una actividade sobre transformacions no plano. */
t t
h ttpp
h tp
/* Se incluyen dos variables que contienen listas de puntos a transformar. */
/* Ejemplos de uso:
/*
/*
barco; simx(barco);
dibuja(barco, simx(barco));
*/
*/
*/
h
o .c c/* dibuja(barco, simo(barco));

o . c c */

c c
/* dibuja(barco, traslacion(barco, 6, -7)); */

n .c
o n.co .c /* dibuja(bs, simy(bs), homotecia(bs,-2));

o n . c o . c */
/*
c i
a cio n . c
dibuja(bs, simy(bs), homotecia(bs,-2), homotecia(bs,5)); */

io simx(pts):=block([trans:[]],
f o r m
/* Simetria respecto del eje de abscisas */

a
p
d pfo r m
for i in pts do trans:endcons([i[1],-i[2]],trans),

e
return(trans) )$
.
w .ed
/* Simetria respecto del eje de ordenadas */

/ w w w
simy(pts):=block([trans:[]],

/
: w
for i in pts do trans:endcons([-i[1],i[2]],trans),
p p :
httttp://w t t
return(trans) )$
/* Simetria respecto del origen de coordenadas */
h ttp
h
simo(pts):=block([trans:[]],
for i in pts do trans:endcons([-i[1],-i[2]],trans),
return(trans) )$
h
c c
/* Traslacion respecto del vector [v1,v2] */

c o .c traslacion(pts,v1,v2):=block([trans:[]],

c c o . c c
. .
for i in pts do trans:endcons([i[1]+v1,i[2]+v2],trans),

n
o n.co . c return(trans) )$

i o n c o .c
io
homotecia(pts,k):=block([trans:[]], c
/* Homotecia respecto del origen con parametro k */

a cio n .
r m a
for i in pts do trans:endcons(k*[i[1],i[2]],trans),

f o
return(trans) )$

e p
d pfo r m
/* dibuja numero arbitrario de listas de vertices */
dibuja([figs]):=
.
w .ed
apply(’plot2d,

/ / w w w
append([map(lambda ([x], [’discrete, x]), figs)],

p : w p :
httttp://w t
[[gnuplot_preamble, "set grid;set zeroaxis linetype 6"]]))$

/* Vertices de dos objetos: barco y bs */ t


h ttp
barco:
h
[[1,1],[1,3],[2,3],[2,6],[4,6],[4,3],[15,3],[12,1],[1,1]]$
bs:
h
. c
o .ccc .
o .cc c
[[64,-104],[64,-99],[61,-95],[57,-95],[55,-94],[55,-90],[72,-89],[80,-88],[77,-86],[80,-88],
c
[82,-91],[80,-88],[72,-89],[55,-90],[47,-89],[39,-87],[33,-84],[32,-81],[35,-75],[36,-69],

n .c
o n.co o n . c
[42,-69],[45,-68],[42,-69],[36,-69],[35,-67],[35,-62],[35,-60],[39,-60],[45,-61],[51,-61],

o
c i
a cion . c
[53,-65],[56,-68],[61,-70],[67,-71],[73,-70],[78,-67],[80,-64],[81,-61],[78,-58],[75,-60],
[75,-62],[78,-62],[81,-61],[81,-56],[79,-50],[75,-47],[70,-44],[62,-44],[58,-45],[53,-50],

io r
fo rmam
[52,-52],[49,-53],[48,-52],[48,-50],[49,-48],[51,-49],[52,-52],[51,-54],[51,-57],[51,-61],
[45,-61],[39,-60],[35,-60],[32,-57],[32,-52],[32,-49],[35,-45],[39,-42],[43,-41],[48,-42],

.e d p
[51,-43],[55,-47],[51,-43],[48,-42],[43,-41],[44,-38],[47,-35],[54,-16],[56,-5],[60,-11],

fo
[64,-6],[67,-12],[72,-7],[74,-14],[80,-9],[80,-16],[86,-11],[87,-17],[92,-12],[93,-21],

w .ed p
[99,-16],[100,-22],[106,-19],[107,-27],[115,-25],[110,-32],[94,-72],[91,-72],[88,-73],

w
w ww
[87,-74],[88,-76],[91,-76],[91,-79],[89,-81],[91,-79],[91,-76],[94,-77],[94,-79],[94,-77],

: / /
[91,-76],[88,-76],[87,-74],[88,-73],[91,-72],[94,-72],[97,-75],[98,-80],[97,-82],[94,-84],

p p :
httttp://w t t
[91,-85],[87,-83],[84,-80],[87,-83],[91,-85],[91,-95],[92,-102],[85,-105],[69,-106],[64,-104]]$

h ttp
h h
.c c
o .cc . c
o .cc c
n .c
o n.co n . c
http://www.edpformacion.co.cc
cio© n.co

Вам также может понравиться