Primeros pasos en Maxima (pdf)

156
Primeros pasos en Maxima Mario Rodr´ ıguez Riotorto http://riotorto.users.sourceforge.net 13 de febrero de 2015

Transcript of Primeros pasos en Maxima (pdf)

Primeros pasos en Maxima

Mario Rodrıguez Riotorto

http://riotorto.users.sourceforge.net

13 de febrero de 2015

Copyright c©2004-2011 Mario Rodrıguez Riotorto

Este documento es libre; se puede redistribuir y/o modificar bajolos terminos de la GNU General Public License tal como lo publi-ca la Free Software Foundation. Para mas detalles vease la GNUGeneral Public License en http://www.gnu.org/copyleft/gpl.html

This document is free; you can redistribute it and/or modify itunder the terms of the GNU General Public License as publishedby the Free Software Foundation. See the GNU General PublicLicense for more details athttp://www.gnu.org/copyleft/gpl.html

Indice general

1. Introduccion 3

2. Despegando con Maxima 7

2.1. Instalacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2. Una primera sesion . . . . . . . . . . . . . . . . . . . . . . . . 8

3. Numeros y sus operaciones 23

3.1. Enteros y decimales . . . . . . . . . . . . . . . . . . . . . . . 23

3.2. Numeros complejos . . . . . . . . . . . . . . . . . . . . . . . . 26

3.3. Combinatoria . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

4. Estructuras de datos 31

4.1. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.2. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.3. Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4.4. Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.5. Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

5. Algebra 53

5.1. Transformaciones simbolicas . . . . . . . . . . . . . . . . . . . 53

5.2. Ecuaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

5.3. Inecuaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

5.4. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

5.5. Patrones y reglas . . . . . . . . . . . . . . . . . . . . . . . . . 81

6. Calculo 87

6.1. Funciones matematicas . . . . . . . . . . . . . . . . . . . . . . 87

6.2. Lımites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

6.3. Derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

6.4. Integrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

6.5. Ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . . . 99

6.6. Vectores y campos vectoriales . . . . . . . . . . . . . . . . . . 107

1

2 INDICE GENERAL

7. Graficos 1117.1. El modulo ”plot” . . . . . . . . . . . . . . . . . . . . . . . . . 1117.2. El modulo ”draw” . . . . . . . . . . . . . . . . . . . . . . . . 113

8. Probabilidades y estadıstica 1218.1. Probabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218.2. Estadıstica descriptiva . . . . . . . . . . . . . . . . . . . . . . 1258.3. Estadıstica inferencial . . . . . . . . . . . . . . . . . . . . . . 129

9. Otros metodos numericos 1339.1. Interpolacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 1339.2. Ajuste por mınimos cuadrados . . . . . . . . . . . . . . . . . 1379.3. Optimizacion con restricciones . . . . . . . . . . . . . . . . . 1399.4. Programacion lineal . . . . . . . . . . . . . . . . . . . . . . . 141

10.Programando en Maxima 14310.1. Programacion a nivel de Maxima . . . . . . . . . . . . . . . . 14310.2. Programacion a nivel de Lisp . . . . . . . . . . . . . . . . . . 150

Capıtulo 1

Introduccion

Este es un manual introductorio al entorno de calculo simbolico Maxima,directo sucesor del legendario Macsyma.

El objetivo del manual es facilitar el acceso a este programa a todasaquellas personas que por vez primera se acercan a el.

Maxima es un programa cuyo objeto es la realizacion de calculos ma-tematicos, tanto simbolicos como numericos; es capaz de manipular expre-siones algebraicas y matriciales, derivar e integrar funciones, realizar diversostipos de graficos, etc.

Su nombre original fue Macsyma (MAC’s SYmbolic MAnipulation Sys-tem, donde MAC, Machine Aided Cognition, era el nombre del Laboratoryfor Computer Science del MIT durante la fase inicial del proyecto Macsy-ma). Se desarrollo en estos laboratorios a partir del ano 1969 con fondosaportados por varias agencias gubernamentales norteamericanas (NationalAeronautics and Space Administration, Office of Naval Research, U.S. De-partment of Energy y U.S. Air Force).

El concepto y la organizacion interna del programa estan basados en latesis doctoral que Joel Moses elaboro en el MIT sobre integracion simbolica.Segun Marvin Minsky, director de esta tesis, Macsyma pretendıa automati-zar las manipulaciones simbolicas que realizaban los matematicos, a fin deentender la capacidad de los ordenadores para actuar de forma inteligente.

El ano 1982 es clave. El MIT transfiere una copia de Macsyma a laempresa Symbolics Inc. para su explotacion economica, haciendo el codigopropietario, y otra al Departamento de Energıa, copia esta que sera conocidacon el nombre de DOE-Macsyma. En 1992 la version comercial de Macsymaserıa adquirida por una empresa que se llamarıa precisamente Macsyma Inc,y el programa irıa perdiendo fuelle progresivamente ante la presencia en elmercado de otros programas similares como Maple o Mathematica, amboslos dos inspirados en sus orıgenes en el propio Macsyma.

Pero ocurrieron dos historias paralelas. Desde el ano 1982, y hasta sufallecimiento en el 2001, William Schelter de la Universidad de Texas man-

3

4 CAPITULO 1. INTRODUCCION

tuvo una version de este programa adaptada al estandar Common Lisp enbase a DOE-Macsyma, la cual ya se conoce con el nombre de Maxima paradiferenciarla de la version comercial. En el ano 1998 Schelter habıa conse-guido del DOE permiso para distribuir Maxima bajo la licencia GNU-GPL(www.gnu.org); con este paso, muchas mas personas empezaron a dirigir sumirada hacia Maxima, justo en el momento en el que la version comercialestaba declinando. Actualmente, el proyecto esta siendo mantenido por ungrupo de desarrolladores originarios de varios paıses, asistidos y ayudadospor otras muchas personas interesadas en Maxima y que mantienen un caucede comunicacion a traves de la lista de correo

http://maxima.sourceforge.net/maximalist.html

Ademas, desde el ano 2006, se ha activado una lista de correos parausuarios de habla hispana en

http://lists.sourceforge.net/lists/listinfo/maxima-lang-es

Puesto que Maxima se distribuye bajo la licencia GNU-GPL, tanto elcodigo fuente como los manuales son de libre acceso a traves de la paginaweb del proyecto,

http://maxima.sourceforge.net

Uno de los aspectos mas relevantes de este programa es su naturale-za libre; la licencia GPL en la que se distribuye brinda al usuario ciertaslibertades:

libertad para utilizarlo,

libertad para modificarlo y adaptarlo a sus propias necesidades,

libertad para distribuirlo,

libertad para estudiarlo y aprender su funcionamiento.

La gratuidad del programa, junto con las libertades recien mencionadas,hacen de Maxima una formidable herramienta pedagogica, de investigaciony de calculo tecnico, accesible a todos los presupuestos, tanto institucionalescomo individuales.

No quiero terminar esta breve introduccion sin antes recordar y agradecera todo el equipo humano que ha estado y esta detras de este proyecto, desdeel comienzo de su andadura alla por los anos 70 hasta el momento actual;incluyo tambien a todas las personas que, aun no siendo desarrolladoras delprograma, colaboran haciendo uso de el, presentando y aportando continua-mente propuestas e ideas a traves de las listas de correos. Un agradecimientoespecial a Robert Dodier y James Amundson, quienes me brindaron la opor-tunidad de formar parte del equipo de desarrollo de Maxima y me abrieronlas puertas a una experiencia verdaderamente enriquecedora.

5

Finalmente, un recuerdo a William Schelter. Gracias a el disponemoshoy de un Maxima que, paradojicamente, por ser libre, no pertenece a nadiepero que es de todos.

Ferrol-A Coruna

6 CAPITULO 1. INTRODUCCION

Capıtulo 2

Despegando con Maxima

2.1. Instalacion

Maxima funciona en Windows, Mac y Linux.En Windows, la instalacion consiste en descargar el binario exe desde el

enlace correspondiente en la pagina del proyecto y ejecutarlo.En Mac, es necesario descargar el fichero con extension dmg, hacer doble

clic sobre el y arrastrar los iconos de Maxima, wxMaxima y Gnuplot a lacarpeta Aplicaciones. El proceso detallado se explica aquı:

http://www.faq-mac.com/41547/instalacion-maximawxmaxima-mac-javier-arantegui

En Linux, la mayorıa de las distribuciones tienen ficheros precompiladosen sus respectivos repositorios con las extensiones rpm o deb, segun el caso.Sin embargo, en algunas distribuciones las versiones oficiales no suelen es-tar muy actualizadas, por lo que podrıa ser recomendable proceder con lacompilacion de las fuentes, tal como se expone a continuacion.

Las siguientes indicaciones sobre la compilacion hacen referencia al sis-tema operativo Linux.

Si se quiere instalar Maxima en su estado actual de desarrollo, sera nece-sario descargar los ficheros fuente completos desde el repositorio de Source-forge y proceder posteriormente a su compilacion. Se debera tener operativoun entorno Common Lisp en la maquina (clisp, cmucl, sbcl o gcl sontodas ellas alternativas validas), ası como todos los programas que permi-tan ejecutar las instrucciones que se indican a continuacion, incluidas lasdependencias tcl-tk y gnuplot. Grosso modo, estos son los pasos a seguirpara tener Maxima operativo en el sistema1:

1. Descargar las fuentes a un directorio local siguiendo las instruccionesque se indican en el enlace al repositorio de la pagina del proyecto.

1Se supone que se trabaja con clisp, con codificacion unicode y que queremos el sistemade ayuda en ingles y espanol.

7

8 CAPITULO 2. DESPEGANDO CON MAXIMA

2. Acceder a la carpeta local de nombre maxima y ejecutar las instruccio-nes

./bootstrap

./configure --enable-clisp --enable-lang-es-utf8

make

make check

sudo make install

make clean

3. Para ejecutar Maxima desde la lınea de comandos (Figura 2.1) se de-bera escribir

maxima

si se quiere trabajar con la interfaz grafica (Figura 2.2), teclear

xmaxima

Otro entorno grafico es Wxmaxima2 (Figura 2.3), que se distribuye con-juntamente con los ejecutables para Windows y Mac. En Linux, una vezinstalado Maxima, se podra instalar este entorno separadamente.

Una cuarta alternativa, que resulta muy vistosa por hacer uso de TEX,es la de ejecutar Maxima desde el editor Texmacs3 (Figura 2.4).

Emacs es un editor clasico en sistemas Unix. Aunque hay varias formasde ejecutar Maxima desde Emacs, con el modo Imaxima4 (Figura 2.5) seconsigue que los resultados esten formateados en TEX.

Tambien se han desarrollado en los ultimos anos entornos web para Ma-xima5.

2.2. Una primera sesion

En esta sesion se intenta realizar un primer acercamiento al programa afin de familiarizarse con el estilo operativo de Maxima, dejando sus habili-dades matematicas para mas adelante.

Una vez accedemos a Maxima, lo primero que vamos a ver sera la si-guiente informacion:

Maxima 5.25.0 http://maxima.sourceforge.net

using Lisp CLISP 2.48 (2009-07-28)

2http://wxmaxima.sourceforge.net3http://www.texmacs.org4http://members3.jcom.home.ne.jp/imaxima5http://maxima.sourceforge.net/relatedprojects.shtml

2.2. UNA PRIMERA SESION 9

Figura 2.1: Maxima desde la lınea de comandos.

Distributed under the GNU Public License. See the file COPYING.

Dedicated to the memory of William Schelter.

The function bug_report() provides bug reporting information.

(%i1)

En primer lugar nos informa sobre la version de Maxima que se esta eje-cutando y la URL del proyecto, a continuacion indica que entorno Lispesta dandole soporte al programa y la nota legal sobre la licencia, por su-puesto GNU-GPL. Finaliza con un recordatorio a Schelter y como debemosproceder si encontramos un fallo en el programa, ayudando ası a su mejora.Tras esta cabecera, muy importante, aparece el indicador (%i1) esperandonuestra primera pregunta (i de input). Si queremos calcular una simple su-ma tecleamos la operacion deseada seguida de un punto y coma (;) y una

10 CAPITULO 2. DESPEGANDO CON MAXIMA

Figura 2.2: Xmaxima, el entorno grafico basado en tcl-tk.

pulsacion de la tecla retorno

(%i1) 45 + 23;

( %o1) 68

(%i2)

Vemos que el resultado de la suma esta etiquetado con el sımbolo (%o1)

indicando que es la salida correspondiente a la primera entrada (o de output).A continuacion (%i2) indica que Maxima espera nuestra segunda instruc-cion.

El punto y coma actua tambien como un separador cuando escribimosvarias instrucciones en un mismo renglon. Nuestra siguiente operacion con-sistira en asignar el valor 34578 a la variable x y el 984003 a la y, solicitandoluego su producto,

2.2. UNA PRIMERA SESION 11

Figura 2.3: Wxmaxima, el entorno grafico basado en wxwidgets.

(%i2) x:34578; y:984003; x*y;

( %o2) 34578

( %o3) 984003

( %o4) 34024855734

conviene prestar atencion al hecho de que la asignacion de un valor a unavariable se hace con los dos puntos (:), no con el signo de igualdad, que sereserva para las ecuaciones.

Es posible que no deseemos los resultados intermedios que Maxima vacalculando o, como en este caso, las asignaciones a las variables que va

12 CAPITULO 2. DESPEGANDO CON MAXIMA

Figura 2.4: Maxima desde Texmacs.

haciendo; en tales situaciones debe hacerse uso del delimitador $, que nodevuelve los resultados que va calculando. Repitiendo el calculo de la forma

(%i5) x:34578$ y:984003$ x*y;

( %o7) 34024855734

podemos conseguir una salida mas limpia. Las asignaciones a variables semantienen activas mientras dure la sesion con Maxima, por lo que podemosrestar las variables x e y anteriores

(%i8) x-y;

( %o13) −949425

Esto tiene un riesgo; si queremos resolver la ecuacion x2 − 3x+ 1 = 0,

2.2. UNA PRIMERA SESION 13

Figura 2.5: Maxima en Emacs.

(%i9) solve(x^2-3*x+1=0,x);

A number was found where a variable was expected -‘solve’

-- an error. Quitting. To debug this try debugmode(true);

nos devuelve un mensaje de error, ya que donde se supone que hay unaincognita, lo que realmente encuentra es un numero, en este caso 34578.Hay dos formas de resolver esta situacion; la primera consiste en utilizar eloperador comilla simple (’), que evita la evaluacion de las variables:

(%i9) solve(’x^2-3*’x+1=0,’x);

( %o9)

[x = −

√5− 3

2, x =

√5 + 3

2

]

14 CAPITULO 2. DESPEGANDO CON MAXIMA

(%i10) x;

( %o10) 34578

como se ve, x mantiene su valor original.La segunda forma de evitar este problema consiste en vaciar el contenido

de la variable x mediante la funcion kill,

(%i11) kill(x)$

(%i12) solve(x^2-3*x+1=0,x);

( %o12)

[x = −

√5− 3

2, x =

√5 + 3

2

](%i13) x;

( %o13) x

en este caso, x ha perdido su valor.Las etiquetas (%in) y (%on), siendo n un numero entero, pueden ser

utilizadas a lo largo de una sesion a fin de evitar tener que volver a escribirexpresiones; ası, si queremos calcular el cociente xy

x−y , con x = 34578 yy = 984003, podemos aprovechar los resultados (%o7) y (%o8) y hacer

(%i14) %o7/%o8;

( %o14) −11341618578

316475

Las etiquetas que indican las entradas y salidas pueden ser modificadasa voluntad haciendo uso de las variables inchar y outchar,

(%i15) inchar;

( %o15) %i

(%i16) outchar;

( %o16) %o

(%i17) inchar: ’menda;

( %o17) menda

(menda18) outchar: ’lerenda;

2.2. UNA PRIMERA SESION 15

(lerenda18) lerenda

(menda19) 2+6;

(lerenda19) 8

(menda20) inchar:’%i$ outchar:’%o$

(%i22)

Al final se han restaurado los valores por defecto.En caso de que se pretenda realizar nuevamente un calculo ya indicado

deberan escribirse dos comillas simples (’’), no comilla doble, junto con laetiqueta de la instruccion deseada

(%i23) ’’%i8;

( %o23) x− 984003

Observese que al haber dejado a x sin valor numerico, ahora el resultadoes otro. Cuando se quiera hacer referencia al ultimo resultado calculado porMaxima puede ser mas sencillo hacer uso del sımbolo %, de forma que siqueremos restarle la x a la ultima expresion podemos hacer

(%i24) %-x;

( %o24) −984003

Ciertas constantes matematicas de uso frecuente tienen un sımbolo es-pecial en Maxima: la base de los logaritmos naturales (e), el cociente entrela longitud de una circunferencia y su diametro (π), la unidad imaginaria(i =

√−1), la constante de Euler-Mascheroni (γ = −

∫∞0 e−x lnxdx) y la

razon aurea (φ = 1+√

52 ), se representaran por %e, %pi, %i, %gamma y %phi,

respectivamente.Es muy sencillo solicitar a Maxima que nos informe sobre alguna fun-

cion de su lenguaje; la tecnica nos servira para ampliar informacion sobrecualquier instruccion a la que se haga referencia en este manual, por ejemplo,

(%i25) describe(sqrt);

-- Funcion: sqrt (<x>)

Raız cuadrada de <x>. Se representa internamente por ‘<x>^(1/2)’.

Vease tambien ‘rootscontract’.

Si la variable ‘radexpand’ vale ‘true’ hara que las raıces

16 CAPITULO 2. DESPEGANDO CON MAXIMA

‘n’-esimas de los factores de un producto que sean potencias de

‘n’ sean extraıdas del radical; por ejemplo, ‘sqrt(16*x^2)’ se

convertira en ‘4*x’ solo si ‘radexpand’ vale ‘true’.

There are also some inexact matches for ‘sqrt’.

Try ‘?? sqrt’ to see them.

(%o25) true

nos instruye sobre la utilizacion de la funcion sqrt. Alternativamente, sepuede utilizar para el mismo fin el operador interrogacion (?),

(%i26) ? sqrt

-- Funcion: sqrt (<x>)

Raız cuadrada de <x>. Se representa internamente por ‘<x>^(1/2)’.

Vease tambien ‘rootscontract’.

Si la variable ‘radexpand’ vale ‘true’ hara que las raıces

‘n’-esimas de los factores de un producto que sean potencias de

‘n’ sean extraıdas del radical; por ejemplo, ‘sqrt(16*x^2)’ se

convertira en ‘4*x’ solo si ‘radexpand’ vale ‘true’.

There are also some inexact matches for ‘sqrt’.

Try ‘?? sqrt’ to see them.

(%o26) true

Cuando no conocemos el nombre completo de la funcion sobre la quenecesitamos informacion podremos utilizar el operador de doble interroga-cion (??) que nos hace la busqueda de funciones que contienen en su nombrecierta subcadena,

(%i27) ?? sqrt

0: isqrt (Operadores generales)

1: sqrt (Operadores generales)

2: sqrtdenest (Funciones y variables para simplification)

3: sqrtdispflag (Operadores generales)

Enter space-separated numbers, ‘all’ or ‘none’: 3

-- Variable opcional: sqrtdispflag

Valor por defecto: ‘true’

2.2. UNA PRIMERA SESION 17

Si ‘sqrtdispflag’ vale ‘false’, hara que ‘sqrt’ se muestre con el

exponente 1/2.

(%o27) true

Inicialmente muestra un sencillo menu con las funciones que contienen lasubcadena sqrt y en el que debemos seleccionar que informacion concretadeseamos; en esta ocasion se opto por 3 que es el numero asociado a lavariable opcional sqrtdispflag.

A fin de no perder los resultados de una sesion con Maxima, quizas conel objeto de continuar el trabajo en proximas jornadas, podemos guardaren un archivo aquellos valores que nos puedan interesar; supongamos quenecesitamos almacenar el contenido de la variable y, tal como lo definimosen la entrada (%i5), ası como el resultado de la salida (%o9), junto con lainstruccion que la genero, la entrada (%i9),

(%i28) save("mi.sesion",y,resultado=%o9,ecuacion=%i9)$

Vease que el primer argumento de save es el nombre del archivo, juntocon su ruta si se considera necesario, que la variable y se escribe tal cual,pero que las referencias de las entradas y salidas deben ir acompanadas deun nombre que las haga posteriormente reconocibles.

Por ultimo, la forma correcta de abandonar la sesion de Maxima esmediante

(%i29) quit();

Abramos ahora una nueva sesion con Maxima y carguemos en memorialos resultados de la anterior sesion,

(%i1) load("mi.sesion")$

(%i2) y;

( %o2) 984003

(%i3) ecuacion;

( %o3) solve(x2 − 3x+ 1 = 0, x

)(%i4) resultado;

( %o4)

[x = −

√5− 3

2, x =

√5 + 3

2

]Si ahora quisieramos recalcular las soluciones de la ecuacion, modificando-

la previamente de manera que el coeficiente de primer grado se sustituyesepor otro numero, simplemente harıamos

18 CAPITULO 2. DESPEGANDO CON MAXIMA

(%i5) subst(5,3,ecuacion);

( %o5) solve(x2 − 5x+ 1 = 0, x

)(%i6) ev(%, nouns);

( %o6)

[x = −

√21− 5

2, x =

√21 + 5

2

]

La funcion save guarda las expresiones matematicas en formato Lisp,pero a nivel de usuario quizas sea mas claro almacenarlas en el propio len-guaje de Maxima; si tal es el caso, mejor sera el uso de stringout, cuyoresultado sera un fichero que tambien se podra leer mediante load.

Continuemos experimentando con esta segunda sesion de Maxima queacabamos de iniciar.

Maxima esta escrito en Lisp, por lo que ya se puede intuir su potencia ala hora de trabajar con listas; en el siguiente dialogo, el texto escrito entrelas marcas /* y */ son comentarios que no afectan a los calculos,

(%i7) /* Se le asigna a la variable x una lista */

x: [cos(%pi), 4/16, [a, b], (-1)^3, integrate(u^2,u)];

( %o7)

[−1,

1

4, [a, b] ,−1,

u3

3

](%i8) /* Se calcula el numero de elementos del ultimo resultado */

length(%);

( %o8) 5

(%i9) /* Se transforma una lista en conjunto, */

/* eliminando redundancias. Los */

/* corchetes se transforman en llaves */

setify(x);

( %o9)

{−1,

1

4, [a, b] ,

u3

3

}Vemos a continuacion como se procede a la hora de hacer sustituciones

en una expresion,

(%i10) /* Sustituciones a hacer en x */

x, u=2, a=c;

2.2. UNA PRIMERA SESION 19

( %o10)

[−1,

1

4, [c, b] ,−1,

8

3

](%i11) /* Forma alternativa para hacer lo mismo */

subst([u=2, a=c],x);

( %o11)

[−1,

1

4, [c, b] ,−1,

8

3

](%i12) %o7[5], u=[1,2,3];

( %o12)

[1

3,8

3, 9

]En esta ultima entrada, %o7 hace referencia al septimo resultado devuelto

por Maxima, que es la lista guardada en la variable x, de modo que %o7[5]

es el quinto elemento de esta lista, por lo que esta expresion es equivalentea a x[5]; despues, igualando u a la lista [1,2,3] este quinto elemento dela lista es sustituıdo sucesivamente por las tres cantidades. Tal como ya seha comentado, Maxima utiliza los dos puntos (:) para hacer asignaciones avariables, mientras que el sımbolo de igualdad se reserva para la construccionde ecuaciones.

Un aspecto a tener en cuenta es que el comportamiento de Maximaesta controlado por los valores que se le asignen a ciertas variables globalesdel sistema. Una de ellas es la variable numer, que por defecto toma el valorlogico false, lo que indica que Maxima evitara dar resultados en formatodecimal, prefiriendo expresiones simbolicas y fraccionarias,

(%i13) numer;

( %o13) false

(%i14) sqrt(8)/12;

( %o14)2−

12

3

(%i15) numer:true$

(%i16) sqrt(8)/12;

( %o16) 0.2357022603955159

(%i17) numer:false$ /*se reinstaura valor por defecto */

Sin embargo, en general sera preferible el uso de la funcion float,

20 CAPITULO 2. DESPEGANDO CON MAXIMA

(%i18) float(sqrt(8)/12);

( %o18) 0.2357022603955159

Las matrices tambien tienen su lugar en Maxima; la manera mas inme-diata de construirlas es con la instruccion matrix,

(%i19) A: matrix([sin(x),2,%pi],[0,y^2,5/8]);

( %o19)

(sinx 2 π

0 y2 58

)(%i20) B: matrix([1,2],[0,2],[-5,integrate(x^2,x,0,1)]);

( %o20)

1 20 2−5 1

3

(%i21) A.B; /* producto matricial */

( %o21)

(sinx− 5π 2 sinx+ π

3 + 4−25

8 2 y2 + 524

)En cuanto a las capacidades graficas de Maxima, se remite al lector a la

seccion correspondiente.A fin de preparar publicaciones cientıficas, si se quiere redactar documen-

tos en formato LATEX, la funcion tex de Maxima sera una util companera;en el siguiente ejemplo se calcula una integral y a continuacion se pide laexpresion resultante en formato TEX:

(%i22) ’integrate(sqrt(a+x)/x^5,x,1,2) = integrate(sqrt(2+x)/x^5,x,1,2)$

(%i23) tex(%);

$$\int_{1}^{2}{{{\sqrt{x+4}}\over{x^5}}\;dx}={{5\,\sqrt{2}\,\log

\left(5-2\,\sqrt{2}\,\sqrt{3}\right)+548\,\sqrt{3}}\over{2048}}-{{15

\,\sqrt{2}\,\log \left(3-2\,\sqrt{2}\right)+244}\over{6144}}$$

Al pegar y copiar el codigo encerrado entre los dobles sımbolos de dolara un documento LATEX, el resultado es el siguiente:

∫ 2

1

√x+ a

x5dx =

5√

2 log(5− 2

√2√

3)

+ 548√

3

2048−

15√

2 log(3− 2

√2)

+ 244

6144

2.2. UNA PRIMERA SESION 21

Un comentario sobre la entrada %i22. Se observa en ella que se ha escritodos veces el mismo codigo a ambos lados del signo de igualdad. La unicadiferencia entre ambos es el apostrofo que antecede al primer integrate;este es el operador de comilla simple, ya anteriormente aparecido, que Ma-xima utiliza para evitar la ejecucion de una instruccion, de forma que en elresultado la primera integral no se calcula, pero sı la segunda, dando lugara la igualdad que se obtiene como resultado final. Las expresiones que enMaxima se marcan con la comilla simple para no ser evaluadas reciben elnombre de expresiones nominales, en contraposicion a las otras, conocidascomo expresiones verbales.

Ya se ha comentado mas arriba como solicitar ayuda de Maxima. Algunosusuarios encuentran engorroso que la ayuda se interfiera con los calculos;esto se puede arreglar con un mınimo de bricolage informatico. Al tiempoque se instala Maxima, se almacena tambien el sistema de ayuda en formatohtml en una determinada carpeta; el usuario tan solo tendra que buscar estacarpeta, en la que se encontrara la pagina principal maxima.html, y haceruso de la funcion system de Maxima que ejecuta comandos del sistema, lacual admite como argumento una cadena alfanumerica con el nombre delnavegador (en el ejemplo, mozilla) seguido de la ruta hacia el documentomaxima.html,

(%i24)

system("(mozilla /usr/local/share/maxima/5.25.0/doc/html/es.utf8/maxima.html)&")$

Este proceso se puede automatizar si la instruccion anterior se guardaen un fichero de nombre maxima-init.mac y se guarda en la carpeta haciala que apunta la variable maxima_userdir; por ejemplo, en Linux,

(%i25) maxima_userdir;

( %o25) /home/xefe/.maxima

El fichero maxima-init.mac se lee cada vez que arranca Maxima y seejecutan las instrucciones contenidas en el; se puede utilizar para cargarautomaticamente modulos adicionales que vayamos a utilizar con frecuencia,funciones especiales definidas por nosotros o, como en este caso, para que seabra el navegador con las paginas del manual.

22 CAPITULO 2. DESPEGANDO CON MAXIMA

Capıtulo 3

Numeros y sus operaciones

3.1. Enteros y decimales

Maxima puede trabajar con numeros enteros tan grandes como sea ne-cesario,

(%i1) 200!;

( %o1)788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000

Los operadores aritmeticos mas comunes son:

+ suma- resta* producto/ division

^ o ** potencia

Maxima devuelve los resultados de forma exacta, sin aproximacionesdecimales; ası tenemos que para realizar el calculo de la expresion( 37

4 + 35

)−1

+7

9

3

haremos

(%i2) ((3^7/(4+3/5))^(-1)+7/9)^3;

23

24 CAPITULO 3. NUMEROS Y SUS OPERACIONES

( %o2)620214013952

1307544150375

obteniendo el resultado en forma de fraccion simplificada.De todos modos podemos solicitar el resultado en forma decimal; por

ejemplo, si queremos la expresion decimal del ultimo resultado,

(%i3) float(%);

( %o3) 0.4743350454163436

Maxima puede trabajar con precision arbitraria. Para calcular el valordel cociente e

π con 100 cifras decimales, deberemos especificar primero laprecision requerida asignandole a la variable fpprec el valor 100 y a conti-nuacion realizar el calculo, solicitando la expresion decimal con una llamadaa la funcion bfloat:

(%i4) fpprec:100$ bfloat(%e / %pi);

( %o5)8.652559794322650872177747896460896174287446239085155394543302889480450445706770586319246625161845173B × 10−1

Notese que cuando un resultado es devuelto en el formato bfloat seescribe la letra B en lugar de la clasica E para indicar el exponente.

En la instruccion %i4 se establece la precision deseada y luego se trans-forma el valor simbolico %e / %pi mediante la funcion bfloat. Recuerdeseque el sımbolo $ sirve como delimitador entre instrucciones.

Veamos como factorizar un numeros tal como 200! en sus factores primos,

(%i6) factor(%o1);

( %o6)2197 397 549 732 1119 1316 1711 1910 238 296 316 375 414 434 474 533 593 613 672 712

732 792 832 892 972 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173179 181 191 193 197 199

En la siguiente factorizacion hacemos uso de la variable global showtimepara saber el tiempo que le lleva ejecutar el calculo,

(%i7) showtime:true$

Evaluation took 0.00 seconds (0.00 elapsed) using 80 bytes.

(%i8) factor(2^300-1);

Evaluation took 0.86 seconds (0.85 elapsed) using 48.571 MB.

( %o8)32 53 7 11 13 31 41 61 101 151 251 331 601 1201 1321 1801 4051 8101 63901 100801268501 10567201 13334701 1182468601 1133836730401

3.1. ENTEROS Y DECIMALES 25

(%i9) /* desactivamos la informacion de los tiempos */

showtime: false$

El texto que se escribe entre /* y */ son comentarios que Maxima ignora.Ademas de la variable opcional showtime, otro mecanismo de control de

los tiempos de ejecucion es la funcion time,

(%i10) time(%o8);

( %o10) [1.7161081]

En relacion con los numeros primos, para saber si un numero lo es o no,

(%i11) primep(3^56-1);

( %o11) false

Y para solicitarle a Maxima que compruebe si un numero es par o imparnecesitamos echar mano de las funciones evenp or oddp, respectivamente,

(%i12) evenp(42);

( %o12) true

(%i13) oddp(31);

( %o13) true

Le solicitamos a Maxima que nos haga una lista con todos los divisoresde un numero,

(%i14) divisors(100);

( %o14) {1, 2, 4, 5, 10, 20, 25, 50, 100}

En lo que concierne a la division, puede ser necesario conocer el cocien-te entero y el resto correspondiente; para ello se dispone de las funcionesquotient y remainder,

(%i15) quotient(5689,214);

( %o15) 26

(%i16) remainder(5689,214);

( %o16) 125

26 CAPITULO 3. NUMEROS Y SUS OPERACIONES

3.2. Numeros complejos

Como ya se comento mas arriba, la unidad imaginaria√−1 se representa

en Maxima mediante el sımbolo %i,

(%i1) %i^2;

( %o1) −1

Se soportan las operaciones basicas con numeros complejos,

(%i2) z1:3+5*%i$ z2:1/2-4*%i$ /*z1 y z2*/

(%i4) z1 + z2; /*suma*/

( %o4) i+7

2

(%i5) z1 - z2; /*resta*/

( %o5) 9 i+5

2

(%i6) z1 * z2; /*multiplicacion*/

( %o6)

(1

2− 4 i

)(5 i+ 3)

(%i7) z1 / z2; /* division */

( %o7)5 i+ 312 − 4 i

Es posible que estos dos ultimos resultados nos parezcan frustrantes ylos deseemos en otro formato; a tal efecto podemos pedir a Maxima que nosdevuelva (%o6) y (%o7) en forma cartesiana,

(%i8) rectform(%o6);

( %o8)43

2− 19 i

2

(%i9) rectform(%o7);

( %o9)58 i

65− 74

65

Las funciones realpart e imagpart extraen del numero complejo suspartes real e imaginaria, respectivamente,

3.2. NUMEROS COMPLEJOS 27

(%i10) realpart(%o7);

( %o10) −74

65

(%i11) imagpart(%o7);

( %o11)58

65

Antes hemos optado por los resultados en formato cartesiano; pero tam-bien es posible solicitarlos en su forma polar,

(%i12) polarform(%o7);

( %o12)2√

34 ei (π−arctan( 2937))

√65

(%i13) rectform(%); /* forma rectangular */

( %o13)58√

34 i√65√

2210− 74

√34√

65√

2210

(%i14) float(%); /* formato decimal */

( %o14) 0.8923076923076924 i− 1.138461538461538

El modulo de un numero complejo se calcula con la funcion abs y se lepuede pasar el numero tanto en su forma cartesiana como polar,

(%i15) abs(%o9);

( %o15)2√

34√65

(%i16) abs(%o12);

( %o16)2√

34√65

El argumento de un numero complejo se calcula con la funcion carg, quedevuelve un angulo en el intervalo (−π, π],

(%i17) carg(%o9);

28 CAPITULO 3. NUMEROS Y SUS OPERACIONES

( %o17) π − arctan

(29

37

)Por ultimo, el conjugado de un numero complejo se calcula con la funcion

conjugate. Como se ve en este ejemplo, el resultado dependera del formatodel argumento, cartesiano o polar,

(%i18) conjugate(%o9); /*forma cartesiana*/

( %o18) −58 i

65− 74

65

(%i19) conjugate(%o12); /*forma polar*/

( %o19) −2√

34 ei arctan( 2937)

√65

3.3. Combinatoria

Ya hemos visto el calculo del factorial de un numero natural, bien con eloperador !, bien con la funcion factorial; ası podemos calcular el numerode permutacions de n elementos, Pn = n!,

(%i1) /* permutaciones de 23 elementos */

factorial(23);

( %o1) 25852016738884976640000

Esto nos da el numero de ordenaciones diferentes que se pueden ha-cer con n objetos; si queremos generarlas podemos hacer uso de la funcionpermutations,

(%i2) permutations([1,2,3]);

( %o2) {[1, 2, 3] , [1, 3, 2] , [2, 1, 3] , [2, 3, 1] , [3, 1, 2] , [3, 2, 1]}

Cuando se trabaja con factoriales, la funcion minfactorial puede ayu-darnos a simplificar algunas expresiones,

(%i3) n!/(n+2)!;

( %o3)n!

(n+ 2)!

3.3. COMBINATORIA 29

(%i4) minfactorial (%);

( %o4)1

(n+ 1) (n+ 2)

El calculo del numero de variaciones con repeticion de m elementos to-mados de n en n, V Rnm = mn, no necesita de ninguna funcion especial,

(%i5) /* VR de 17 tomados de 4 en 4 */

17^4;

( %o5) 83521

Sin embargo, para calcular el numero de variaciones sin repeticion de melementos tomados de n en n, V n

m = m!/(m − n)!, debemos hacer uso dela funcion permutation definida en el modulo functs, que tendremos quecargar en memoria previamente,

(%i6) load("functs")$

(%i7) /* V de 17 tomados de 4 en 4 */

permutation(17,4);

( %o7) 57120

Notese que podemos calcular P23 con esta misma funcion, sin llamar alfactorial,

(%i8) /* permutaciones de 23 elementos, otra vez */

permutation(23,23);

( %o8) 25852016738884976640000

El numero de combinaciones de m elementos tomados de n en n, Cnm =V nm/Pn, se puede calcular con la funcion binomial,

(%i9) /* combinaciones de 30 elementos, tomados de 5 en 5 */

binomial(30,5);

( %o9) 142506

El numero de permutaciones de n elementos, con repeticiones a1, . . . , ak,

P a1,...,arn =(a1 + . . .+ ar)!

a1! · . . . · ar!,

siendo a1 + . . .+ ar = n, se calcula con la funcion multinomial_coeff,

30 CAPITULO 3. NUMEROS Y SUS OPERACIONES

(%i10) /* permutaciones con repeticion de 5 elementos,

con repeticiones 2, 2 y 1 */

multinomial_coeff(2,2,1);

( %o10) 30

La funcion stirling1 calcula el numero de Stirling de primera especie,s(n, k), que se define de la forma

(−1)n−k·s(n, k) = Card{σ|σ es permutacion de {1, . . . , n}∧σ tiene k ciclos}

(%i11) stirling1(5,2);

( %o11) −50

Por otro lado, la funcion stirling2 calcula el numero de Stirling desegunda especie, S(n, k), que se define de la forma

S(n, k) = Card{π|π es particion de {1, . . . , n} ∧ Card(π) = k}

(%i12) stirling2(3,2);

( %o12) 3

Esto es, hay 3 particiones de {1, 2, 3} formadas por dos subconjuntos,las cuales podemos obtener invocando la funcion set_partitions,

(%i13) set_partitions ({1,2,3}, 2);

( %o13) {{{1} , {2, 3}} , {{1, 2} , {3}} , {{1, 3} , {2}}}

El numero de Bell, que calculamos con la funcion belln es el numerototal de particiones que admite un conjunto finito,

B(n) =

n∑k=1

S(n, k).

(%i14) /* numero de particiones en un conjunto de cardinalidad 3 */

belln(3);

( %o14) 5

En relacion con la combinatoria, veanse tambien las secciones 4.4 y 4.5,sobre conjuntos y grafos, respectivamente.

Capıtulo 4

Estructuras de datos

4.1. Listas

Las listas son objetos muy potentes a la hora de representar estructurasde datos; de hecho, toda expresion de Maxima se representa internamentecomo una lista, lo que no es de extranar habida cuenta de que Maximaesta programado en Lisp (List Processing). Veamos como podemos ver larepresentacion interna, esto es en Lisp, de una sencilla expresion tal como1 + 3a,

(%i1) ?print(1+3*a)$

((MPLUS SIMP) 1 ((MTIMES SIMP) 3 $A))

Pero al nivel del usuario que no esta interesado en las interioridades deMaxima, tambien se puede trabajar con listas como las definidas a conti-nuacion, siempre encerradas entre corchetes,

(%i2) r:[1,[a,3],sqrt(3)/2,"Don Quijote"];

( %o2)

[1, [a, 3] ,

√3

2,Don Quijote

]Vemos que los elementos de una lista pueden a su vez ser tambien listas,

expresiones matematicas o cadenas de caracteres incluidas entre comillasdobles, lo que puede ser aprovechado para la construccion y manipulacionde estructuras mas o menos complejas. Extraigamos a continuacion algunainformacion de las listas anteriores,

(%i3) listp(r); /* es r una lista? */

( %o3) true

(%i4) first(r); /* primer elemento */

31

32 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o4) 1

(%i5) second(r); /* segundo elemento */

( %o5) [a, 3]

(%i6) third(r); /* ...hasta tenth */

( %o6)

√3

2

(%i7) last(r); /* el ultimo de la lista */

( %o7) Don Quijote

(%i8) rest(r); /* todos menos el primero */

( %o8)

[[a, 3] ,

√3

2,Don Quijote

]

(%i9) part(r,3); /* pido el que quiero */

( %o9)

√3

2

(%i10) length(r); /* ¿cuantos hay? */

( %o10) 4

(%i11) reverse(r); /* le damos la vuelta */

( %o11)

[Don Quijote,

√3

2, [a, 3] , 1

]

(%i12) member(a,r); /* ¿es a un elemento?*/

( %o12) false

(%i13) member([a,3],r); /* ¿lo es [a,3]? */

( %o13) true

4.1. LISTAS 33

(%i14) /* asigno valor a q y ordeno */

sort(q: [7,a,1,d,5,3,b]);

( %o14) [1, 3, 5, 7, a, b, d]

(%i15) delete([a,3],r); /* borro elemento */

( %o15)

[1,

√3

2,Don Quijote

]

Notese que en todo este tiempo la lista r no se ha visto alterada,

(%i16) r;

( %o16)

[1, [a, 3] ,

√3

2,Don Quijote

]

Algunas funciones de Maxima permiten anadir nuevos elementos a unalista, tanto al principio como al final,

(%i17) cons(1+2,q);

( %o17) [3, 7, a, 1, d, 5, 3, b]

(%i18) endcons(x,q);

( %o18) [7, a, 1, d, 5, 3, b, x]

(%i19) q;

( %o19) [7, a, 1, d, 5, 3, b]

En este ejemplo hemos observado tambien que la lista q no ha cambiado.Si lo que queremos es actualizar su contenido,

(%i20) q: endcons(x,cons(1+2,q))$

(%i21) q;

( %o21) [3, 7, a, 1, d, 5, 3, b, x]

Es posible unir dos listas,

(%i22) append(r,q);

34 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o22)

[1, [a, 3] ,

√3

2,Don Quijote, 3, 7, a, 1, d, 5, 3, b, x

]Cuando los elementos de una lista van a obedecer un cierto criterio de

construccion, podemos utilizar la funcion makelist para construirla,

(%i23) s:makelist(2+k*2,k,0,10);

( %o23) [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

donde le hemos indicado a Maxima que nos construya una lista con elementosde la forma 2+2*k, de modo que k tome valores enteros de 0 a 10.

La funcion apply permite suministrar a otra funcion todos los elementosde una lista como argumentos, ası podemos sumar o multiplicar todos loselementos de la lista s recien creada,

(%i24) apply("+",s);

( %o24) 132

(%i25) apply("*",s);

( %o25) 81749606400

aunque estas dos operaciones hubiese sido quizas mas apropiado haberlasrealizado con las funciones sum y product.

A veces interesara aplicar una misma funcion a varios elementos de unalista de forma independiente, para lo que haremos uso de map. A conti-nuacion un ejemplo de calculo de factoriales y otro trigonometrico; en esteultimo, no es necesario aplicar map, ya que algunas funciones se distribuyenautomaticamente sobre los elementos de una lista,

(%i26) map("!",s);

( %o26)[2, 24, 720, 40320, 3628800, 479001600, 87178291200, 20922789888000,6402373705728000, 2432902008176640000, 1124000727777607680000]

(%i27) sin(s);

( %o27)[sin 2, sin 4, sin 6, sin 8, sin 10, sin 12, sin 14, sin 16, sin 18, sin 20, sin 22]

A veces se quiere utilizar en map una funcion que no esta definida yque no va a ser utilizada mas que en esta llamada a map. En tales casos sepuede hacer uso de las funciones lambda; supongase que a cada elemento xde una lista se le quiere aplicar la funcion f(x) = sin(x) + 1

2 , sin necesidadde haberla definido previamente,

4.1. LISTAS 35

(%i28) map(lambda([x], sin(x) + 1/2),[7,3,4,9]);

( %o28)

[sin 7 +

1

2, sin 3 +

1

2, sin 4 +

1

2, sin 9 +

1

2

]Como se ve, la funcion lambda admite dos argumentos; el primero es una

lista (no se puede evitar la redundancia) de argumentos, siendo el segundola expresion que indica que se hace con los elementos de la lista anterior.

Por ultimo, las listas tambien pueden ser utilizadas en operaciones aritmeti-cas. Algunas de las operaciones que se aplican a continuacion no estan defi-nidas matematicamente, por lo que Maxima se toma la libertad de definirlaspor su cuenta, lo que redunda en un ahorro de codigo por parte del usuarioy en un estilo de programacion mas compacto,

(%i29) [1,2,3]+[a,b,c];

( %o29) [a+ 1, b+ 2, c+ 3]

(%i30) [1,2,3]*[a,b,c];

( %o30) [a, 2 b, 3 c]

(%i31) [1,2,3]/[a,b,c];

( %o31)

[1

a,2

b,3

c

](%i32) [1,2,3]-[a,b,c];

( %o32) [1− a, 2− b, 3− c]

(%i33) [1,2,3].[a,b,c]; /* producto escalar */

( %o33) 3 c+ 2 b+ a

(%i34) [a,b,c]^3;

( %o34)[a3, b3, c3

](%i35) 3^[a,b,c];

36 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o35)[3a, 3b, 3c

]En Maxima, las listas se pueden interpretar como vectores; para mas

informacion, acudase a la Seccion 6.6.Para que estas operaciones puedan realizarse sin problemas, la variable

global listarith debe tomar el valor true, en caso contrario el resultadosera bien distinto,

(%i36) listarith:false$

(%i37) [1,2,3]+[4,5,6];

( %o37) [4, 5, 6] + [1, 2, 3]

(%i38) listarith:true$

Como ya se vio al comienzo de esta seccion, una lista puede ser elementode otra lista, si queremos deshacer todas las listas interiores para que suselementos pasen a formar parte de la exterior,

(%i39) flatten([1,[a,b],2,3,[c,[d,e]]]);

( %o39) [1, a, b, 2, 3, c, d, e]

El calculo del modulo de un vector se puede hacer mediante la definicionprevia de una funcion al efecto:

(%i40) modulo(v):=

if listp(v)

then sqrt(apply("+",v^2))

else error("Mucho ojito: ", v, " no es un vector !!!!")$

(%i41) xx:[a,b,c,d,e]$

(%i42) yy:[3,4,-6,0,4/5]$

(%i43) modulo(xx-yy);

( %o43)

√(e− 4

5

)2

+ d2 + (c+ 6)2 + (b− 4)2 + (a− 3)2

4.2. Arrays

Los arrays son estructuras que almacenan datos secuencial o matricial-mente. Se diferencian de las listas en que estas pueden alterar su estructurainterna y los arrays no; pero la ventaja frente a las listas estriba en que elacceso a un dato cualquiera es directo, mientras que en las listas, al ser es-tructuras dinamicas, para acceder al n-esimo dato, un puntero debe recorrer

4.2. ARRAYS 37

todos los elementos de la lista desde el que ocupa el primer lugar. Ası pues,se recomienda el uso de arrays cuando se vaya a utilizar una secuencia largade expresiones cuya estructura se va a mantener inalterable; en general, semejoraran los tiempos de procesamiento.

Si queremos construir un array, lo debemos declarar previamente me-diante la funcion array, indicando su nombre y dimensiones; a continuacionle asignarıamos valores a sus elementos,

(%i1) array(arreglillo,2,2);

( %o1) arreglillo

(%i2) arreglillo[0,0]: 34$

(%i3) arreglillo[1,2]:x+y$

(%i4) arreglillo[2,2]:float(%pi)$

(%i5) listarray(arreglillo);

( %o5)[34,#####,#####,#####,#####,y + x,#####,#####, 3.141592653589793]

En el ejemplo, hemos definido un array de dimensiones 3 por 3, ya quela indexacion de los arrays comienza por el cero, no por el uno como en elcaso de las listas; a continuacion hemos asignado valores a tres elementosdel array: un entero, una expresion simbolica y un numero decimal en comaflotante. Finalmente, la funcion listarray nos permite ver el contenido delarray, utilizando el sımbolo ##### para aquellos elementos a los que aun nose les ha asignado valor alguno.

Si ya se sabe de antemano que el array va a contener unicamente nume-ros enteros o numeros decimales, podemos declararlo al definirlo para queMaxima optimice el procesamiento de los datos. A continuacion se declaraun array de numeros enteros haciendo uso del sımbolo fixnum (en el casode numeros decimales en coma flotante se utilizarıa flonum) y a continua-cion la funcion fillarray rellenara el array con los elementos previamentealmacenados en una lista,

(%i6) lis: [6,0,-4,456,56,-99];

( %o6) [6, 0,−4, 456, 56,−99]

(%i7) array(arr,fixnum,5);

( %o7) arr

(%i8) fillarray(arr,lis);

38 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o8) arr

(%i9) arr[4];

( %o9) 56

(%i10) listarray(arr);

( %o10) [6, 0,−4, 456, 56,−99]

Hasta ahora hemos hecho uso de los llamados array declarados. Si nohacemos la declaracion pertinente mediante la funcion array, y en su lugarrealizamos asignaciones directas a los elementos de la estructura, creamoslo que se conoce como array de claves (hash array) o, en la terminologıa deMaxima, array no declarado; estos arrays son mucho mas generales que losdeclarados, puesto que pueden ir creciendo de forma dinamica y los ındicesno tienen que ser necesariamente numeros enteros,

(%i11) tab[9]:76;

( %o11) 76

(%i12) tab[-58]:2/9;

( %o12)2

9

(%i13) tab[juan]:sqrt(8);

( %o13) 232

(%i14) tab["cadena"]: a-b;

( %o14) a− b

(%i15) tab[x+y]:5;

( %o15) 5

(%i16) listarray(tab);

( %o16)

[2

9, 76, a− b, 2

32 , 5

]

4.3. CADENAS 39

(%i17) tab["cadena"];

( %o17) a− b

Esta generalidad en la estructura de los arrays no declarados tiene la contra-partida de restarle eficiencia en el procesamiento de los datos almacenados,siendo preferible, siempre que sea posible, la utilizacion de los declarados.

Ya por ultimo, junto con los arrays declarados y no declarados mencio-nados, es posible trabajar a nivel de Maxima con arrays de Lisp. En estecaso su construccion se materializa con la funcion make_array,

(%i18) a: make_array(flonum,5);

( %o18) {Array : # (0.0 0.0 0.0 0.0 0.0)}

(%i19) a[0]:3.4;

( %o19) 3.4

(%i20) a[4]:6.89;

( %o20) 6.89

(%i21) a;

( %o21) {Array : # (3.4 0.0 0.0 0.0 6.89)}

Notense aquı un par de diferencias respecto de la funcion array: el nume-ro 5 indica el numero de elementos (indexados de 0 a 4) y no el ındice maximoadmisible; por otro lado, la funcion no devuelve el nombre del objeto array,sino el propio objeto.

4.3. Cadenas

Una cadena se construye escribiendo un texto o cualquier otra expresionentre comillas dobles. Vamos a hacer algunos ejemplos basicos,

(%i1) xx: "Los ";

( %o1) Los

(%i2) yy: " cerditos";

40 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o2) cerditos

(%i3) zz: concat(xx,sqrt(9),yy);

( %o3) Los 3 cerditos

la funcion concat admite varios parametros, los cuales evalua y luego con-catena convirtiendolos en una cadena.

La funcion stringp nos indica si su argumento es o no una cadena,

(%i4) stringp(zz);

( %o4) true

Para saber el numero de caracteres de una cadena haremos uso deslength

(%i5) slength(zz);

( %o5) 14

Una vez transformada en cadena una expresion de Maxima, deja de serevaluable,

(%i6) concat(sqrt(25));

( %o6) 5

(%i7) % + 2;

( %o7) 5 + 2

(%i8) stringp(%);

( %o8) false

el resultado no se simplifica porque uno de los sumandos es una cadena yno se reconoce como cantidad numerica.

La funcion charat devuelve el caracter que ocupa una posicion determi-nada,

(%i9) charat(zz,7);

( %o9) c

Tambien podemos solicitar que Maxima nos devuelva una lista con todoslos caracteres o palabras que forman una cadena,

4.3. CADENAS 41

(%i10) charlist(zz);

( %o10) [L, o, s, , 3, , c, e, r,d, i, t, o, s]

(%i11) tokens(zz);

( %o11) [Los, 3, cerditos]

O podemos transformar letras minusculas en mayusculas y viceversa,todas las letras o solo un rango de ellas,

(%i12) /* todo a mayusculas */

supcase(zz);

( %o12) LOS 3 CERDITOS

(%i13) /* a minusculas entre la 9a y 12a */

sdowncase(%,9,12);

( %o13) LOS 3 CErdiTOS

(%i14) /* a minusculas de la 13a hasta el final */

sdowncase(%,13);

( %o14) LOS 3 CErdiTos

(%i15) /* todo a minusculas */

sdowncase(%);

( %o72) los 3 cerditos

(%i16) /* a mayusculas entre la 1a y 2a */

supcase(%,1,2);

( %o74) Los 3 cerditos

Para comparar si dos cadenas son iguales disponemos de la funcionsequal,

(%i17) tt: zz;

( %o17) Los 3 cerditos

(%i18) sequal(tt,zz);

42 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o18) true

(%i19) tt: supcase(zz);

( %o19) LOS 3 CERDITOS

(%i20) sequal(tt,zz);

( %o20) false

Podemos buscar subcadenas dentro de otras cadenas mediante la funcionssearch; los siguientes ejemplos pretenden aclarar su uso,

(%i21) zz;

( %o21) Los 3 cerditos

(%i22) /* busca la subcadena "cer" */

ssearch("cer",zz);

( %o22) 7

(%i23) /* busca la subcadena "Cer" */

ssearch("Cer",zz);

( %o23) false

(%i24) /* busca "Cer" ignorando tama~no */

ssearch("Cer",zz,’sequalignore);

( %o24) 7

(%i25) /* busca solo entre caracteres 1 y 5 */

ssearch("Cer",zz,’sequalignore,1,5);

( %o25) false

Igual que buscamos subcadenas dentro de otra cadena, tambien podemoshacer sustituciones; en este caso la funcion a utilizar es ssubst,

(%i26) ssubst("mosqueteros","cerditos",zz);

4.3. CADENAS 43

( %o26) Los 3 mosqueteros

Esta funcion tiene como mınimo tres argumentos, el primero indica lanueva cadena a introducir, el segundo es la subcadena a ser sustituıda y eltercero la cadena en la que hay que realizar la sustitucion. Es posible utilizaresta funcion con mas argumentos; como siempre, para mas informacion,? ssubst.

Con la funcion substring podemos obtener una subcadena a partir deotra, para lo cual debemos indicar los extremos de la subcadena,

(%i27) substring(zz,7);

( %o27) cerditos

(%i28) substring(zz,3,8);

( %o28) s 3 c

Como se ve, el segundo argumento indica la posicion a partir de la cualqueremos la subcadena y el tercero la ultima posicion; si no se incluye eltercer argumento, se entiende que la subcadena se extiende hasta el final dela de referencia.

En algunos contextos el usuario tiene almacenada una expresion sintacti-camente correcta de Maxima en formato de cadena y pretende evaluarla, encuyo caso la funcion eval_string la analizara y evaluara, en tanto queparse_string la analiza pero no la evalua, limitandose a transformarla auna expresion nominal de Maxima,

(%i29) /* una cadena con una expresion de Maxima */

expr: "integrate(x^5,x)";

( %o29) integrate(xˆ5,x)

(%i30) /* se evalua la cadena */

eval_string(expr);

( %o30)x6

6

(%i31) /* se transforma en una expresion nominal */

parse_string(expr);

( %o31) integrate(x5, x

)(%i32) ’’%;

44 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o32)x6

6

Vease que el resultado de parse_string ya no es una cadena, sino unaexpresion correcta de Maxima sin evaluar, cuya evaluacion se solicita a con-tinuacion con la doble comilla simple.

Para mas informacion sobre el procesamiento de cadenas de texto, sesugiere la lectura del capıtulo stringproc del manual de referencia.

4.4. Conjuntos

Se define a continuacion un conjunto mediante la funcion set,

(%i1) c1:set(a,[2,k],b,sqrt(2),a,set(a,b),

3,"Sancho",set(),b,sqrt(2),a);

( %o1){

3,√

2, {} , [2, k] , Sancho, a, {a, b} , b}

Como se ve, se admiten objetos de muy diversa naturaleza como ele-mentos de un conjunto: numeros, expresiones, el conjunto vacıo ({}), listas,otros conjuntos o cadenas de caracteres. Se habra observado que al cons-truir un conjunto se eliminan las repeticiones de elementos, cual es el casodel sımbolo a en la lista anterior.

Cuando se trabaja con listas, puede ser de utilidad considerar sus com-ponentes como elementos de un conjunto, luego se necesita una funcion quenos transforme una lista en conjunto,

(%i2) [[2,k],sqrt(2),set(b,a),[k,2],"Panza"];

( %o2)[[2, k] ,

√2, {a, b} , [k, 2] ,Panza

](%i3) c2:setify(%);

( %o3){√

2, [2, k] ,Panza, {a, b} , [k, 2]}

el cambio en la naturaleza de estas dos colecciones de objetos se apreciaen la presencia de llaves en lugar de corchetes. De igual manera, podemostransformar un conjunto en lista,

(%i4) listify(%o1);

( %o4)[3,√

2, {} , [2, k] , Sancho, a, {a, b} , b]

Comprobemos de paso que {} representa al conjunto vacıo,

4.4. CONJUNTOS 45

(%i5) emptyp(%[3]);

( %o5) true

Recuerdese que % sustituye a la ultima respuesta dada por Maxima, queen este caso habıa sido una lista, por lo que %[3] hace referencia a su terceracomponente.

Para comprobar si un cierto objeto forma parte de un conjunto hacemosuso de la instruccion elementp,

(%i6) elementp(sqrt(2),c1);

( %o6) true

Es posible extraer un elemento de un conjunto y luego anadirle otrodistinto

(%i7) c1: disjoin(sqrt(2),c1); /* sqrt(2) fuera */

( %o7) {3, {} , [2, k] ,Sancho, a, {a, b} , b}

(%i8) c1: adjoin(sqrt(3),c1); /* sqrt(3) dentro */

( %o8){

3,√

3, {} , [2, k] ,Sancho, a, {a, b} , b}

La sustitucion que se acaba de realizar se pudo haber hecho con la funcionsubst,

(%i9) /* nuevamente a poner sqrt(2) */

subst(sqrt(2),sqrt(3),c1);

( %o9){

3,√

2, {} , [2, k] ,Sancho, a, {a, b} , b}

La comprobacion de si un conjunto es subconjunto de otro se hace conla fucion subsetp,

(%i10) subsetp(set([k,2],"Panza"),c2);

( %o10) true

A continuacion algunos ejemplos de operaciones con conjuntos,

(%i11) union(c1,c2);

46 CAPITULO 4. ESTRUCTURAS DE DATOS

( %o11){

3,√

2,√

3, {} , [2, k] ,Panza,Sancho, a, {a, b} , b, [k, 2]}

(%i12) intersection(c1,c2);

( %o12) {[2, k] , {a, b}}

(%i13) setdifference(c1,c2);

( %o13){

3,√

3, {} , Sancho, a, b}

(%i14) cardinality(%);

( %o14) 6

Vemos aquı tambien como pedir el cardinal de un conjunto.

Igual que se ha visto como aplicar una funcion a todos los elementos deuna lista, podemos hacer lo mismo con los de un conjunto,

(%i15) map(sin,set(1,2,3,4,5));

( %o15) {sin 1, sin 2, sin 3, sin 4, sin 5}

Por ultimo ya, el producto cartesiano de tres conjuntos,

(%i16) cartesian_product(set(1,2),set(a,b,c),set(x,y));

( %o16){[1, a, x] , [1, a, y] , [1, b, x] , [1, b, y] , [1, c, x] , [1, c, y] ,[2, a, x] , [2, a, y] , [2, b, x] , [2, b, y] , [2, c, x] , [2, c, y]}

Ya por ultimo, el conjunto de las partes de un conjunto, o conjuntopotencia, lo podemos obtener con la funcion powerset

(%i17) powerset({1,a,sqrt(2)});

( %o17){{} , {1} ,

{1,√

2},{

1,√

2, a}, {1, a} ,

{√2},{√

2, a}, {a}

}

4.5. GRAFOS 47

4.5. Grafos

El soporte para el desarrollo de algoritmos en el ambito de la teorıa degrafos se encuentra en el modulo graphs. Se trata de un paquete de funcionesque aporta la infraestructura basica para el trabajo con grafos, orientados ono. No se admiten bucles ni aristas multiples.

(%i1) load(graphs)$

(%i2) g: create_graph(

[1,2,3,4,5,6,7],

[ [1,2],[2,3],[2,4],[3,4],

[4,5],[5,6],[4,6],[6,7] ]);

( %o2) GRAPH

Como vemos, la respuesta de la funcion create_graph no es muy infor-mativa, pero nos podemos hacer una idea de la estructura del grafo haciendo

(%i3) print_graph(g)$

Graph on 7 vertices with 8 edges.

Adjacencies:

7 : 6

6 : 7 4 5

5 : 6 4

4 : 6 5 3 2

3 : 4 2

2 : 4 3 1

1 : 2

Vemos que, por ejemplo, el vertice numero 3 comparte aristas (no orien-tadas) con los vertices 4 y 2.

En caso de que el grafo anterior fuese orientado (digrafo) su definicionserıa:

(%i4) dg: create_graph(

[1,2,3,4,5,6,7],

[ [1,2],[2,3],[2,4],[3,4],

[4,5],[5,6],[4,6],[6,7] ],

directed = true)$

(%i5) print_graph(dg)$

Digraph on 7 vertices with 8 arcs.

Adjacencies:

48 CAPITULO 4. ESTRUCTURAS DE DATOS

7

6

5

4

3

2

1 7

6

5 4

3

2 1

a) b) 1

2

3

4

5

6

7

19

18

17

16

15

14

13 12

11

10

9

8

7

6

5

4

3

2

1

0

c) d)

Figura 4.1: Grafos: a) no orientado; b) orientado; c) complemetario del noorientado; d) camino mas corto.

7 :

6 : 7

5 : 6

4 : 6 5

3 : 4

2 : 4 3

1 : 2

En este caso, print_graph nos muestra los nodos hijos a la derecha delos padres. En particular, el nodo 7 no es origen de ningun arco, pero es hijodel nodo 6. Otra manera alternativa de mostrar la estructura de un grafo esmediante la funcion draw_graph

(%i6) draw_graph(g, show_id=true, terminal=eps)$

(%i7) draw_graph(dg, show_id=true, head_length=0.05, terminal=eps)$

Cuyos aspectos se pueden observar en los apartados a) y b) de la Figu-ra 4.1.

Continuemos con el grafo no orientado g definido mas arriba y veamoscomo extraer de el cierta informacion: el numero cromatico, matriz de ad-yacencia, grafo complementario, si es conexo, o planar, su diametro, etc.

4.5. GRAFOS 49

(%i8) chromatic_number(g);

( %o8) 3

(%i9) adjacency_matrix(g);

( %o9)

0 1 0 0 0 0 01 0 1 1 0 0 00 1 0 1 0 0 00 1 1 0 1 1 00 0 0 1 0 1 00 0 0 1 1 0 10 0 0 0 0 1 0

(%i10) gc:complement_graph(g);

( %o10) GRAPH

(%i11) print_graph(%)$

Graph on 7 vertices with 13 edges.

Adjacencies:

1 : 3 4 5 6 7

2 : 5 6 7

3 : 1 5 6 7

4 : 1 7

5 : 1 2 3 7

6 : 1 2 3

7 : 1 2 3 4 5

Pedimos ahora a Maxima que nos represente graficamente el complemen-tario de g, cuyo aspecto es el del apartado c) de la Figura 4.1.

(%i12) draw_graph(gc, show_id=true, terminal=eps)$

Continuamos con algunas otras propiedades:

(%i13) is_connected(g);

( %o13) true

50 CAPITULO 4. ESTRUCTURAS DE DATOS

(%i14) is_planar(g);

( %o14) true

(%i15) diameter(g);

( %o15) 4

Junto con la definicion manual, tambien es posible generar determinadosgrafos mediante funciones, como el cıclico, el completo, el dodecaedro, ungrafo aleatorio, etc.

(%i16) print_graph(g1: cycle_graph(5))$

Graph on 5 vertices with 5 edges.

Adjacencies:

4 : 0 3

3 : 4 2

2 : 3 1

1 : 2 0

0 : 4 1

(%i17) print_graph(g2: complete_graph(4))$

Graph on 4 vertices with 6 edges.

Adjacencies:

3 : 2 1 0

2 : 3 1 0

1 : 3 2 0

0 : 3 2 1

(%i18) print_graph(g3: dodecahedron_graph())$

Graph on 20 vertices with 30 edges.

Adjacencies:

19 : 14 13 1

18 : 13 12 2

17 : 12 11 3

16 : 11 10 4

15 : 14 10 0

14 : 5 19 15

4.5. GRAFOS 51

13 : 7 19 18

12 : 9 18 17

11 : 8 17 16

10 : 6 16 15

9 : 7 8 12

8 : 9 6 11

7 : 5 9 13

6 : 8 5 10

5 : 7 6 14

4 : 16 0 3

3 : 17 4 2

2 : 18 3 1

1 : 19 2 0

0 : 15 4 1

(%i19) /* 0.4 de probabilidad para cada arco */

print_graph(g4: random_graph(10,0.4))$

Graph on 10 vertices with 15 edges.

Adjacencies:

9 : 8 5 2 1 0

8 : 9 6 3

7 : 5 2 1

6 : 8 3

5 : 9 7

4 : 2

3 : 8 6 0

2 : 9 7 4 0

1 : 9 7 0

0 : 9 3 2 1

Por ultimo ya, un ejemplo de calculo de la ruta mas corta. Se genera ungrafo orientado aleatorio, a continuacion se calcula la ruta mas corta entredos vertices dados y finalmente se hace una representacion grafica del calculorealizado, la cual se puede ver en el apartado d) de la Figura 4.1.

(%i20) r : random_digraph(20, 0.25)$

(%i21) /* Una lista de los vertices del digrafo */

vertices(r);

( %o21) [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

52 CAPITULO 4. ESTRUCTURAS DE DATOS

(%i22) sh: shortest_path(0,14,r);

( %o22) [0, 4, 1, 17, 14]

(%i23) draw_graph(

r,

show_edges = vertices_to_path(sh),

show_id = true,

head_length = 0.05,

terminal = eps)$

El paquete graphs tambien permite el uso de etiquetas en los nodos yponderaciones en las aristas y arcos. El lector interesado podra consultar ladocumentacion correspondiente en el manual de referencia.

Capıtulo 5

Algebra

5.1. Transformaciones simbolicas

Expresiones algebraicas

Sin duda, una de las capacidades mas destacables de Maxima es su ha-bilidad para manipular expresiones algebraicas. Desarrollemos un ejemploque empieza por asignar a la variable q una expresion literal:

(%i1) q: (x+3)^5-(x-a)^3+(x+b)^(-1)+(x-1/4)^(-5);

( %o1)1

x+ b− (x− a)3 + (x+ 3)5 +

1(x− 1

4

)5Se observa que en principio Maxima no realiza ningun calculo. La funcion

expand se encarga de desarrollar las potencias y los productos algebraicos,

(%i2) expand(q);

( %o2)1

x5− 5 x4

4+ 5 x3

8− 5 x2

32+ 5 x

256− 1

1024

+ 1x+b + x5 + 15x4 + 89x3 + 3 a x2 + 270x2−

3 a2 x+ 405x+ a3 + 243

No obstante es posible que no nos interese desplegar toda la expresion,entre otras cosas para evitar una respuesta farragosa y difıcil de interpretar;en tal caso podemos utilizar expand anadiendole dos argumentos y operarde la manera siguiente

(%i3) expand(q,3,2);

( %o3)1

x+ b+ (x+ 3)5 − x3 + 3 a x2 − 3 a2 x+

1(x− 1

4

)5 + a3

53

54 CAPITULO 5. ALGEBRA

Con los argumentos adicionales indicamos que queremos la expansion detodas aquellas potencias con exponente positivo menor o igual a 3 y de lasque teniendo el exponente negativo no excedan en valor absoluto de 2.

Dada una expresion con valores literales, podemos desear sustituir algunaletra por otra expresion; por ejemplo, si queremos hacer los cambios a = 2,b = 2c en el ultimo resultado obtenido,

(%i4) %,a=2,b=2*c;

( %o4)1

x+ 2 c+ (x+ 3)5 − x3 + 6x2 − 12x+

1(x− 1

4

)5 + 8

En el ejemplo %i4 se presenta una sentencia en la que hay elementosseparados por comas (,). Esta es una forma simplificada de utilizar la funcionev, que evalua la primera expresion asignando los valores que se le vanindicando a continuacion; por ejemplo, (%i4) se podrıa haber escrito comoev(%,a=2,b=2*c). El uso de la variante con ev esta mas indicado para serutilizado dentro de expresiones mas amplias. Observese el resultado siguiente

(%i5) 3*x^2 + ev(x^4,x=5);

( %o5) 3x2 + 625

donde la sustitucion x = 5 se ha realizado exclusivamente dentro del con-texto delimitado por la funcion ev.

De forma mas general, la funcion subst sustituye subexpresiones en-teras. En el siguiente ejemplo, introducimos una expresion algebraica y acontinuacion sustituimos todos los binomios x+y por la letra k,

(%i6) 1/(x+y)-(y+x)/z+(x+y)^2;

( %o6) −y + x

z+ (y + x)2 +

1

y + x

(%i7) subst(k,x+y,%);

( %o7) −kz

+ k2 +1

k

No obstante, el siguiente resultado nos sugiere que debemos ser precavi-dos con el uso de esta funcion, ya que Maxima no siempre interpretara comosubexpresion aquella que para nosotros sı lo es:

(%i8) subst(sqrt(k),x+y,(x+y)^2+(x+y));

5.1. TRANSFORMACIONES SIMBOLICAS 55

( %o8) y + x+ k

La funcion subst realiza una simple sustitucion sintactica que, si bienes suficiente en la mayor parte de los casos, a veces se queda corta como enla situacion anterior; la funcion ratsubst es capaz de utilizar informacionsemantica y obtene mejores resultados,

(%i9) ratsubst(sqrt(k),x+y,(x+y)^2+(x+y));

( %o9) k +√k

Como una aplicacion practica de subst, veamos como podemos utilizarlapara obtener el conjugado de un numero complejo,

(%i10) subst(-%i,%i,a+b*%i);

( %o10) a− i b

La operacion inversa de la expansion es la factorizacion. Expandamos yfactoricemos sucesivamente un polinomio para comprobar los resultados,

(%i11) expand((a-2)*(b+1)^2*(a+b)^5);

( %o11)a b7 − 2 b7 + 5 a2 b6 − 8 a b6 − 4 b6 + 10 a3 b5 − 10 a2 b5 − 19 a b5 − 2 b5 + 10 a4 b4−

35 a2 b4 − 10 a b4 + 5 a5 b3 + 10 a4 b3 − 30 a3 b3 − 20 a2 b3 + a6 b2 + 8 a5 b2 − 10 a4 b2−20 a3 b2 + 2 a6 b+ a5 b− 10 a4 b+ a6 − 2 a5

(%i12) factor(%);

( %o12) (a− 2) (b+ 1)2 (b+ a)5

El maximo comun divisor de un conjunto de polinomios se calcula conla funcion gcd y el mınimo comun multiplo con lcm

(%i13) p1: x^7-4*x^6-7*x^5+8*x^4+11*x^3-4*x^2-5*x;

( %o13) x7 − 4x6 − 7x5 + 8x4 + 11x3 − 4x2 − 5x

(%i14) p2: x^4-2*x^3-4*x^2+2*x+3;

( %o14) x4 − 2x3 − 4x2 + 2x+ 3

(%i15) gcd(p1,p2);

56 CAPITULO 5. ALGEBRA

( %o15) x3 + x2 − x− 1

(%i16) load(functs)$

(%i17) lcm(p1,p2);

( %o17) (x− 5) (x− 3) (x− 1)2 x (x+ 1)3

En (%i13) y (%i14) definimos los polinomios p1 y p2, a continuacioncalculamos su maximo comun divisor (mcd) en (%i15) y antes de pedir elmınimo comun multiplo en (%i17) cargamos el paquete functs en el quese encuentra definida la funcion lcm. Es posible que deseemos disponer delmcd factorizado, por lo que hacemos

(%i18) factor(%o15);

( %o18) (x− 1) (x+ 1)2

Hay varias funciones en Maxima que se pueden utilizar para extraercoeficientes de expresiones algebraicas; una de ellas es ratcoef. Dado elpolinomio (x− y)4, podemos querer extraer el coeficiente de x2y2,

(%i19) ratcoef((x-y)^4, x^2*y^2);

( %o19) 6

Cuando tenemos expandido un polinomio de varias variables, podemosquerer transformarlo en otro univariante con coeficientes literales; aquı puedeser de ayuda la funcion rat,

(%i20) q: m^2*x^2+x^2+2*b*m*x-6*m*x-4*x+b^2-6*b+13;

( %o20) m2 x2 + x2 + 2 bmx− 6mx− 4x+ b2 − 6 b+ 13

(%i21) rat(q, x);

( %o21)(m2 + 1

)x2 + ((2 b− 6) m− 4) x+ b2 − 6 b+ 13

Llamando nuevamente a ratcoef podemos extraer el coeficiente deltermino de primer grado respecto de x,

(%i22) ratcoef(%,x);

( %o22) (2 b− 6) m− 4

Otro ejemplo ilstrativo de rat en accion,

5.1. TRANSFORMACIONES SIMBOLICAS 57

(%i23) rat((x^b+a*x^b+x)^2, x^b);

( %o23)(a2 + 2 a+ 1

) (xb)2

+ (2 a+ 2) xxb + x2

Si en algun momento queremos inhibir las simplificaciones, podemos ha-cer uso de la variable global simp, cuyo valor por defecto es true,

(%i24) simp: false$

(%i25) 2 + 2 + a + a;

( %o25) 2 + 2 + a+ a

(%i26) simp: true$

(%i27) %o25;

( %o27) 2 a+ 4

Veamos ahora algunas transformaciones que se pueden hacer con frac-ciones algebraicas.

(%i28) expr:(x^2-x)/(x^2+x-6)-5/(x^2-4);

( %o28)x2 − x

x2 + x− 6− 5

x2 − 4

Podemos factorizar esta expresion,

(%i29) factor(expr);

( %o29)(x− 3)

(x2 + 4x+ 5

)(x− 2) (x+ 2) (x+ 3)

La expansion devuelve el siguiente resultado,

(%i30) expand(expr);

( %o30)x2

x2 + x− 6− x

x2 + x− 6− 5

x2 − 4

Ahora descomponemos la fraccion algebraica expr en fracciones simples,

(%i31) partfrac(expr,x);

58 CAPITULO 5. ALGEBRA

( %o31) − 12

5 (x+ 3)+

5

4 (x+ 2)− 17

20 (x− 2)+ 1

Por ultimo, transformamos la misma expresion a su forma canonica CRE(Cannonical Rational Expression), que es un formato que Maxima utilizapara reducir expresiones algebraicas equivalentes a una forma unica,

(%i32) radcan(expr);

( %o32)x3 + x2 − 7x− 15

x3 + 3x2 − 4x− 12

La funcion ratsimp tambien simplifica cualquier expresion racional, ası co-mo las subexpresiones racionales que son argumentos de funciones cuales-quiera. El resultado se devuelve como el cociente de dos polinomios. Enocasiones no es suficiente con una sola ejecucion de ratsimp, por lo quesera necesario aplicarla mas veces, esto es lo que hace precisamente la fun-cion fullratsimp; concretemos esto con un ejemplo:

(%i33) (x^(a/2)-1)^2*(x^(a/2)+1)^2 / (x^a-1);

( %o33)

(x

a2 − 1

)2 (x

a2 + 1

)2

xa − 1

(%i34) ratsimp(%); /* simplificamos una vez */

( %o34)x2 a − 2xa + 1

xa − 1

(%i35) ratsimp(%); /* simplificamos otra vez */

( %o35) xa − 1

(%i36) fullratsimp(%o32); /* ¡simplificamos todo de una vez! */

( %o36) xa − 1

Dada una fraccion algebraica, podemos obtener separadamente el nume-rador y el denominador,

(%i37) fr: (x^3-4*x^2+4*x-2)/(x^2+x+1);

( %o37)x3 − 4x2 + 4x− 2

x2 + x+ 1

5.1. TRANSFORMACIONES SIMBOLICAS 59

(%i38) num(fr);

( %o38) x3 − 4x2 + 4x− 2

(%i39) denom(fr);

( %o39) x2 + x+ 1

Maxima nunca puede adivinar a priori las intenciones del usuario paracon las expresiones con las que esta trabajando, por ello sigue la polıtica deno tomar ciertas decisiones, por lo que a veces puede parecer que no hacelo suficiente o que no sabe hacerlo. Esta forma vaga de proceder la suplecon una serie de funciones y variables globales que permitiran al usuariodarle al motor simbolico ciertas directrices sobre que debe hacer con lasexpresiones, como reducirlas o transformarlas. Sin animo de ser exhaustivos,siguen algunos ejemplos en los que se controlan transformaciones de tipologarıtmico y trigonometrico.

Expresiones logarıtmicas

Las expresiones que contienen logaritmos suelen ser ambiguas a la ho-ra de reducirlas. Transformamos a continuacion la misma expresion segundiferentes criterios,

(%i1) log(x^r)-log(x*y) + a*log(x/y);

( %o1) − log (x y) + a log

(x

y

)+ r log x

En principio, ha hecho la transformacion log xr → r log x. Esto se con-trola con la variable global logexpand, cuyo valor por defecto es true, locual solo permite la reduccion recien indicada. Si tambien queremos que nosexpanda los logaritmos de productos y divisiones, le cambiaremos el valor aesta variable global, tal como se indica a continuacion,

(%i2) logexpand: super$

(%i3) log(x^r)-log(x*y) + a*log(x/y);

( %o3) − log y + a (log x− log y) + r log x− log x

(%i4) /* pedimos que nos simplifique la expresion anterior */

ratsimp(%);

60 CAPITULO 5. ALGEBRA

( %o4) (−a− 1) log y + (r + a− 1) log x

En caso de no querer que nos haga transformacion alguna sobre la ex-presion de entrada, simplemente haremos

(%i5) logexpand: false$

(%i6) log(x^r)-log(x*y) + a*log(x/y);

( %o6) − log (x y) + a log

(x

y

)+ log xr

Devolvemos ahora la variable logexpand a su estado por defecto,

(%i7) logexpand: true$

La funcion logcontract es la que nos va a permitir compactar expre-siones logarıtmicas,

(%i8) logcontract(2*(a*log(x) + 2*a*log(y)));

( %o8) a log(x2 y4

)Por defecto, Maxima contrae los coeficientes enteros; para incluir en este

caso la variable a dentro del logaritmo le asignaremos la propiedad de serun numero entero,

(%i9) declare(a, integer)$

(%i10) ’’%i8; /* fuerza reevaluacion de expresion nominal */

( %o10) log(x2 a y4 a

)Esta es una forma de hacerlo, pero Maxima permite un mayor refinamien-

to sobre este particular haciendo uso de la variable global logconcoeffp.

Expresiones trigonometricas

Toda esta casuıstica de diferentes formas de representar una mismaexpresion aumenta considerablemente con aquellas en las que intervienenlas funciones trigonometricas e hiperbolicas. Empecemos con la funciontrigexpand, cuyo comportamiento se controla con las variables globalestrigexpand (que le es homonima), trigexpandplus y trigexpandtimes,cuyos valores por defectos son, respectivamente, false, true y true. Puestosa experimentar, definamos primero una expresion trigonometrica e interpre-tamos algunos resultados,

5.1. TRANSFORMACIONES SIMBOLICAS 61

(%i1) expr: x+sin(3*x+y)/sin(x);

( %o1)sin (y + 3x)

sinx+ x

(%i2) trigexpand(expr); /* aquı trigexpand vale false */

( %o2)cos (3x) sin y + sin (3x) cos y

sinx+ x

Vemos que solo se desarrollo la suma del numerador; ahora cambiamosel valor logico de trigexpand,

(%i3) trigexpand(expr), trigexpand=true;

( %o3)

(cos3 x− 3 cosx sin2 x

)sin y +

(3 cos2 x sinx− sin3 x

)cos y

sinx+ x

Cuando la asignacion de la variable global se hace como se acaba deindicar, solo tiene efecto temporal durante esa ejecucion, sin haberse altera-do a nivel global. Podemos ordenar a Maxima que simplifique la expresionanterior,

(%i4) ratsimp(%);

( %o4)

−(3 cosx sin2 x− cos3 x

)sin y +

(sin3 x− 3 cos2 x sinx

)cos y − x sinx

sinx

Podemos inhibir el desarrollo de la suma,

(%i5) trigexpand(expr), trigexpandplus=false;

( %o5)sin (y + 3x)

sinx+ x

Otra variable global de interes, que no tiene nada que ver con la funciontrigexpand, es halfangles, con valor false por defecto, que controla si sereducen los argumentos trigonometricos con denominador dos,

(%i6) sin(x/2);

( %o6) sin(x

2

)(%i7) sin(x/2), halfangles=true;

62 CAPITULO 5. ALGEBRA

( %o7)

√1− cosx√

2

La funcion trigsimp fuerza el uso de las identidades fundamentalessin2 x+ cos2 x = 1 y cosh2 x− sinh2 x = 1 para simplificar expresiones,

(%i8) 5*sin(x)^2 + 4*cos(x)^2;

( %o8) 5 sin2 x+ 4 cos2 x

(%i9) trigsimp(%);

( %o9) sin2 x+ 4

Como un ultimo ejemplo, veamos como reducir productos y potenciasde funciones trigonometricas a combinaciones lineales,

(%i10) -sin(x)^2+3*cos(x)^2*tan(x);

( %o10) 3 cos2 x tanx− sin2 x

(%i11) trigreduce(%);

( %o11)3 sin (2x)

2+

cos (2x)

2− 1

2

Y si queremos transformar expresiones trigonometricas en complejas,

(%i12) exponentialize(%);

( %o12)e2 i x + e−2 i x

4−

3 i(e2 i x − e−2 i x

)4

− 1

2

Otras funciones utiles en este contexto y que el usuario podra consultaren la documentacion son: triginverses, trigsign y trigrat.

5.2. ECUACIONES 63

5.2. Ecuaciones

Almacenar una ecuacion en una variable es tan simple como hacer

(%i1) ec: 3 * x = 1 + x;

( %o1) 3x = x+ 1

A partir de ahı, aquellas operaciones en las que intervenga la variableseran realizadas a ambos miembros de la igualdad; restamos x en los doslados y a continuacion dividimos lo que queda entre 2,

(%i2) %-x;

( %o2) 2x = 1

(%i3) %/2;

( %o3) x =1

2

obteniendo de esta manera la solucion de la ecuacion como si hubiesemosoperado manualmente.

Ni que decir tiene que la ecuacion anterior se pudo haber resuelto de unmodo mas inmediato,

(%i4) solve(ec);

( %o4)

[x =

1

2

]La instruccion solve puede admitir como segundo argumento la incogni-

ta que se pretende calcular, lo que resultara de utilidad cuando en la ecuacionaparezcan constantes literales,

(%i5) solve((2-a)/x-3=b*x+1/x,x);

( %o5)

[x = −

√(4− 4 a) b+ 9 + 3

2 b, x =

√(4− 4 a) b+ 9− 3

2 b

]

Las soluciones de las ecuaciones seran probablemente utilizadas en calcu-los posteriores, por lo que nos interesara poder extraerlas de la lista anterior;a continuacion tomamos el primer resultado calculado por Maxima mediantela funcion part y despues asignamos a la variable sol el resultado numerico,

(%i6) part(%,1);

64 CAPITULO 5. ALGEBRA

( %o6) x = −√

(4− 4 a) b+ 9 + 3

2 b

(%i7) sol: rhs(%);

( %o7) −√

(4− 4 a) b+ 9 + 3

2 b

La funcion rhs devuelve el miembro derecho de la igualdad, mientrasque lhs harıa lo propio con el miembro izquierdo.

Es posible resolver ecuaciones polinomicas de grado ≤ 4, pero desgra-ciadamente, como es de esperar, Maxima no dispone de un metodo generalalgebraico que permita resolver ecuaciones polinomicas de grado mayor quecuatro,

(%i8) solve(x^5 - 3*x^4 + 2*x^3 -2*x^2 - x + 4 = 0);

( %o8)[0 = x5 − 3x4 + 2x3 − 2x2 − x+ 4

]por lo que solve devolvera la misma ecuacion sin resolver.

Tambien solve se puede utilizar para la resolucion de sistemas, en cuyocaso las ecuaciones deben ir agrupadas en una lista, ası como las incognitas;nos planteamos la resolucion del siguiente sistema no lineal de incognitas xe y, {

3 ∗ x2 − y2 = 6x = y + a

(%i9) solve([3*x^2-y^2=6,x=y+a],[x,y]);

( %o9)

[[x = −

√3√a2+4+a2 , y = −

√3√a2+4+3 a

2

],[

x =√

3√a2+4−a2 , y =

√3√a2+4−3 a

2

]]Una alternativa al uso de solve es la funcion algsys. Veamos como

algsys trata la resolucion de la ecuacion polinomica anterior %o8,

(%i10) algsys([x^5 - 3*x^4 + 2*x^3 -2*x^2 - x + 4 = 0],[x]);

( %o10)[[x = 2.478283086356668] , [x = .1150057557117295− 1.27155810694299 i] ,[x = 1.27155810694299 i+ .1150057557117295] , [x = −.8598396689940523] ,

[x = 1.151545166402536]]

Como se ve, al no ser capaz de resolverla algebraicamente, nos brindala oportunidad de conocer una aproximacion numerica de la solucion. Lafuncion algsys reconoce la variable global realonly, que cuando toma elvalor true, hara que se ignoren las soluciones complejas,

5.2. ECUACIONES 65

(%i11) realonly:true$

(%i12) ’’%i10; /* recalcula la entrada %i10 */

( %o12)[[x = 2.478283086356668] , [x = 1.151545166402536] , [x = −.8598396689940523]]

(%i13) realonly:false$ /* le devolvemos el valor por defecto */

Un sistema no lineal con coeficientes parametricos y complejos3u− av = t

2+iu+t = 3v + utu = 1

(%i14) algsys([3*u-a*v=t,(2+%i)/(u+t)=3*v+u,t/u=1],[u,v,t]);

( %o14)

[[u =

√i aa+6

+ 2 aa+6√

2, v = 2

√i+2√

2√a√a+6

, t =√i+2√a√

2√a+6

],[

u = −√

i aa+6

+ 2 aa+6√

2, v = − 2

√i+2√

2√a√a+6

, t = −√i+2√a√

2√a+6

]]

Veamos como trata algsys las ecuaciones indeterminadas, devolviendola solucion en terminos parametricos,

(%i15) algsys([3*x^2-5*y=x],[x,y]);

( %o15)

[[x = %r1 , y =

3 %r12 − %r15

]]

(%i16) %, %r1:1;

( %o16)

[[x = 1, y =

2

5

]]Maxima nombra los parametros siguiendo el esquema %rn, siendo n un

numero entero positivo. En la entrada %i16 pedimos que en %o15 se sustituyael parametro por la unidad.

En ocasiones conviene eliminar las variables de los sistemas de formacontrolada; en tales casos la funcion a utilizar sera eliminate,

(%i17) eliminate([3*u-a*v=t,(2+%i)/(u+t)=3*v+u,t/u=1],[u]);

66 CAPITULO 5. ALGEBRA

( %o17)[2 t− a v,−

(a2 + 9 a

)v2 − (5 a+ 36) t v − 4 t2 + 9 i+ 18

]Cuando de lo que se trata es de resolver un sistema de ecuaciones lineales,

la mejor opcion es linsolve, cuya sintaxis es similar a la de las funcionesanteriores. En el siguiente ejemplo, el objetivo es

2x − 4y + 2z = −213x + 2y + 9z = x+ y

−4x +√

2y + z = 3y

(%i18) linsolve(

[ 2 * x - 4 * y + 2 * z = -2,

1/3* x + 2 * y + 9 * z = x + y,

-4 * x + sqrt(2) * y + z = 3 * y],

[x,y,z]);

( %o18)

[x =

3021√

2− 12405

48457, y =

1537√

2 + 16642

48457, z =

53√

2− 2768

48457

]

Cuando la matriz de coeficientes del sistema es dispersa, la funcionfast_linsolve sera preferible, ya que aprovechara tal circunstancia paraencontrar las soluciones de forma mas rapida.

Si los coeficientes del sistema se tienen en formato matricial, quizas seamas apropiado el uso de la funcion linsolve_by_lu, tal como se indica enla seccion dedicada a las matrices.

No todo es resoluble simbolicamente. Existen en Maxima varios pro-cedimientos cuya naturaleza es estrictamente numerica. Uno de ellos esrealroots, especializado en el calculo de aproximaciones racionales de lasraıces reales de ecuaciones polinomicas; el segundo parametro, que es opcio-nal, indica la cota de error.

(%i19) realroots(x^8+x^3+x+1, 5e-6);

( %o19)

[x = −1, x = −371267

524288

]En cambio, allroots obtiene aproximaciones en formato decimal de

coma flotante de todas las raıces de las ecuaciones polinomicas, tanto realescomo complejas,

(%i20) allroots(x^8+x^3+x+1);

5.2. ECUACIONES 67

( %o20)[x = .9098297401801199 i+ .2989522918873167, ,x = .2989522918873167− .9098297401801199 i ,x = −.7081337759784606, x = .9807253637807569 i− .4581925662678885 ,x = −.9807253637807569 i− .4581925662678885, ,x = .5359278244124014 i+ 1.013307162369803 ,x = 1.013307162369803− .5359278244124014 i, x = −1.000000000000001]

Mas alla de las ecuaciones algebraicas, find_root utiliza el metodo debiparticion para resolver ecuaciones en su mas amplio sentido,

(%i21) f(x):=144 * sin(x) + 12*sqrt(3)*%pi - 36*x^2 - 12*%pi*x$

(%i22) find_root(f(z),z,1,2);

( %o22) 1.899889962840263

El uso del metodo de Newton requiere cargar en memoria el modulocorrespondiente. Veamos como ejemplo la ecuacion

2uu − 5 = u

(%i23) load(mnewton)$ /* carga el paquete */

(%i24) mnewton([2*u^u-5],[u],[1]);

0 errors, 0 warnings

( %o14) [[u = 1.70927556786144]]

y el sistema {x+ 3 log(x)− y2 = 0

2x2 − xy − 5x+ 1 = 0

(%i25) mnewton([x+3*log(x)-y^2, 2*x^2-x*y-5*x+1],[x, y], [5, 5]);

( %o25) [[x = 3.756834008012769, y = 2.779849592817897]]

(%i26) mnewton([x+3*log(x)-y^2, 2*x^2-x*y-5*x+1],[x, y], [1, -2]);

( %o26) [[x = 1.373478353409809, y = −1.524964836379522]]

En los anteriores ejemplos, el primer argumento es una lista con la ecua-cion o ecuaciones a resolver, las cuales se suponen igualadas a cero; el se-gundo argumento es la lista de variables y el ultimo el valor inicial a partirdel cual se generara el algoritmo y cuya eleccion determinara las diferentessoluciones del problema.

68 CAPITULO 5. ALGEBRA

5.3. Inecuaciones

Las rutinas para resolver inecuaciones las guarda Maxima en el paque-te de funciones fourier_elim, por lo que primero las debemos cargar enmemoria,

(%i1) load("fourier_elim")$

Ciertos mensajes de avisos que nos devuelve Maxima los podemos olvi-dar, ya que solo nos indican que algunas macros del sistema han tenido queser redefinidas.

Vamos a resolver una inecuacion de primer grado,

(%i2) ine : (5*x-16)/6 + (x+8)/12 < (x+1)/3;

( %o2)5x− 16

6+x+ 8

12<x+ 1

3

La funcion clave a llamar se llama precisamente fourier_elim y la sin-taxis es similar a la de solve; el primer argumento a pasarle es la listade inecuaciones, de momento una sola, y el segundo la lista de incognitas,tambien una sola,

(%i3) fourier_elim([ine], [x]);

( %o3) [x < 4]

Vamos a ver ahora en que intervalos de la recta el polinomio x4 + 5x3 +5x2 − 5x− 6 toma valores positivos,

(%i4) p : x^4+5*x^3+5*x^2-5*x-6 $

(%i5) fourier_elim([p > 0],[x]);

( %o5) [1 < x] ∨ [−2 < x, x < −1] ∨ [x < −3]

Tal como se ha visto hasta ahora, la funcion fourier_elim nos devuelvelos resultados como disyunciones de listas, interpretandose cada una de ellascomo una conjuncion logica de proposiciones; ası, el ultimo resultado habrıaque interpretarlo como

(1 < x) ∨ (−2 < x ∧ x < −1) ∨ (x < −3).

El resultado anterior cambia sensiblemente cuando admitimos la igual-dad en la inecuacion,

5.3. INECUACIONES 69

(%i6) fourier_elim([p >= 0],[x]);

( %o6)[x = −3]∨[x = −2]∨[x = −1]∨[x = 1]∨[1 < x]∨[−2 < x, x < −1]∨[x < −3]

Abordamos ahora la resolucion de un sistema de inecuaciones linealescon una incognita,

(%i7) fourier_elim(

[(x+2)/4 <= x/2-3, (8-x)/3 < (1+x)/2-1],

[x]);

( %o7) [x = 14] ∨ [14 < x]

Ahora con tres,

(%i8) fourier_elim(

[0 < x,

x < 1,

0 < y+x*y,

y-2*z+x < 1,

0 < z,

x+y+z < 4],

[z,x,y] );

( %o8)[max

(0,y

2+x

2− 1

2

)< z, z < −y − x+ 4, 0 < x, x < min (1, 3− y) , 0 < y, y < 3

]Otros ejemplos de inecuaciones no lineales,

(%i9) fourier_elim([max(x,y) < 1, min(x,y) > -1],[x,y]);

( %o19) [−1 < x, x < 1,−1 < y, y < 1]

(%i10) fourier_elim([abs(x) + abs(x/2) + abs(x/3) # 1],[x]);

( %o10)

[x = 0] ∨[0 < x, x <

6

11

]∨[− 6

11< x, x < 0

]∨[x < − 6

11

]∨[

6

11< x

](%i11) fourier_elim([log(x) < log(a)],[x,a]);

( %o11) [0 < x, x < a, 0 < a]

70 CAPITULO 5. ALGEBRA

5.4. Matrices

La definicion de una matriz es extremadamente simple en Maxima,

(%i1) m1: matrix([3,4,0],[6,0,-2],[0,6,a]);

( %o1)

3 4 06 0 −20 6 a

Tambien es posible definir una matriz de forma interactiva tal y como

muestra el siguiente ejemplo,

(%i2) entermatrix(2,3);

Row 1 Column 1:

4/7;

Row 1 Column 2:

0;

Row 1 Column 3:

%pi;

Row 2 Column 1:

sqrt(2);

Row 2 Column 2:

log(3);

Row 2 Column 3:

-9;

Matrix entered.

( %o2)

(47 0 π√2 log 3 −9

)Existe un tercer metodo para construir matrices que es util cuando el

elemento (i, j)-esimo de la misma es funcion de su posicion dentro de lamatriz. A continuacion, se fija en primer lugar la regla que permite definirun elemento cualquiera y luego en base a ella se construye una matriz dedimensiones 2× 5

(%i3) a[i,j]:=i+j$

(%i4) genmatrix(a,2,5);

( %o4)

(2 3 4 5 63 4 5 6 7

)Observese que el sımbolo de asignacion para el elemento generico es :=.

Podemos acceder a los diferentes elementos de la matriz haciendo refe-rencia a sus subındices, indicando primero la fila y despues la columna:

5.4. MATRICES 71

(%i5) m1[3,1];

( %o5) 0

Se puede extraer una submatriz con la funcion submatrix, teniendo encuenta que los enteros que preceden al nombre de la matriz original sonlas filas a eliminar y los que se colocan detras indican las columnas que nointeresan; en el siguiente ejemplo, queremos la submatriz que nos queda dem1 despues de extraer la primera fila y la segunda columna,

(%i6) submatrix(1,m1,2);

( %o6)

(6 −20 a

)Otro ejemplo es el siguiente,

(%i7) submatrix(1,2,m1,3);

( %o7)(0 6

)en el que eliminamos las dos primeras filas y la ultima columna, ¿se pilla eltruco?

Al igual que se extraen submatrices, es posible anadir filas y columnas auna matriz dada; por ejemplo,

(%i8) addrow(m1,[1,1,1],[2,2,2]);

( %o8)

3 4 06 0 −20 6 a1 1 12 2 2

(%i9) addcol(%,[7,7,7,7,7]);

( %o9)

3 4 0 76 0 −2 70 6 a 71 1 1 72 2 2 7

La matriz identidad es mas facil construirla mediante la funcion ident,

(%i10) ident(3);

72 CAPITULO 5. ALGEBRA

( %o10)

1 0 00 1 00 0 1

y la matriz con todos sus elementos iguales a cero,

(%i11) zeromatrix(2,4);

( %o11)

(0 0 0 00 0 0 0

)Tambien, una matriz diagonal con todos los elementos de la diagonal

principal iguales puede construirse con una llamada a la funcion diagmatrix,

(%i12) diagmatrix(4,%e);

( %o12)

e 0 0 00 e 0 00 0 e 00 0 0 e

En todo caso, debe tenerse cuidado en que si la matriz no se construye

de forma apropiada, Maxima no la reconoce como tal. Para saber si unaexpresion es reconocida como una matriz se utiliza la funcion matrixp; lasiguiente secuencia permite aclarar lo que se pretende decir,

(%i13) matrix([[1,2,3],[4,5,6]]); /* construccion correcta */

( %o13)([1, 2, 3] [4, 5, 6]

)(%i14) matrixp(%); /* es la anterior realmente una matriz? */

( %o14) true

(%i15) [[7,8,9],[0,1,2]]; /* otra matriz */

( %o15) [[7, 8, 9] , [0, 1, 2]]

(%i16) matrixp(%); /* sera una matriz? */

( %o16) false

Casos particulares de submatrices son las filas y las columnas; los ejem-plos se explican por sı solos:

5.4. MATRICES 73

(%i17) col(m1,3);

( %o17)

0−2a

(%i18) row(m1,2);

( %o18)(6 0 −2

)Con las matrices se pueden realizar multiples operaciones. Empezamos

por el calculo de la potencia de una matriz:

(%i19) m1^^2;

( %o19)

33 12 −818 12 −2 a36 6 a a2 − 12

Notese que se utiliza dos veces el sımbolo ^ antes del exponente; en caso

de escribirlo una sola vez se calcularıan las potencias de cada uno de loselementos de la matriz independientemente, como se indica en el siguienteejemplo,

(%i20) m2:m1^2;

( %o38)

9 16 036 0 40 36 a2

Para la suma, resta y producto matriciales se utilizan los operadores +,

- y ., respectivamente,

(%i21) m1+m2;

( %o21)

12 20 042 0 20 42 a2 + a

(%i22) m1-m2;

( %o22)

−6 −12 0−30 0 −6

0 −30 a− a2

74 CAPITULO 5. ALGEBRA

(%i23) m1.m2;

( %o23)

171 48 1654 24 −2 a2

216 36 a a3 + 24

Sin embargo, tanto el producto elemento a elemento de dos matrices,

como la multiplicacion por un escalar se realizan mediante el operador *,como indican los siguientes dos ejemplos,

(%i24) m1*m2;

( %o24)

27 64 0216 0 −80 216 a3

(%i25) 4*m1;

( %o25)

12 16 024 0 −80 24 4 a

Otros calculos frecuentes con matrices son la transposicion, el determi-

nante, la inversion, el polinomio caracterıstico, ası como los valores y vectorespropios; para todos ellos hay funciones en Maxima:

(%i26) transpose(m1); /*la transpuesta*/

( %o26)

3 6 04 0 60 −2 a

(%i27) determinant(m1); /*el determinante*/

( %o27) 36− 24 a

(%i28) invert(m1); /*la inversa*/

( %o28)

1236−24 a − 4 a

36−24 a − 836−24 a

− 6 a36−24 a

3 a36−24 a

636−24 a

3636−24 a − 18

36−24 a − 2436−24 a

(%i29) invert(m1),detout; /*la inversa, con el determinante fuera*/

5.4. MATRICES 75

( %o29)

12 −4 a −8−6 a 3 a 636 −18 −24

36− 24 a

(%i30) charpoly(m1,x); /*pol. caract. con variable x*/

( %o30) (3− x) (12− (a− x) x)− 24 (a− x)

(%i31) expand(%); /*pol. caract. expandido*/

( %o31) −x3 + a x2 + 3x2 − 3 a x+ 12x− 24 a+ 36

Vamos a suponer ahora que a vale cero y calculemos los valores propiosde la matriz,

(%i32) m1,a=0;

( %o32)

3 4 06 0 −20 6 0

(%i33) eigenvalues(%);

( %o33)

[[−√

15 i+ 3

2,

√15 i− 3

2, 6

], [1, 1, 1]

]El resultado que se obtiene es una lista formada por dos sublistas, en

la primera se encuentran los valores propios, que en este caso son λ1 =

−32 −

√152 i, λ2 = −3

2 +√

152 i y λ3 = 6, mientras que en la segunda sublista

se nos indican las multiplicidades de cada una de las λi.Para el calculo de los vectores propios,

(%i34) eigenvectors(%o32);

( %o34)

[[[−√

15 i+32 ,

√15 i−3

2 , 6], [1, 1, 1]

],[

1,−√

15 i+98 ,−3

√3√

5 i−218

],[1,√

15 i−98 , 3

√3√

5 i+218

],[1, 3

4 ,34

]]Lo que se obtiene es, en primer lugar, los valores propios junto con sus

multiplicidades, el mismo resultado que se obtuvo con la funcion eigenvalues,y a continuacion los vectores propios de la matriz asociados a cada uno de losvalores propios. A veces interesa que los vectores sean unitarios, de norma 1,para lo que sera de utilidad la funcion uniteigenvectors, que se encuentradefinida en el paquete eigen.lisp, lo que significa que antes de hacer uso deella habra que ejecutar la orden load(eigen). Tambien podemos solicitarlos vectores propios unitarios por medio de la funcion uniteigenvectors,

76 CAPITULO 5. ALGEBRA

(%i35) uniteigenvectors(%o32);

( %o35)

[[[−√

15 i+32 ,

√15 i−3

2 , 6], [1, 1, 1]

],[ √

2√23,−√

2√

15 i+9√

28√

23,−3

√2√

3√

5 i−21√

28√

23

],[ √

2√23,√

2√

15 i−9√

28√

23, 3√

2√

3√

5 i+21√

28√

23

],[

2√

2√17, 3√

22√

17, 3√

22√

17

]]El rango, el menor de un elemento y una base del espacio nulo de cierta

matriz pueden calcularse, respectivamente, con las funciones rank, minor ynullspace,

(%i36) rank(%o32); /* el rango de la matriz*/

( %o36) 3

(%i37) minor(%o32,2,1); /* el menor de un elemento */

( %o37)

(4 06 0

)(%i38) nullspace(%o32); /* base del nucleo */

0 errors, 0 warnings

( %o38) span ()

que es la respuesta que se obtiene cuando el espacio nulo esta formado porun unico elemento.

De forma similar a como la instruccion map aplica una funcion a todoslos elementos de una lista, matrixmap hace lo propio con los elementos deuna matriz,

(%i39) matrixmap(sin,%o32);

( %o39)

sin 3 sin 4 0sin 6 0 − sin 2

0 sin 6 0

Avancemos un poco mas en otros aspectos del algebra lineal. Empezamos

con el calculo de la matriz de Jordan J de cierta matriz dada A, esto es, lamatriz que verifica A = SJS−1, para cierta S. Para ello es necesario cargarpreviamente el paquete diag, se introduce la matriz A y la funcion jordan

se encargara de obtener lo que buscamos en un formato que luego utilizamospara obtener las matrices J y S. Finalmente, comprobamos los resultados:

5.4. MATRICES 77

(%i40) A: matrix([2,4,-6,0],[4,6,-3,-4],[0,0,4,0],[0,4,-6,2]);

( %o40)

2 4 −6 04 6 −3 −40 0 4 00 4 −6 2

(%i41) load(diag)$ jl: jordan(A);

( %o42) [[6, 1] , [2, 2] , [4, 1]]

(%i43) J: dispJordan(jl);

( %o43)

6 0 0 00 2 1 00 0 2 00 0 0 4

(%i44) S: ModeMatrix (A,jl);

( %o44)

1 4 0 01 0 1 10 0 0 2

31 4 1 0

(%i45) is(A = S.J.(S^^-1));

( %o45) true

Cuando los coeficientes de un sistema lineal se tengan en forma matricialy los terminos independientes en un vector, el sistema se podra resolver conla funcion linsolve_by_lu,

(%i46) A : matrix([sqrt(2),4],[a,4/5]);

( %o46)

(√2 4a 4

5

)(%i47) B : [1/3,a];

78 CAPITULO 5. ALGEBRA

( %o47)

[1

3, a

]Resolvemos ahora AX = B y luego simplificamos algo el resultado

(%i48) linsolve_by_lu(A,B);

( %o48)

13−

4

(a− a

3√2

)45−2

√2 a√

2a− a

3√2

45−2√

2 a

, false

(%i49) ratsimp(%);

( %o49)

15√

2 a−√

215√

2 a−6

−(15√

2−5) a60 a−12

√2

, false

El resultado que se obtiene es una lista que contiene la solucion y el

sımbolo false. Cuando la resolucion del sistema sea de ındole numerica,esta segunda componente sera sustituida por el numero de condicion, unamedida de la bondad del resultado numerico. Veamos de aplicar esto a ciertaecuacion matricial del estilo MX = MM

(%i50) M : matrix([sqrt(3),2/5],[3,sin(2)]);

( %o50)

(√3 2

53 sin 2

)(%i51) linsolve_by_lu(M,M.M,’floatfield);

( %o51)[(1.732050807568877 .40000000000000053.000000000000001 .9092974268256803

), 49.33731560796254

]Veamos ahora como obtener algunas matrices especiales: la hessiana de

una funcion, la de Hilbert, la de Toeplitz, la de Vandermone y la de Hankel,

(%i52) hessian(exp(x^2*y+a*z),[x,y,z]);

( %o52)4x2 y2 ea z+x2 y + 2 y ea z+x

2 y 2x3 y ea z+x2 y + 2x ea z+x

2 y 2 a x y ea z+x2 y

2x3 y ea z+x2 y + 2x ea z+x

2 y x4 ea z+x2 y a x2 ea z+x

2 y

2 a x y ea z+x2 y a x2 ea z+x

2 y a2 ea z+x2 y

5.4. MATRICES 79

(%i53) hilbert_matrix(5);

( %o53)

1 1

213

14

15

12

13

14

15

16

13

14

15

16

17

14

15

16

17

18

15

16

17

18

19

(%i54) toeplitz([1,2,3,4],[t,x,y,z]);

( %o54)

1 x y z2 1 x y3 2 1 x4 3 2 1

(%i55) vandermonde_matrix([u,v,x,y,z]);

0 errors, 0 warnings

( %o55)

1 u u2 u3 u4

1 v v2 v3 v4

1 x x2 x3 x4

1 y y2 y3 y4

1 z z2 z3 z4

(%i56) hankel ([v,x,y,z],[p,q,r,s]);

( %o56)

v x y zx y z qy z q rz q r s

El lector interesado puede obtener informacion sobre otras funciones ma-

triciales accediendo a la documentacion sobre el paquete linearalgebra.

Veamos ahora como trabajar con matrices por bloques. Puesto que loselementos de una matriz pueden ser objetos de cualquier tipo, definamos loselementos como matrices,

(%i57) m: matrix([matrix([1,0],[0,-1]),matrix([0,1],[1,0])],

[matrix([0,1],[1,0]),matrix([1,0],[0,-1])]) ;

80 CAPITULO 5. ALGEBRA

( %o57)

(

1 00 −1

) (0 11 0

)(

0 11 0

) (1 00 −1

)

Podemos ahora hacer algunas operaciones basicas con esta matriz,

(%i58) m + m ;

( %o58)

(

2 00 −2

) (0 22 0

)(

0 22 0

) (2 00 −2

)

(%i59) m - m ;

( %o59)

(

0 00 0

) (0 00 0

)(

0 00 0

) (0 00 0

)

(%i60) 3 * m ;

( %o60)

(

3 00 −3

) (0 33 0

)(

0 33 0

) (3 00 −3

)

Veamos lo que pasa con la multiplicacion matricial,

(%i61) m . m ;

( %o61)

(

1 11 1

) (0 00 0

)(

0 00 0

) (1 11 1

)

Este resultado es incorrecto porque en la multiplicacion matricial, losproductos entre elementos se hacen con el operador *, que es el correctocuando los elementos son numeros; pero cuando los elementos son tambienmatrices, la multiplicacion de elementos debe realizarse con el operador delproducto matricial. En el ejemplo anterior, los bloques se multiplicaron ele-mento a elemento. Para indicarle a Maxima la operacion correcta, debemoshacer uso de la variable global matrix_element_mult,

5.5. PATRONES Y REGLAS 81

(%i62) matrix_element_mult : "." $

(%i63) m . m ;

( %o63)

(

2 00 2

) (0 00 0

)(

0 00 0

) (2 00 2

)

5.5. Patrones y reglas

En un programa de calculo simbolico, este no solo debe tener informacionsobre una funcion u operacion a partir de su definicion, sino que tambienhabra propiedades y reglas de transformacion de expresiones de las que unprograma como Maxima debe tener noticia.

Nos planteamos la siguiente situacion: necesitamos trabajar con una fun-cion G(x, y) que, independientemente de que este definida o no, sabemos que

es igual a la expresion H(x,y)x en todo su dominio, siendo H(x, y) otra fun-

cion; queremos que la primera expresion sea sustituıda por la segunda yademas queremos tener bajo control estas sustituciones. Todo ello se consi-gue trabajando con patrones y reglas.

Antes de definir la regla de sustitucion es necesario saber a que patro-nes sera aplicable, para lo cual admitiremos que los argumentos de G(x, y)pueden tener cualquier forma:

(%i1) matchdeclare ([x,y], true);

( %o1) done

En este caso, las variables patron seran x e y, siendo el segundo argu-mento una funcion de predicado1 que devolvera true si el patron se cumple;en el caso presente, el patron es universal y admite cualquier formato paraestas variables. Si quisiesemos que la regla se aplicase solo a numeros ente-ros, se deberıa escribir matchdeclare ([x,y], integerp); si quisiesemosque la regla se aplicase siempre que x sea un numero, sin imponer restric-ciones a y, escribirıamos matchdeclare (x, numberp, y, true). Como seve, los argumentos impares son variables o listas de variables y los pares lascondiciones de los patrones.

Se define ahora la regla de sustitucion indicada mas arriba, a la quellamaremos regla1,

1Se denominan ası todas aquellas funciones que devuelven como resultado de su eva-luacion true o false.

82 CAPITULO 5. ALGEBRA

(%i2) defrule (regla1, G(x,y), H(x,y)/x);

( %o2) regla1 : G (x, y)→ H (x, y)

x

Aplicamos ahora la regla a las expresiones G(f, 2+k) y G(G(4, 6), 2+k),

(%i3) apply1(G(f,2+k),regla1);

( %o3)H (f, k + 2)

f

(%i4) apply1(G(G(4,6),2+k),regla1);

( %o4)4H

(H(4,6)

4 , k + 2)

H (4, 6)

Como se ve en este ultimo ejemplo, la regla se aplica a todas las subex-presiones que contengan a la funcion G. Ademas, apply1 aplica la regladesde fuera hacia adentro. La variable global maxapplydepth indica a Ma-xima hasta que nivel puede bajar en la expresion para aplicar la regla; suvalor por defecto es 10000, pero se lo podemos cambiar,

(%i5) maxapplydepth;

( %o5) 10000

(%i6) maxapplydepth:1;

( %o6) 1

(%i7) apply1(G(G(4,6),2+k),regla1);

( %o7)H (G (4, 6) , k + 2)

G (4, 6)

Quizas sea nuestro deseo realizar la sustitucion desde dentro hacia fuera,controlando tambien a que niveles se aplica; applyb1 y maxapplyheight sonlas claves ahora.

(%i8) maxapplyheight:1;

( %o8) 1

5.5. PATRONES Y REGLAS 83

(%i9) applyb1(G(G(4,6),2+k),regla1);

( %o9) G

(H (4, 6)

4, k + 2

)Observese que hemos estado controlando el comportamiento de las fun-

ciones G y H sin haberlas definido explıcitamente, pero nada nos impidehacerlo,

(%i10) H(u,v):= u^v+1;

v

(%o10) H(u, v) := u + 1

(%i11) applyb1(G(G(4,6),2+k),regla1);

( %o11) G

(4097

4, k + 2

)Continuemos esta exposicion con un ejemplo algo mas sofisticado. Su-

pongamos que cierta funcion F verifica la igualdad

F (x1 + x2 + . . .+ xn) = F (x1) + F (x2) + . . .+ F (xn) + x1x2 . . . xn

y que queremos definir una regla que realice esta transformacion. Puestoque la regla se aplicara solo cuando el argumento de F sea un sumando,necesitamos una funcion de predicado que defina este patron,

(%i12) esunasuma(expr):= not atom(expr) and op(expr)="+" $

(%i13) matchdeclare(z,esunasuma)$

En la definicion de la nueva regla, le indicamos a Maxima que cada vezque se encuentre con la funcion F y que esta tenga como argumento unasuma, la transforme segun se indica: map(F, args(z)) aplica la funcion acada uno de los sumandos de z, sumando despues estos resultados con lafuncion apply, finalmente a este resultado se le suma el producto de lossumandos de z,

(%i14) defrule(regla2,

F(z),

apply("+",map(F, args(z))) + apply("*", args(z)));

( %o14) regla2 : F (z)→ apply (+,map (F, args (z))) + apply (*, args (z))

Veamos unos cuantos resultados de la aplicacion de esta regla,

(%i15) apply1(F(a+b), regla2);

84 CAPITULO 5. ALGEBRA

( %o15) F (b) + a b+ F (a)

(%i16) apply1(F(a+b), regla2) - apply1(F(a+c), regla2) ;

( %o16) −F (c)− a c+ F (b) + a b

(%i17) apply1(F(a+b+c), regla2);

( %o17) F (c) + a b c+ F (b) + F (a)

(%i18) apply1(F(4), regla2);

( %o18) F (4)

(%i19) apply1(F(4+5), regla2);

( %o19) F (9)

(%i20) simp:false$ /* inhibe la simplificacion de Maxima */

(%i21) apply1(F(4+5), regla2);

( %o21) 4 5 + (F (4) + F (5))

(%i22) simp:true$ /* restaura la simplificacion de Maxima */

(%i23) %o21;

( %o23) F (5) + F (4) + 20

En los ejemplos recien vistos, hemos tenido que indicar expresamente aMaxima en que momento debe aplicar una regla. Otro mecanismo de defi-nicion de reglas es el aportado por tellsimp y tellsimpafter; el primerodefine reglas a aplicar antes de que Maxima aplique las suyas propias, y elsegundo para reglas que se aplican despues de las habituales de Maxima.

Otra funcion util en estos contextos es declare, con la que se puedendeclarar propiedades algebraicas a nuevos operadores. A continuacion sedeclara una operacion de nombre o como infija (esto es, que sus operandos secolocan a ambos lados del operador); observese que solo cuando la operacionse declara como conmutativa Maxima considera que a o b es lo mismo queb o a, ademas, no ha sido necesario definir que es lo que hace la nuevaoperacion con sus argumentos,

(%i24) infix("o");

5.5. PATRONES Y REGLAS 85

( %o24) o

(%i25) is(a o b = b o a);

( %o25) false

(%i26) declare("o", commutative)$

(%i27) is(a o b = b o a);

( %o27) true

86 CAPITULO 5. ALGEBRA

Capıtulo 6

Calculo

6.1. Funciones matematicas

En Maxima estan definidas un gran numero de funciones, algunas de lascuales se presentan en la Figura 6.1. A continuacion se desarrollan algunosejemplos sobre su uso.

Empecemos por algunos ejemplos,

(%i1) log(%e);

( %o1) 1

(%i2) abs(-3^-x);

( %o2)1

3x

(%i3) signum(-3^-x);

( %o3) −1

La funcion genfact(m,n,p) es el factorial generalizado, de forma quegenfact(m,m,1) coincide con m!,

(%i4) genfact(5,5,1)-5!;

( %o4) 0

y genfact(m,m/2,2) es igual a m!!,

(%i5) genfact(5,5/2,2)-5!!;

87

88 CAPITULO 6. CALCULO

abs(x) abs(x)

min(x1,x2,...) mın(x1, x2, . . .)

max(x1,x2,...) max(x1, x2, . . .)

signum(x) signo(x) =

−1 si x < 0

0 si x = 01 si x > 0

x! x!

x!! x!!

binomial(m,n)(mn

)= m(m−1)...[m−(n−1)]

n!

genfact(m,n,p) m(m− p)(m− 2p) . . . [m− (n− 1)p]

sqrt(x)√x

exp(x) ex

log(x) ln(x)

sin(x) sin(x)

cos(x) cos(x)

tan(x) tan(x)

csc(x) csc(x)

sec(x) sec(x)

cot(x) cot(x)

asin(x) arcsin(x)

acos(x) arc cos(x)

atan(x) arctan(x)

atan2(x,y) arctan(xy ) ∈ (−π, π)

sinh(x) sinh(x) = 12(ex − e−x)

cosh(x) cosh(x) = 12(ex + e−x)

tanh(x) tanh(x) = sinh(x)cosh(x)

asinh(x) arcsinh(x)

acosh(x) arccosh(x)

atanh(x) arctanh(x)

gamma(x) Γ(x) =∫∞

0 e−uux−1du,∀x > 0

gamma_incomplete(a,x) Γ(a, x) =∫∞x e−tta−1dt

beta(a,b) B(a, b) = Γ(a)Γ(b)Γ(a+b)

beta_incomplete(a,b,x) B(a, b, x) =∫ x

0 (1− t)b−1ta−1dt

erf(x) erf(x) =∫ x

02√πe−u

2du

Figura 6.1: Algunas funciones de Maxima.

6.1. FUNCIONES MATEMATICAS 89

( %o5) 0

Maxima siempre devuelve resultados exactos, que nosotros podemos so-licitar en formato decimal,

(%i6) asin(1);

( %o6)π

2

(%i7) float(%);

( %o7) 1.570796326794897

Pero si damos el argumento en formato decimal, Maxima tambien de-vuelve el resultado en este mismo formato, sin necesidad de hacer uso defloat,

(%i8) asin(1.0);

( %o8) 1.570796326794897

Recordemos que el formato decimal lo podemos pedir con precision ar-bitraria,

(%i9) fpprec:50$ bfloat(%o8);

( %o9) 1.5707963267948966192313216916397514420985846996876B × 100

La funcion de error esta relacionada con la funcion de distribucion de lavariable aleatoria normal X ∼ N (0, 1) de la forma

Φ(x) = Pr(X ≤ x) =1

2+

1

2erf

(x√2

),

por lo que la probabilidad de que esta variable tome un valor menor que 1.5es

(%i10) 0.5+0.5*erf(1.5/sqrt(2)),numer;

( %o10) 0.9331927987311419

Una forma mas elegante de hacer lo anterior es definir nuestra propiafuncion de distribucion a partir de la de error, para lo que se hace uso delsımbolo :=,

90 CAPITULO 6. CALCULO

(%i11) F(x):=1/2+erf(x/sqrt(2))/2 $

(%i12) F(1.5),numer;

( %o12) 0.9331927987311419

No terminan aquı las funciones de Maxima; junto a las ya expuestashabrıa que incluir las funciones de Airy, elıpticas y de Bessel, sobre las quese podra obtener mas informacion ejecutando la instruccion ?? y utilizandocomo argumento airy, elliptic o bessel, segun el caso. Por ejemplo,

(%i13) ?? airy

0: airy_ai (Funciones y variables para las funciones especiales)

1: airy_bi (Funciones y variables para las funciones especiales)

2: airy_dai (Funciones y variables para las funciones especiales)

3: airy_dbi (Funciones y variables para las funciones especiales)

Enter space-separated numbers, ‘all’ or ‘none’: 0

-- Funcion: airy_ai (<x>)

Funcion Ai de Airy, tal como la definen Abramowitz y Stegun,

Handbook of Mathematical Functions, Seccion 10.4.

La ecuacion de Airy ‘diff (y(x), x, 2) - x y(x) = 0’ tiene dos

soluciones linealmente independientes, ‘y = Ai(x)’ y ‘y = Bi(x)’.

La derivada ‘diff (airy_ai(x), x)’ es ‘airy_dai(x)’.

Si el argumento ‘x’ es un numero decimal real o complejo, se

devolvera el valor numerico de ‘airy_ai’ siempre que sea posible.

Veanse ‘airy_bi’, ‘airy_dai’ y ‘airy_dbi’.

Maxima reconoce los dominios en el plano complejo de las funciones; lossiguientes ejemplos lo demuestran:

(%i14) sin(%i);

( %o14) i sinh 1

(%i15) log(-3.0);

( %o15) 3.141592653589793 i+ 1.09861228866811

(%i16) asin(2.0);

( %o16) 1.570796326794897− 1.316957896924817 i

6.2. LIMITES 91

6.2. Lımites

Sin mas preambulos, veamos algunos ejemplos de como calcular lımitescon la asistencia de Maxima. En primer lugar vemos que es posible hacerque la variable se aproxime al infinito (x → ∞) haciendo uso del sımboloinf, o que se aproxime al menos infinito (x→ −∞) haciendo uso de minf,

(%i1) limit(1/sqrt(x),x,inf);

( %o1) 0

(%i2) limit((exp(x)-exp(-x))/(exp(x)+exp(-x)),x,minf);

( %o2) −1

que nos permite calcular lımx→∞1√x

y lımx→−∞ex−e−x

ex+e−x , respectivamente.

Los siguientes ejemplos muestran lımites en los que la variable x se apro-xima a puntos de discontinuidad,

(%i3) limit((x^2-x/3-2/3)/(5*x^2-11*x+6),x,1);

( %o3) −5

3

(%i4) limit(1/(x-1)^2,x,1);

( %o4) ∞

donde hemos obtenido los resultados

lımx→1

x2 − x3 −

23

5x2 − 11x+ 6= −5

3y

lımx→1

1

(x− 1)2=∞.

Sin embargo, ciertos lımites no se pueden resolver sin aportar informacionadicional, tal es el caso de lımx→1

1x−1 , para el que podemos hacer

(%i5) limit(1/(x-1),x,1);

( %o5) infinity

donde Maxima nos responde con el sımbolo und de undefined o indefinido. Entales situaciones podemos indicarle al asistente que la variable x se aproximaa 1 por la derecha (x→ 1+) o por la izquierda (x→ 1−),

(%i6) limit(1/(x-1),x,1,plus);

( %o6) ∞

(%i7) limit(1/(x-1),x,1,minus);

( %o7) −∞

92 CAPITULO 6. CALCULO

6.3. Derivadas

Maxima controla el calculo de derivadas mediante la instruccion diff.A continuacion se presentan algunos ejemplos sobre su uso,

(%i1) diff(x^log(a*x),x); /* primera derivada */

( %o1) xlog(a x)

(log (a x)

x+

log x

x

)(%i2) diff(x^log(a*x),x,2); /*derivada segunda*/

( %o2) xlog(a x)

(log (a x)

x+

log x

x

)2

+xlog(a x)

(− log (a x)

x2− log x

x2+

2

x2

)(%i3) factor(%); /* ayudamos a Maxima a mejorar el resultado */

( %o3)xlog(a x)−2

(log2 (a x) + 2 log x log (a x)− log (a x) + log2 x− log x+ 2

)donde se han calculado la primera y segunda derivadas de la funcion y =xln(ax). Notese que en la entrada (%i3) se le ha pedido al programa quefactorizase la salida (%o2).

Pedimos ahora a Maxima que nos calcule el siguiente resultado que im-plica derivadas parciales,

ϑ10

ϑx3ϑy5ϑz2(ex sin(y) tan(z)) = 2ex cos(y) sec2(z) tan(z).

(%i4) diff(exp(x)*sin(y)*tan(z),x,3,y,5,z,2);

( %o4) 2 ex cos y sec2 z tan z

Maxima tambien nos puede ayudar a la hora de aplicar la regla de lacadena en el calculo de derivadas de funciones vectoriales con variable tam-bien vectorial. Suponganse que cierta variable z depende de otras dos x y y,las cuales a su vez dependen de u y v. Veamos como se aplica la regla de lacadena para obtener ϑz

ϑv , ϑz2

ϑyϑv o ϑz2

ϑuϑv .

(%i5) depends(z,[x,y],[x,y],[u,v]);

( %o5) [z (x, y) , x (u, v) , y (u, v)]

(%i6) diff(z,v,1);

6.3. DERIVADAS 93

( %o6)d

d vy

(d

d yz

)+

d

d vx

(d

d xz

)(%i7) diff(z,y,1,v,1);

( %o7)d

d vy

(d2

d y2z

)+

d

d vx

(d2

d x d yz

)(%i8) diff(z,u,1,v,1);

( %o8)

dd u y

(dd v y

(d2

d y2z)

+ dd v x

(d2

d x d y z))

+ d2

d u d v y(dd y z

)+

dd u x

(dd v x

(d2

d x2z)

+ dd v y

(d2

d x d y z))

+ d2

d u d v x(dd x z

)La funcion depends admite un numero par de argumentos, los cuales

pueden ser variables o listas de variables. Las que ocupan los lugares imparesson las variables dependientes y las que estan en las posiciones pares lasindependientes; denominacion esta que tiene aquı un sentido relativo, yaque una misma variable, como la x de la entrada %i5, puede actuar comoindependiente respecto de z y como dependiente respecto de u y v.

En cualquier momento podemos solicitarle a Maxima que nos recuerdeel cuadro de dependencias,

(%i9) dependencies;

( %o9) [z (x, y) , x (u, v) , y (u, v)]

Tambien podemos eliminar algunas de la dependencias previamente es-pecificadas,

(%i10) remove(x,dependency);

( %o10) done

(%i11) dependencies;

( %o11) [z (x, y) , y (u, v)]

(%i12) diff(z,y,1,v,1);

( %o12)d

d vy

(d2

d y2z

)Veamos como deriva Maxima funciones definidas implıcitamente. En el

siguiente ejemplo, para evitar que y sea considerada una constante, le de-clararemos una dependencia respecto de x,

94 CAPITULO 6. CALCULO

(%i13) depends(y,x)$

(%i14) diff(x^2+y^3=2*x*y,x);

( %o14) 3 y2

(d

d xy

)+ 2x = 2x

(d

d xy

)+ 2 y

Cuando se solicita el calculo de una derivada sin especificar la variablerespecto de la cual se deriva, Maxima utilizara el sımbolo del para repre-sentar las diferenciales,

(%i15) diff(x^2);

( %o15) 2x del (x)

lo que se interpretara como 2xdx. Si en la expresion a derivar hay mas deuna variable, habra diferenciales para todas,

(%i16) diff(x^2+y^3=2*x*y);

( %o16)

(3 y2

(d

d xy

)+ 2x

)del (x) =

(2x

(d

d xy

)+ 2 y

)del (x)

Recuerdese que durante este calculo estaba todavıa activa la dependenciadeclarada en la entrada (%i13).

Finalmente, para acabar esta seccion, hagamos referencia al desarrollode Taylor de tercer grado de la funcion

y =x lnx

x2 − 1

en el entorno de x = 1,

(%i17) taylor((x*log(x))/(x^2-1),x,1,3);

( %o17)1

2− (x− 1)2

12+

(x− 1)3

12+ · · ·

(%i18) expand(%);

( %o18)x3

12− x2

3+

5x

12+

1

3

A continuacion un ejemplo de desarrollo multivariante de la funcion y =exp(x2 sin(xy)) alrededor del punto (2, 0) hasta grado 2 respecto de cadavariable,

6.4. INTEGRALES 95

(%i19) taylor(exp(x^2*sin(x*y)),[x,2,2],[y,0,2]);

( %o19)1+8 y+32 y2+· · ·+

(12 y + 96 y2 + · · ·

)(x− 2)+

(6 y + 120 y2 + · · ·

)(x− 2)2+· · ·

(%i20) expand(%);

( %o20) 120x2 y2 − 384x y2 + 320 y2 + 6x2 y − 12x y + 8 y + 1

En ocasiones resulta necesario operar con funciones cuyas derivadas sondesconocidas, quizas porque la propia funcion lo es. Esta situacion puedellevar a que Maxima devuelva expresiones realmente complicadas de mani-pular. Un ejemplo es el siguiente, en el que trabajamos con una funcion farbitraria

(%i21) taylor(f(x + x^2),x,1,1);

( %o21) f (2) +

(d

d xf(x2 + x

)∣∣∣∣x=1

)(x− 1) + · · ·

Podemos facilitar las cosas si le definimos una funcion derivada a f , a laque llamaremos df ,

(%i22) gradef(f(x),df(x))$

(%i23) taylor(f(x+x^2),x,1,1);

( %o23) f (2) + 3 df (2) (x− 1) + · · ·

El paquete pdiff, que se encuentra en la carpeta share/contrib/, apor-ta una solucion alternativa a este problema.

6.4. Integrales

La funcion de Maxima que controla el calculo de integrales es integrate,tanto para las definidas como indefinidas; empecemos por estas ultimas,

(%i1) integrate(cos(x)^3/sin(x)^4,x);

( %o1)3 sin2 x− 1

3 sin3 x

(%i2) integrate(a[3]*x^3+a[2]*x^2+a[1]*x+a[0],x);

96 CAPITULO 6. CALCULO

( %o2)a3 x

4

4+a2 x

3

3+a1 x

2

2+ a0 x

que nos devuelve, respectivamente, las integrales∫cos3 x

sin4 xdx

y ∫(a3x

3 + a2x2 + a1x+ a0)dx.

Ademas, este ultimo ejemplo nos ofrece la oportunidad de ver comoescribir coeficientes con subındices.

Ahora un par de ejemplos sobre la integral definida,

(%i3) integrate(2*x/((x-1)*(x+2)),x,3,5);

( %o3) 2

(2 log 7

3− 2 log 5

3+

log 4

3− log 2

3

)(%i4) float(%); /*aproximacion decimal*/

( %o4) 0.9107277692015807

(%i5) integrate(asin(x),x,0,u);

Is u positive, negative, or zero?

positive;

( %o5) u arcsinu+√

1− u2 − 1

esto es, ∫ 5

3

2x

(x− 1)(x+ 2)dx ≈ 0.91072776920158

y ∫ u

0arcsin(x)dx = u arcsin(u) +

√1− u2 − 1,∀u > 0.

Notese en este ultimo ejemplo como antes de dar el resultado Maxima pre-gunta si u es positivo, negativo o nulo; tras contestarle escribiendo positive;(punto y coma incluido) obtenemos finalmente el resultado. En prevision desituaciones como esta, podemos darle al sistema toda la informacion relevan-te sobre los parametros utilizados antes de pedirle el calculo de la integral,

(%i6) assume(u>0);

6.4. INTEGRALES 97

( %o6) [u > 0]

(%i7) integrate(asin(x),x,0,u);

( %o7) u arcsinu+√

1− u2 − 1

Cuando Maxima no puede resolver la integral, siempre queda el recursode los metodos numericos. El paquete quadpack, escrito inicialmente enFortran y portado a Lisp para Maxima, es el encargado de estos menesteres;dispone de varias funciones, pero nos detendremos tan solo en dos de ellas,siendo la primera la utilizada para integrales definidas en intervalos acotados,

(%i8) /* El integrador simbolico no puede con esta integral */

integrate(exp(sin(x)),x,2,7);

( %o8)

∫ 7

2esinx dx

(%i9) /* Resolvemos numericamente */

quad_qag(exp(sin(x)),x,2,7,3);

( %o9)[4.747336298073747, 5.27060206376023× 10−14, 31, 0

]La funcion quad_qag tiene un argumento extra, que debe ser un numero

entero entre 1 y 6, el cual hace referencia al algoritmo que la funcion debeutilizar para la cuadratura; la regla heurıstica a seguir por el usuario es darun numero tanto mas alto cuanto mas oscile la funcion en el intervalo deintegracion. El resultado que obtenemos es una lista con cuatro elementos: elvalor aproximado de la integral, la estimacion del error, el numero de vecesque se tuvo que evaluar el integrando y, finalmente, un codigo de error quesera cero si no surgieron problemas.

La otra funcion de integracion numerica a la que hacemos referencia esquad_qagi, a utilizar en intervalos no acotados. En el siguiente ejemplo sepretende calcular la probabilidad de que una variable aleatoria χ2 de n = 4grados de libertad, sea mayor que la unidad (Pr(χ2

4 > 1)),

(%i10) n:4$

(%i11) integrate(x^(n/2-1)*exp(-y/2)/2^(n/2)*gamma(n/2),x,1,inf);

Integral is divergent

-- an error. To debug this try debugmode(true);

(%i12) quad_qagi(x^(n/2-1)*exp(-x/2)/2^(n/2)*gamma(n/2),x,1,inf);

98 CAPITULO 6. CALCULO

( %o12)[.9097959895689501, 1.913452127046495× 10−10, 165, 0

]El integrador simbolico falla emitiendo un mensaje sobre la divergencia

de la integral. La funcion quad_qagi ha necesitado 165 evaluaciones delintegrando para alcanzar una estimacion numerica de la integral, la cual secorresponde aceptablemente con la estimacion que hacen los algoritmos delpaquete de distribuciones de probabilidad (ver Seccion 8.1).

Otras funciones de cuadratura numerica son quad_qags, quad_qawc,quad_qawf, quad_qawo y quad_qaws, cuyas peculiaridades podra consultarel lector interesado en el manual de referencia.

La transformada de Laplace de una funcion f(x) se define como la inte-gral

L(p) =

∫ ∞0

f(x)e−pxdx,

siendo p un numero complejo. Ası, la transformada de Laplace de f(x) =ke−kx es

(%i13) laplace(k*exp(-k*x),x,p);

( %o13)k

p+ k

y calculando la transformada inversa volvemos al punto de partida,

(%i14) ilt(%,p,x);

( %o14) k e−k x

La transformada de Fourier de una funcion se reduce a la de Laplacecuando el argumento p toma el valor −it, siendo i la unidad imaginaria yt ∈ R,

F (t) =

∫ ∞0

f(x)eitxdx.

De esta manera, la transformada de Fourier de f(x) = ke−kx es

(%i15) laplace(k*exp(-k*x),x,-%i*t);

( %o15)k

k − i t

Notese que si x > 0, la f(x) anterior es precisamente la funcion dedensidad de una variable aleatoria exponencial de parametro k, por lo queeste ultimo resultado coincide precisamente con la funcion caracterıstica deesta misma distribucion.

6.5. ECUACIONES DIFERENCIALES 99

Puesto que hablamos de la transformada de Fourier, quizas sea este unbuen lugar para mencionar la transformada discreta de Fourier. Su calculo sehace con el algoritmo de la transformada rapida, implementado en la funcionfft, que admite como argumento una lista o array de datos cuya longituddebe ser una potencia de dos. La funcion inversa esta programada en lafuncion inverse_fft. Para mas informacion, consultese la documentacioncorrespondiente a estas funciones.

Como comentario final, queda hacer notar que la funcion integrate

admite integrandos matriciales, tal como indica el siguiente ejemplo.

(%i16) M: matrix([sin(x), x^2+1],[cos(x), exp(x)]);

( %o16)

(sinx x2 + 1cosx ex

)(%i17) ’integrate(M, x) = integrate(M, x);

( %o17)

∫ (sinx x2 + 1cosx ex

)dx =

(− cosx x3

3 + xsinx ex

)

6.5. Ecuaciones diferenciales

Con Maxima se pueden resolver analıticamente algunas ecuaciones di-ferenciales ordinarias de primer y segundo orden mediante la instruccionode2.

Una ecuacion diferencial de primer orden tiene la forma general F (x, y, y′) =0, donde y′ = dy

dx . Para expresar una de estas ecuaciones se hace uso de diff,

(%i1) /* ecuacion de variables separadas */

ec:(x-1)*y^3+(y-1)*x^3*’diff(y,x)=0;

( %o1) x3 (y − 1)

(d

d xy

)+ (x− 1) y3 = 0

siendo obligatorio el uso de la comilla simple (’) antes de diff al objeto deevitar el calculo de la derivada, que por otro lado darıa cero al no habersedeclarado la variable y como dependiente de x. Para la resolucion de estaecuacion tan solo habra que hacer

(%i2) ode2(ec,y,x);

( %o2)2 y − 1

2 y2= %c − 2x− 1

2x2

donde %c representa una constante, que se ajustara de acuerdo a la condicioninicial que se le imponga a la ecuacion. Supongase que se sabe que cuandox = 2, debe verificarse que y = −3, lo cual haremos saber a Maxima a travesde la funcion ic1,

100 CAPITULO 6. CALCULO

(%i3) ic1(%o2,x=2,y=-3);

( %o3)2 y − 1

2 y2= −x

2 + 72x− 36

72x2

Veamos ejemplos de otros tipos de ecuaciones diferenciales que puederesolver Maxima,

(%i4) /* ecuacion homogenea */

ode2(x^3+y^3+3*x*y^2*’diff(y,x),y,x);

( %o4)4x y3 + x4

4= %c

En este caso, cuando no se incluye el sımbolo de igualdad, se da por hechoque la expresion es igual a cero.

(%i5) /* reducible a homogenea */

ode2(’diff(y,x)=(x+y-1)/(x-y-1),y,x);

( %o5)log(y2 + x2 − 2x+ 1

)+ 2 arctan

(x−1y

)4

= %c

(%i6) /* ecuacion exacta */

ode2((4*x^3+8*y)+(8*x-4*y^3)*’diff(y,x),y,x);

( %o6) −y4 + 8x y + x4 = %c

(%i7) /* Bernoulli */

ode2(’diff(y,x)-y+sqrt(y),y,x);

( %o7) 2 log (√y − 1) = x+ %c

(%i8) solve(%,y);

( %o8)[y = ex+ %c + 2 e

x2

+ %c2 + 1

]En este ultimo caso, optamos por obtener la solucion en su forma explıcita.

Una ecuacion diferencial ordinaria de segundo orden tiene la forma ge-neral F (x, y, y′, y′′) = 0, siendo y′′ la segunda derivada de y respecto de x.Como ejemplo,

(%i9) ’diff(y,x)=x+’diff(y,x,2);

6.5. ECUACIONES DIFERENCIALES 101

( %o9)d

d xy =

d2

d x2y + x

(%i10) ode2(%,y,x);

( %o10) y = %k1 ex +

x2 + 2x+ 2

2+ %k2

Maxima nos devuelve un resultado que depende de dos parametros, %k1

y %k2, que para ajustarlos necesitaremos proporcionar ciertas condiciones

iniciales; si sabemos que cuando x = 1 entonces y = −1 y y′ = dydx

∣∣∣x=1

= 2,

haremos uso de la instruccion ic2,

(%i11) ic2(%,x=1,y=-1,diff(y,x)=2);

( %o11) y =x2 + 2x+ 2

2− 7

2

En el caso de las ecuaciones de segundo orden, tambien es posible ajustarlos parametros de la solucion especificando condiciones de contorno, esto es,fijando dos puntos del plano por los que pase la solucion; ası, si la solucionobtenida en (%o10) debe pasar por los puntos (−1, 3) y (2, 5

3), hacemos

(%i12) bc2(%o10,x=-1,y=3,x=2,y=5/3);

( %o12) y = − 35 ex+1

6 e3 − 6+x2 + 2x+ 2

2+

15 e3 + 20

6 e3 − 6

Notese que este calculo se le solicita a Maxima con bc2.

La resolucion de sistemas de ecuaciones diferenciales se hace con llamadasa la funcion desolve. En este contexto es preciso tener en cuenta que sedebe utilizar notacion funcional dentro de la expresion diff; un ejemploaclarara este punto, resolviendo el sistema{

df(x)dx = 3f(x)− 2g(x)dg(x)dx = 2f(x)− 2g(x)

(%i13) desolve([’diff(f(x),x)=3*f(x)-2*g(x),

’diff(g(x),x)=2*f(x)-2*g(x)],

[f(x),g(x)]);

( %o13)

[f (x) = (2 g(0)−f(0)) e−x

3 − (2 g(0)−4 f(0)) e2 x

3 ,

g (x) = (4 g(0)−2 f(0)) e−x

3 − (g(0)−2 f(0)) e2 x

3

]

102 CAPITULO 6. CALCULO

Como se ve, las referecias a las funciones deben incluir la variable in-dependiente y las ecuaciones estaran acotadas entre corchetes, ası como losnombres de las funciones. Observamos en la respuesta que nos da Maxi-ma la presencia de f(0) y g(0), lo cual es debido a que se desconocen lascondiciones de contorno del sistema.

En este ultimo ejemplo, supongamos que queremos resolver el sistemade ecuaciones diferenciales

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

bajo las condiciones f(0) = −1, g(0) = 3 y f(0) = 1. En primer lugar in-troduciremos estas condiciones con la funcion atvalue, para posteriormentesolicitar la resolucion del sistema,

(%i14) atvalue(f(x),x=0,-1)$

(%i15) atvalue(g(x),x=0,3)$

(%i16) atvalue(h(x),x=0,1)$

(%i17) desolve([’diff(f(x),x)=f(x)+g(x)+3*h(x),

’diff(g(x),x)=g(x)-2*h(x),

’diff(h(x),x)=f(x)+h(x)], [f(x),g(x),h(x)]);

( %o17)[f (x) = x e2x + e2x − 2 e−x, g (x) = −2x e2x + 2 e2x + e−x, h (x) = x e2x + e−x

]La funcion desolve tambien nos va a permitir resolver ecuaciones de

orden mayor que dos. En el siguiente ejemplo, abordamos la resolucion dela ecuacion

d3y(x)

dx3+d2y(x)

dx2+dy(x)

dx+ y(x) = 0

bajo las condiciones que se describen a continuacion,

(%i18) atvalue(’diff(y(x),x,2),x=0,v)$

(%i19) atvalue(’diff(y(x),x),x=0,u)$

(%i20) atvalue(y(x),x=0,w)$

Ahora resolvemos,

(%i21) desolve(’diff(y(x),x,3)+’diff(y(x),x,2)+’diff(y(x),x)+y(x)=0, y(x));

( %o21) y (x) =(w + v + 2u) sinx

2+

(w − v) cosx

2+

(w + v) e−x

2

El paquete plotdf permite generar campos de direcciones, bien de ecua-ciones diferenciales de primer orden

dy

dx= F (x, y),

6.5. ECUACIONES DIFERENCIALES 103

bien de sistemas { dxdt = G(x, y)dydt = F (x, y)

Los argumentos a pasar a la funcion plotdf son la funcion F , en elprimer caso, y una lista con las funciones F y G en el segundo. Las variablesseran siempre x e y. Como ejemplo, pidamos a Maxima que genere el campode direcciones de la ecuacion diferencial dy

dx = 1 + y + y2

(%i22) load(plotdf)$

(%i23) plotdf(1 + y + y^2);

El grafico que resulta es el de la Figura 6.2 a), en el que ademas seobservan dos trayectorias que se dibujaron de forma interactiva al hacer clicsobre dos puntos del plano.

La funcion plotdf admite varias opciones, algunas de las cuales apro-vechamos en el siguiente ejemplo. Supongamos el modelo predador-presa deLotka-Volterra, dependiente de dos parametros h y k,{ dx

dt = 2x+ hxydydt = −x+ kxy

El siguiente codigo permite generar el campo de direcciones correspon-diente, dandoles inicialmente a h y k los valores -1.2 y 0.9, respectivamente;ademas, apareceran sobre la ventana grafica dos barras de deslizamiento pa-ra alterar de forma interactiva estos dos parametros y ver los cambios quese producen en el campo.

(%i24) plotdf([2*x+k*x*y, -y+h*x*y],

[parameters,"k=-1.2,h=0.9"],

[sliders,"k=-2:2,h=-2:2"]);

En la Figura 6.2 b) se observa el grafico obtenido despues de pedir tra-yectorias concretas que pasan por varios puntos del plano (en el archivografico no aparecen las barras de deslizamiento).

Cuando Maxima no es capaz de resolver la ecuacion propuesta, se podra re-currir al metodo numerico de Runge-Kutta, el cual se encuentra programadoen el paquete diffeq. Como primer ejemplo, nos planteamos la resolucionde la ecuacion

dy

dt= −2y2 + exp(−3t),

con la condicion y(0) = 1. La funcion ode2 es incapaz de resolverla:

(%i25) ec: ’diff(y,t)+2*y^2-exp(-3*t)=0;

( %o25)d

d ty + 2 y2 − e−3 t = 0

104 CAPITULO 6. CALCULO

-8 -4 0 4 8

-8

-4

0

4

8

-5 0 5 10-10

-5

0

5

a) b)

Figura 6.2: Campos de direcciones creados con la funcion ’plotdf’: a) campode la ecuacion dy

dx = 1+y+y2; b) campo correspondiente al modelo predador-presa.

6.5. ECUACIONES DIFERENCIALES 105

(%i26) ode2(ec,y,t);

( %o26) false

Abordamos ahora el problema con un enfoque numerico, para lo cualdefinimos la expresion

f(t, y) =dy

dt= −2y2 + exp(−3t)

en Maxima,

(%i27) load(diffeq)$

(%i28) f(t,y):= -2*y^2+exp(-3*t) $

(%i29) res: runge1(f,0,5,0.5,1);

( %o29)[[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0] ,[1.0, .5988014211752297, .4011473182183033, .2915932807721147 ,.2260784415237641, 0.183860316087325, .1547912058210609, .1336603954558797,.1176289334565761, .1050518038293819, .09491944625388439] ,[−1.0,−0.49399612385452,−.2720512734596094,−.1589442862446483 ,−.09974417126696171,−.06705614729331426,−.04779722499498942,−.03570266617749457,−.02766698775990988,−.02207039201652747,−.01801909665196759]]

(%i30) draw2d(

points_joined = true,

point_type = dot,

points(res[1],res[2]),

terminal = eps)$

La funcion runge1 necesita cinco argumentos: la funcion derivada dydt , los

valores inicial, t0, y final, t1, de la variable independiente, la amplitud de lossubintervalos y el valor que toma y en t0. El resultado es una lista que a suvez contiene tres listas: las abscisas t, las ordenadas y y las correspondientesderivadas. Al final del ejemplo anterior, se solicita la representacion graficade la solucion, cuyo aspecto es el mostrado por la Figura 6.3 a). (Consultesela seccion 7 para una descripcion de la funcion draw2d.)

Nos planteamos ahora la resolucion de la ecuacion diferencial de segundoorden

d2y

dt2= 0.2(1− y2)

dy

dt− y,

con y(0) = 0.1 y y′(0) = 1 para lo cual definimos en Maxima la funcion

g(t, y, y′) =d2y

dt2= 0.2(1− y2)y′ − y,

106 CAPITULO 6. CALCULO

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

0 1 2 3 4 5-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

0 10 20 30 40 50 60 70 80 90 100

a) b)

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

c) d)

Figura 6.3: Resolucion numerica de ecuaciones diferenciales con ’diffeq’: a),solucion de la ecuacion de primer orden dy

dt = −2y2 + exp(−3t), y(0) = 1; b),

solucion de la ecuacion de segundo orden d2ydt2

= 0.2(1 − y2)dydt − y, con lascondiciones y(0) = 0.1 y y′(0) = 1; c), diagrama (y, y′); d), diagrama (y, y′′).

(%i31) g(t,y,yp) := 0.2*(1-y^2)*yp - y $

(%i32) res: runge2(g,0,100,0.1,0.1,1)$

(%i33) midibujo(i,j):= draw2d(points_joined = true,

point_type = dot,

points(res[i],res[j]),

terminal = eps)$

(%i34) midibujo(1,2)$

(%i35) midibujo(2,3)$

(%i36) midibujo(2,4)$

La funcion runge2 necesita seis argumentos: la funcion derivada d2ydt2

, losvalores inicial, t0, y final, t1, de la variable independiente, la amplitud delos subintervalos y los valores que toman y y su primera derivada en t0.El resultado es una lista que a su vez contiene cuatro listas: las abscisast, las ordenadas y, las correspondientes primeras derivadas y, por ultimo,las segundas derivadas. Al final de este ultimo ejemplo se solicitan algunosgraficos asociados a la solucion, los formados con los pares (t, y), (y, y′)

6.6. VECTORES Y CAMPOS VECTORIALES 107

y (y, y′′), que son los correspondientes a los apartados b), c) y d) de laFigura 6.3.

El paquete dynamics dispone de otra rutina para el metodo de Runge-Kutta, rk, que permite la resolucion de sistemas de ecuaciones difereciales.Para resolver el sistema { dx

dt = 4− x2 − 4y2

dydt = y2 − x2 + 1

cargamos el paquete y ejecutamos la sentencia correspondiente, junto con elgrafico asociado que no mostramos.

(%i37) load(dynamics)$

(%i38) rk([4-x^2-4*y^2,y^2-x^2+1],[x,y],[-1.25,0.75],[t,0,4,0.02])$

(%i39) draw3d(

points_joined = true,

point_type = dot,

points(%),

terminal = eps)$

Para mas informacion sobre la sintaxis de esta funcion, ejecutese ? rk.El paquete dynamics contiene otras funciones relacionadas con los sistemasdinamicos y los fractales.

6.6. Vectores y campos vectoriales

En Maxima, los vectores se introducen como simples listas (Seccion 4.1),siendo el caso que con ellas se pueden realizar las operaciones de adicion,producto por un numero y producto escalar de vectores,

(%i1) [1,2,3]+[a,b,c];

( %o1) [a+ 1, b+ 2, c+ 3]

(%i2) s*[a,b,c];

( %o2) [a s, b s, c s]

(%i3) [1,2,3].[a,b,c]; /* producto escalar */

( %o3) 3 c+ 2 b+ a

El calculo del modulo de un vector se puede hacer mediante la definicionprevia de una funcion al efecto:

108 CAPITULO 6. CALCULO

(%i4) modulo(v):=

if listp(v)

then sqrt(apply("+",v^2))

else error("Mucho ojito: ", v, " no es un vector !!!!")$

(%i5) xx:[a,b,c,d,e]$

(%i6) yy:[3,4,-6,0,4/5]$

(%i7) modulo(xx-yy);

( %o7)

√(e− 4

5

)2

+ d2 + (c+ 6)2 + (b− 4)2 + (a− 3)2

Los operadores diferenciales que son de uso comun en el ambito de loscampos vectoriales estan programados en el paquete vect, lo que implicaque debe ser cargado en memoria antes de ser utilizado. Sigue a continuacionuna sesion de ejemplo sobre como usarlo.

Partamos de los campos escalares φ(x, y, z) = −x+y2 +z2 y ψ(x, y, z) =4x+ log(y2 + z2) y demostremos que sus superficies de nivel son ortogonalesprobando que ∇φ · ∇ψ = 0, siendo ∇ el operador gradiente,

(%i8) /* Se carga el paquete */

load(vect)$

(%i9) /* Se definen los campos escalares */

phi: y^2+z^2-x$ psi:log(y^2+z^2)+4*x$

(%i11) grad(phi) . grad(psi);

( %o11) grad(z2 + y2 − x

)· grad

(log(z2 + y2

)+ 4x

)Como se ve, Maxima se limita a devolvernos la misma expresion que le

introducimos; el estilo de trabajo del paquete vect requiere el uso de dosfunciones: express y ev, la primera para obtener la expresion anterior enterminos de derivadas y la segunda para forzar el uso de estas.

(%i12) express(%);

( %o12)

dd z

(z2 + y2 − x

) (dd z

(log(z2 + y2

)+ 4x

))+

dd y

(z2 + y2 − x

) (dd y

(log(z2 + y2

)+ 4x

))+

dd x

(z2 + y2 − x

) (dd x

(log(z2 + y2

)+ 4x

))(%i13) ev(%,diff);

( %o13)4 z2

z2 + y2+

4 y2

z2 + y2− 4

6.6. VECTORES Y CAMPOS VECTORIALES 109

(%i14) ratsimp(%);

( %o14) 0

Al final, hemos tenido que ayudar un poco a Maxima para que terminasede reducir la ultima expresion.

Sea ahora el campo vectorial definido por F = xyi + x2zj − ex+yk ypidamosle a Maxima que calcule su divergencia, (∇·F), rotacional (∇×F)ylaplaciano (∇2F)

(%i15) F: [x*y,x^2*z,exp(x+y)]$

(%i16) div (F); /* divergencia */

( %o16) div([x y, x2 z, ey+x

])(%i17) express (%);

( %o17)d

d y

(x2 z

)+

d

d zey+x +

d

d x(x y)

(%i18) ev (%, diff);

( %o18) y

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

( %o19) curl([x y, x2 z, ey+x

])(%i20) express (%);

( %o20)[d

d yey+x − d

d z

(x2 z

),d

d z(x y)− d

d xey+x,

d

d x

(x2 z

)− d

d y(x y)

](%i21) ev (%, diff);

( %o21)[ey+x − x2,−ey+x, 2x z − x

](%i22) laplacian (F); /* laplaciano */

( %o22) laplacian([x y, x2 z, ey+x

])(%i23) express (%);

110 CAPITULO 6. CALCULO

( %o23)d2

d z2

[x y, x2 z, ey+x

]+

d2

d y2

[x y, x2 z, ey+x

]+

d2

d x2

[x y, x2 z, ey+x

](%i24) ev (%, diff);

( %o24)[0, 2 z, 2 ey+x

]Notese en todos los casos el usos de la secuencia express - ev. Si el

usuario encuentra incomoda esta forma de operar, siempre podra definiruna funcion que automatice el proceso; por ejemplo,

(%i25) milaplaciano(v):= ev(express(laplacian(v)), diff) $

(%i26) milaplaciano(F);

( %o26)[0, 2 z, 2 ey+x

]Por ultimo, el paquete vect incluye tambien la definicion del producto

vectorial, al cual le asigna el operador ~,

(%i27) [a, b, c] ~ [x, y, z];

( %o27) [a, b, c] ∼ [x, y, z]

(%i28) express(%);

( %o28) [b z − c y, c x− a z, a y − b x]

Capıtulo 7

Graficos

Maxima no esta habilitado para realizar el mismo graficos, por lo quenecesitara de un programa externo que realice esta tarea. Nosotros nos limi-taremos a ordenar que tipo de grafico queremos y Maxima se encargara decomunicarselo a la aplicacion grafica que este activa en ese momento, quepor defecto sera Gnuplot. La otra herramienta grafica es Openmath, unprograma Tcl-tk que se distribuye conjuntamente con Maxima.

7.1. El modulo ”plot”

Las funciones plot2d y plot3d son las que se utilizan por defecto. Vea-mos un ejemplo de cada una de ellas.

(%i1) xy:[[10,.6], [20,.9], [30,1.1], [40,1.3], [50,1.4]]$

(%i2) plot2d([[discrete,xy], 2*%pi*sqrt(u/980)], [u,0,50],

[style, [points,5,2,6], [lines,1,1]],

[legend,"Datos experimentais","Predicion da teoria"],

[xlabel,"Lonxitude do pendulo (cm)"], [ylabel,"periodo (s)"],

[gnuplot_preamble,

"set terminal postscript eps;set out ’plot2d.eps’"])$

Se ha definido en el ejemplo una lista de puntos empıricos a representar,junto con su funcion teorica, pidiendo su representacion grafica en el dominio[0, 50]. El resto de codigo hace referencia a diversas opciones: style, legend,xlabel, ylabel y gnuplot_preamble, esta ultima permite escribir codigode Gnuplot para que este lo ejecute; aquı se le pide que devuelva el graficoen formato Postscript. El ejemplo siguiente genera una superficie explıcita.Las dos salidas graficas se representan en la Figura 7.1

(%i3) plot3d (2^(-u^2 + v^2), [u, -3, 3], [v, -2, 2],

[gnuplot_preamble,

"set terminal postscript eps;set out ’plot3d.eps’"])$

111

112 CAPITULO 7. GRAFICOS

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

0 10 20 30 40 50

perio

do (

s)

Lonxitude do pendulo (cm)

Datos experimentaisPredicion da teoria

-3-2

-1 0

1 2

3 4-2

-1.5-1

-0.5 0

0.5 1

1.5 2

0 2 4 6 8

10 12 14 16

2^(v^2-u^2)

Figura 7.1: Graficos generados por las funciones plot2d y plot3d.

7.2. EL MODULO ”DRAW” 113

El control de las opciones graficas se consigue manipulando la variableglobal plot_options, cuyo estado por defecto es

(%i4) plot_options;

(%o4) [[x, - 1.755559702014e+305, 1.755559702014e+305],

[y, - 1.755559702014e+305, 1.755559702014e+305],

[t, - 3, 3], [GRID, 30, 30], [VIEW_DIRECTION, 1, 1, 1],

[COLOUR_Z, FALSE], [TRANSFORM_XY, FALSE],

[RUN_VIEWER, TRUE], [PLOT_FORMAT, GNUPLOT],

[GNUPLOT_TERM, DEFAULT], [GNUPLOT_OUT_FILE, FALSE],

[NTICKS, 10], [ADAPT_DEPTH, 10], [GNUPLOT_PM3D, FALSE],

[GNUPLOT_PREAMBLE, ], [GNUPLOT_CURVE_TITLES, [DEFAULT]],

[GNUPLOT_CURVE_STYLES, [with lines 3, with lines 1,

with lines 2, with lines 5, with lines 4, with lines 6,

with lines 7]], [GNUPLOT_DEFAULT_TERM_COMMAND, ],

[GNUPLOT_DUMB_TERM_COMMAND, set term dumb 79 22],

[GNUPLOT_PS_TERM_COMMAND, set size 1.5, 1.5;set term postsc#

ript eps enhanced color solid 24]]

Para mayor informacion sobre el significado de cada uno de los elemen-tos de esta lista, ası como de las funciones plot2d y plot3d, consultese ladocumentacion.

Por defecto, Maxima invocara al programa Gnuplot para la generacion degraficos, pero quizas prefiramos el programa Openmath, que forma parte dela distribucion de Maxima; en tal caso tendrıamos que modificar previamentelas opciones guardadas en plot_options y a continuacion solicitar el graficodeseado, como en este caso en el que se representa la funcion gamma y suinversa.

(%i5) set_plot_option([plot_format, openmath])$

(%i6) plot2d([gamma(x),1/gamma(x)],[x,-4.5,5],[y,-10,10])$

El resto de esta seccion lo dedicaremos a hacer una somera descripciondel paquete draw, un proyecto consistente en el desarrollo de un interfaz quepermita aprovechar al maximo las habilidades graficas de Gnuplot.

7.2. El modulo ”draw”

Aquı, las funciones a utilizar son draw2d, draw3d y draw, para escenasen 2d, 3d y para graficos multiples y animaciones, respectivamente. Puestoque se trata de un modulo adicional, sera necesario cargarlo en memoriaantes de hacer uso de el. Empecemos por un ejemplo comentado.

(%i1) load(draw)$

(%i2) draw2d(

114 CAPITULO 7. GRAFICOS

key = "Cubic poly",

explicit(%pi*x^3+sqrt(2)*x^2+10,x,0,2),

color = blue,

key = "Parametric curve",

line_width = 3,

nticks = 50,

parametric(2*cos(rrr)+3, rrr, rrr, 0, 6*%pi),

line_type = dots,

points_joined = true,

point_type = diamant,

point_size = 3,

color = red,

line_width = 1,

key = "Empiric data",

points(makelist(random(40.0),k,1,5)),

title = "DRAWING CURVES",

terminal = eps )$

Los argumentos de draw2d se dividen en tres grupos: objetos graficos (enel ejemplo, explicit, parametric y points), opciones locales (que afectandirectamente a la representacion de los objetos graficos, como key, color,line_width, nticks, line_type, points_joined y line_width) y opcio-nes globales (que hacen referencia a aspectos generales del grafico, comotitle y terminal). Las opciones se indican como igualdades, escribiendo ala izquierda el nombre de la opcion y a la derecha el valor que se le quie-ra asignar, a la vez que los objetos graficos tienen el formato igual que lasllamadas a funciones, esto es, el nombre del objeto a dibujar seguido, entreparentesis, de los parametros que definen al objeto.

Todos estos argumentos se interpretan secuencialmente, de forma que alasignar un cierto valor a una opcion local, esta afectara a todos los objetosgraficos que le sigan. En este ejemplo, line_width comienza teniendo valor1, que es el asignado por defecto, luego se le da el valor 3 para la represen-tacion de la curva parametrica y finalmente se le devuelve el valor originalantes de representar los segmentos que unen los puntos aleatoriamente ge-nerados. En cambio, las dos opciones globales, title y terminal, aunquese colocaron al final, podrıan haberse ubicado en cualquier otro lugar.

Siguiendo con los graficos en dos dimensiones, el siguiente ejemplo mues-tra una escena en la que intervienen los objetos ellipse, image, label,vector y, ya lo conocemos, explicit. Antes de ejecutar esta instruccion esnecesario leer el fichero grafico gatos.xpm1

(%i3) cats: read_xpm("gatos.xpm")$

(%i4) draw2d(

1El formato grafico XPM es el unico que puede leer Maxima.

7.2. EL MODULO ”DRAW” 115

terminal = eps,

yrange = [-4,10],

ellipse(5,3,8,6,0,360),

image(cats,0,0,10,7),

line_width = 2,

head_length = 0.3,

color = blue,

label(["This is Francisco",-1,-0.5]),

vector([-1,0],[2,4]),

color = green,

vector([11,7],[-2,-1]),

label(["This is Manolita",11,8]),

explicit(sin(x)-2,x,-4,15) )$

Junto con los objetos graficos introducidos en los ejemplos, cuyos re-sultados se pueden ver en los apartados a) y b) de la Figura 7.2, tambienexisten polygon, rectangle, polar, implicit y geomap, este ultimo paramapas cartograficos.

Mostramos a continuacion algunas escenas tridimensionales. En primerlugar, el valor absoluto de la funcion Γ de Euler, junto con sus lıneas decontorno.

(%i5) gamma2(x,y):=

block([re,im,g:gamma(x+%i*y)],

re:realpart(g),

im:imagpart(g),

sqrt(re^2+im^2))$

(%i6) draw3d(

zrange = [0,6],

xu_grid = 50,

yv_grid = 50,

surface_hide = true,

contour = surface,

contour_levels = [0,0.5,6], /* de 0 a 6 en saltos de 0.5 */

color = cyan,

terminal = eps,

explicit(gamma2(x,y),x,-4,4,y,-2,2))$

Una superficie parametrica, que junto con la anterior escena, se puedenver ambas en la Figura 7.2, apartados c) y d).

(%i7) draw3d(

terminal = eps,

title = "Figure 8 - Klein bottle",

rot_horizontal = 360,

116 CAPITULO 7. GRAFICOS

xrange = [-3.4,3.4],

yrange = [-3.4,3.4],

zrange = [-1.4,1.4],

xtics = none,

ytics = none,

ztics = none,

axis_3d = false,

surface_hide = true,

parametric_surface((2+cos(u/2)*sin(v)-sin(u/2)*sin(2*v))*cos(u),

(2+cos(u/2)*sin(v)-sin(u/2)*sin(2*v))*sin(u),

sin(u/2)*sin(v) + cos(u/2)*sin(2*v),

u, -%pi, 360*%pi/180-%pi, v, 0, 2*%pi) )$

En el grafico siguiente se combinan varios objetos: una superficie explıci-ta, dos curvas parametricas y dos etiquetas, cuyo aspecto es el mostrado enel apartado e) de la Figura 7.2.

(%i8) draw3d(

color = green,

explicit(exp(sin(x)+cos(x^2)),x,-3,3,y,-3,3),

color = blue,

parametric(cos(5*u)^2,sin(7*u),u-2,u,0,2),

color = brown,

line_width = 2,

parametric(t^2,sin(t),2+t,t,0,2),

surface_hide = true,

title = "Surface & curves",

color = red,

label(["UP",-2,0,3]),

label(["DOWN",2,0,-3]),

rot_horizontal = 10,

rot_vertical = 84,

terminal = eps )$

En el siguiente ejemplo hacemos una proyeccion esferica del hemisferiosur, que se ve en el apartado f) de la Figura 7.2. El paquete worldmap

carga en memoria las coordenadas latitud–longitud de las lıneas fronterizas ycosteras de todos los paıses del mundo, ası como algunas funciones necesariaspara su manipulacion y procesamiento,

(%i9) load(worldmap)$

(%i10) draw3d(

surface_hide = true,

rot_horizontal = 60,

rot_vertical = 131,

7.2. EL MODULO ”DRAW” 117

color = cyan,

parametric_surface(

cos(phi)*cos(theta),

cos(phi)*sin(theta),

sin(phi),

theta,-%pi,%pi,

phi,-%pi/2,%pi/2),

color = red,

geomap([South_America,Africa,Australia],

[spherical_projection,0,0,0,1]),

color = blue,

geomap([South_America,Africa,Australia],

[cylindrical_projection,0,0,0,1,2]),

terminal = eps)$

Ademas de los objetos graficos tridimensionales ya vistos, tambien sehayan definidos points, vector e implicit.

Tambien es posible generar multiples graficos en un mismo fichero ohacer animaciones en formato GIF o en la ventana grafica. Para ver masejemplos de graficos generados con el paquete draw, se recomienda accedera la direccion

http://riotorto.users.sourceforge.net/gnuplot

o consultar el sistema de ayuda de Maxima.Ya como colofon, un ejemplo de grafico multiple en el que se muestra

tambien como dar sombreado a las superficies tridimensionales. El resultadoen el apartado g) de la Figura 7.2.

(%i11) escena1:

gr3d(surface_hide = true,

enhanced3d = true,

palette = gray,

explicit(sin(sqrt(x^2+y^2)),x,-5,5,y,-5,5))$

(%i12) escena2:

gr3d(surface_hide = true,

enhanced3d = true,

palette = gray,

user_preamble = "set pm3d map",

explicit(sin(sqrt(x^2+y^2)),x,-5,5,y,-5,5))$

(%i13) draw(

columns = 2,

terminal = eps_color,

118 CAPITULO 7. GRAFICOS

0

5

10

15

20

25

30

35

40

0 1 2 3 4 5

DRAWING CURVES

Cubic polyParametric curve

Empiric data

-4

-2

0

2

4

6

8

10

-4 -2 0 2 4 6 8 10 12 14

This is Francisco

This is Manolita

a) b)

5.5 5 4.5 4 3.5 3 2.5 2 1.5 1 0.5

-4 -3 -2 -1 0 1 2 3 4 -2-1.5

-1-0.5

0 0.5

1 1.5

2

0

1

2

3

4

5

6

Figure 8 - Klein bottle

c) d)Surface & curves

UP

DOWN

-3 -2 -1 0 1 2 3 4 -3-2-1 0 1 2 3

-3-2-1 0 1 2 3 4

-1.5-1

-0.5 0

0.5 1

1.5 2

-2-1.5

-1-0.5

0 0.5

1 1.5

-1

-0.5

0

0.5

1

e) f)

-1-0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 1

-4-2

0 2

4 -4-2

0 2

4

-1-0.8-0.6-0.4-0.2

0 0.2 0.4 0.6 0.8

-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

-4 -2 0 2 4

-4

-2

0

2

4

g)

Figura 7.2: Graficos generados con el paquete draw: a) y b) con draw2d; c),d), e) y f) con draw3d; g), un grafico multiple.

7.2. EL MODULO ”DRAW” 119

eps_width = 20,

eps_height = 8,

escena1, escena2)$

Se comienza definiendo las dos escenas a representar, la funcion explıci-ta y el grafico de densidades, en sendos objetos gr3d, ya que ambos son denaturaleza tridimensional. Estos objetos se pasan luego a la funcion draw

como argumentos, junto con algunas opciones globales. La funcion draw esrealmente la que ha generado tambien los graficos anteriores, siendo draw2d

y draw3d sinonimos de draw(gr2d(...)) y draw(gr3d(...)), respectiva-mente.

120 CAPITULO 7. GRAFICOS

Capıtulo 8

Probabilidades y estadıstica

8.1. Probabilidad

El paquete distrib contiene la definicion de las funciones de distribucionde probabilidad mas comunes, tanto discretas (binomial, de Poisson, de Ber-noulli, geometrica, uniforme discreta, hipergeometrica y binomial negativa),como continuas (normal, t de Student, χ2 de Pearson, F de Snedecor, expo-nencial, lognormal, gamma, beta, uniforme continua, logıstica, de Pareto, deWeibull, de Rayleigh, de Laplace, de Cauchy y de Gumbel). Para cada unade ellas se puede calcular la probabilidad acumulada, la funcion de densidad,los cuantiles, medias, varianzas y los coeficientes de asimetrıa y curtosis:

(%i1) load(distrib)$

(%i2) assume(s>0)$

(%i3) cdf_normal(x,mu,s);

( %o3)erf(x−µ√

2 s

)2

+1

2

(%i4) pdf_poisson(5,1/s);

( %o4)e−

1s

120 s5

(%i5) quantile_student_t(0.05,25);

121

122 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

( %o5) −1.708140543186975

(%i6) mean_weibull(3,67);

( %o6)67 Γ

(13

)3

(%i7) var_binomial(34,1/8);

( %o7)119

32

(%i8) skewness_rayleigh(1/5);

( %o8)π

32

4 −3√π

4(1− π

4

) 32

(%i9) kurtosis_gumbel (2,3);

( %o9)12

5

Si su argumento es un numero entero positivo, la funcion random(n)

genera un numero seudoaleatorio con distribucion uniforme discreta entre 0y n − 1, ambos inclusive; ası, una simulacion del lanzamiento de un dadoserıa

(%i10) random(6)+1;

( %o10) 3

y una serie de 100 lanzamientos de una moneda,

(%i11) makelist(random(2),i,1,100);

( %o11)[0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0,

0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1]

Cuando el argumento es un numero decimal positivo, la variable aleatoriaque se simula es la uniforme continua, dando como resultado un numero realperteneciente al intervalo [0, r),

8.1. PROBABILIDAD 123

(%i12) random(6.0);

( %o12) 0.373047098775396

El algoritmo generador de los numeros seudoaleatorios es determinista,de manera que partiendo de una misma semilla o valor inicial, se generara lamisma secuencia de numeros. Para controlar el valor de esta semilla dis-ponemos de las funciones make_random_state y set_random_state; porejemplo, para definir una semilla que se genere a partir del estado actual delreloj del sistema haremos

(%i13) nueva_semilla: make_random_state(true)$

Sin embargo, para que tal semilla se active en el generador, debemosindicarlos expresamente haciendo

(%i14) set_random_state(nueva_semilla)$

El argumento de la funcion make_random_state puede ser tambien unnumero entero, como se hace en el ejemplo de mas abajo.

Veamos un caso de aplicacion de todo esto. Supongamos que queremossimular diferentes series estocasticas, pero que todas ellas sean iguales. Sihacemos

(%i15) makelist(random(6),i,1,10);

( %o15) [3, 0, 0, 5, 0, 5, 1, 4, 4, 5]

(%i16) makelist(random(6),i,1,10);

( %o16) [0, 4, 0, 0, 5, 4, 0, 0, 1, 5]

(%i17) makelist(random(6),i,1,10);

( %o17) [3, 3, 3, 1, 3, 2, 1, 5, 2, 4]

lo mas probable es que obtengamos tres secuencias distintas, como en elejemplo. Pero si hacemos

(%i18) semilla: make_random_state(123456789)$

(%i19) set_random_state(semilla)$ makelist(random(6),i,1,10);

( %o19) [4, 4, 0, 1, 0, 3, 2, 5, 4, 4]

(%i20) set_random_state(semilla)$ makelist(random(6),i,1,10);

124 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

( %o20) [4, 4, 0, 1, 0, 3, 2, 5, 4, 4]

(%i21) set_random_state(semilla)$ makelist(random(6),i,1,10);

( %o21) [4, 4, 0, 1, 0, 3, 2, 5, 4, 4]

se vera que las tres secuencias son iguales, ya que antes de generar cadamuestra aleatoria reiniciamos el estado del generador. La funcion random ylas otras funciones relacionadas con ella discutidas hasta aquı estan dispo-nibles sin necesidad de cargar el paquete distrib.

Sin embargo, el paquete adicional distrib tambien permite simular mu-chas otras variables aleatorias, tanto discretas como continuas. A modo deejemplo, pedimos sendas muestra de tamano 5 de las variables aleatoriasbinomial B(5, 1

3), Poisson P (7), hipergeometrica HP (15, 20, 7), exponencialExp(12.5) y Weibull Wei(7, 23

3 ); puesto que ya se ha cargado mas arriba elpaquete, no es necesario ejecutar nuevamente load(distrib).

(%i22) random_binomial(5,1/3,5);

( %o22) [3, 1, 2, 3, 2]

(%i23) random_poisson(7,5);

( %o23) [8, 3, 10, 5, 6]

(%i24) random_hypergeometric(15,20,7,5);

( %o24) [4, 2, 4, 3, 2]

(%i25) random_exp(12.5,5);

( %o25)[.05865376074017901, .2604319923173137, .07552948674579418,

.02948508382731128, .2117111885482312]

(%i26) random_weibull(7,23/3,5);

( %o26)[6.35737206358163, 7.436207845095266, 8.101343432607079,

7.835164678709573, 6.350884234996046]

Para mas informacion sobre estas y otras funciones de simulacion es-tocastica, tecleese ? distrib.

8.2. ESTADISTICA DESCRIPTIVA 125

8.2. Estadıstica descriptiva

Maxima es capaz de realizar ciertos tipos de procesamiento de datos. Elpaquete descriptive, junto con otros, es el que nos puede ayudar en estetipo de tareas.

Durante la instalacion de Maxima se almacenan junto al fichero descriptive.mactres muestras de datos: pidigits.data, wind.data y biomed.data, los cua-les cargaremos en memoria con las funciones read_list y read_matrix.

Las muestras univariantes deben guardarse en listas, tal como se muestraa continuacion

(%i1) s1:[3,1,4,1,5,9,2,6,5,3,5];

( %o1) [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

y muestras multivariantes en matrices, como en

(%i2) s2:matrix([13.17, 9.29],[14.71, 16.88],[18.50, 16.88],

[10.58, 6.63],[13.33, 13.25],[13.21, 8.12]);

( %o2)

13.17 9.2914.71 16.8818.5 16.8810.58 6.6313.33 13.2513.21 8.12

En este caso, el numero de columnas es igual a la dimension de la variable

aleatoria y el numero de filas al tamano muestral.Los datos se pueden introducir manualmente, pero las muestras grandes

se suelen guardar en ficheros de texto. Por ejemplo, el fichero pidigits.data

contiene los 100 primeros dıgitos del numero π:

3

1

4

1

5

9

2

6

5

3 ...

Para cargar estos dıgitos en Maxima,

126 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

(%i3) s1 : read_list (file_search ("pidigits.data"))$

(%i4) length(s1);

( %o4) 100

El fichero wind.data contiene las velocidades medias del viento regis-tradas diariamente en 5 estaciones meteorologicas de Irlanda. Lo que siguecarga los datos,

(%i5) s2:read_matrix(file_search ("wind.data"))$

(%i6) length(s2);

( %o6) 100

(%i7) s2[%]; /* ultimo registro */

( %o7) [3.58, 6.0, 4.58, 7.62, 11.25]

Algunas muestras incluyen datos no numericos. Como ejemplo, el ficherobiomed.data contiene cuatro medidas sanguıneas tomadas en dos grupos depacientes, A y B, de edades diferentes,

(%i8) s3:read_matrix(file_search ("biomed.data"))$

(%i9) length(s3);

( %o9) 100

(%i10) s3[1]; /* primer registro */

( %o10) [A, 30, 167.0, 89.0, 25.6, 364]

El primer individuo pertenece al grupo A, tiene 30 anos de edad y suscuatro medidas sanguıneas fueron 167.0, 89.0, 25.6 y 364.

El paquete descriptive incluye dos funciones que permiten hacer re-cuentos de datos: continuous_freq y discrete_freq; la primera de ellasagrupa en intervalos los valores de una lista de datos y hace el recuento decuantos hay dentro de cada una de las clases,

(%i11) load("descriptive")$

(%i12) continuous_freq(s1,5);

8.2. ESTADISTICA DESCRIPTIVA 127

( %o12) [[0, 1.8, 3.6, 5.4, 7.2, 9.0] , [16, 24, 18, 17, 25]]

La primera lista contiene los lımites de los intervalos de clase y la segundalos recuentos correspondientes: hay 16 dıgitos dentro del intervalo [0, 1.8],eso es ceros y unos, 24 dıgitos en (1.8, 3.6], es decir, doses y treses, etc. Elsegundo parametro indica el numero de clases deseadas, que por defecto es10.

La funcion discrete_freq hace el recuento de las frecuencias absolutasen muestras discretas, tanto numericas como categoricas. Su unico argumen-to es una lista,

(%i13) discrete_freq(s1);

( %o13) [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] , [8, 8, 12, 12, 10, 8, 9, 8, 12, 13]]

(%i14) discrete_freq(transpose(col(s3,1))[1]);

( %o14) [[A,B] , [35, 65]]

La primera lista contiene los valores muestrales y la segunda sus frecuen-cias absolutas. Las instrucciones ? col y ? transpose ayudaran a compren-der la ultima entrada.

En cuanto al calculo de parametros muestrales, el paquete descriptive

incluye, tanto para muestras univariantes como multivariantes, medias (mean),varianzas (var), desviaciones tıpicas (std), momentos centrales (central_moment)y no centrales (noncentral_moment), coeficientes de variacion (cv), rangos(range), medianas (median), cuantiles (quantile), coeficientes de curtosis(kurtosis) y de asimetrıa (skewness), y otros. En los siguientes ejemplos,s1 es una muestra univariante y s2 multivariante:

(%i15) mean(s1);

( %o15)471

100

(%i16) float(%);

( %o16) 4.71

(%i17) mean(s2); /* vector de medias */

( %o17) [9.9485, 10.1607, 10.8685, 15.7166, 14.8441]

Cuando la muestra contiene datos en formato decimal, los resultadosseran tambien en este formato, pero si la muestra contiene tan solo datosenteros, los resultados seran devueltos en formato racional. En caso de que-rer forzar que los resultados sean devueltos siempre en formato decimal,podemos jugar con la variable global numer.

128 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

(%i18) numer: true$

(%i19) var(s1);

( %o19) 8.425899999999999

(%i20) var(s2); /* vector de varianzas */

( %o20)[17.22190675000001, 14.98773651, 15.47572875, 32.17651044000001, 24.42307619000001]

(%i21) /* 1er y 3er cuartiles */

[quantile(s1,1/4),quantile(s1,3/4)];

( %o21) [2.0, 7.25]

(%i22) range(s1);

( %o22) 9

(%i25) range(s2); /* vector de rangos */

( %o25) [19.67, 20.96, 17.37, 24.38, 22.46]

(%i26) kurtosis(s1);

( %o26) −1.273247946514421

(%i27) kurtosis(s2); /* vector de coef. curtosis */

( %o27)[−.2715445622195385, 0.119998784429451,−.4275233490482866,

−.6405361979019522,−.4952382132352935]

Un aspecto crucial en el analisis estadıstico multivariante es la depen-dencia estocastica entre variables, para lo cual Maxima permite el calculode matrices de covarianzas (cov) y correlaciones (cor), ası como de otrasmedidas de variabilidad global. La variable global fpprintprec es utiliza-da para limitar el numero de decimales a imprimir; lo cual no afecta a laprecision de los calculos.

(%i28) fpprintprec:7$ /* numero de dıgitos deseados en la salida */

(%i29) cov(s2); /* matriz de covarianzas */

8.3. ESTADISTICA INFERENCIAL 129

( %o29)

17.22191 13.61811 14.37217 19.39624 15.4216213.61811 14.98774 13.30448 15.15834 14.971114.37217 13.30448 15.47573 17.32544 16.1817119.39624 15.15834 17.32544 32.17651 20.4468515.42162 14.9711 16.18171 20.44685 24.42308

(%i30) cor(s2); /* matriz de correlaciones */

( %o30)

1.0 .8476339 .8803515 .8239624 .7519506

.8476339 1.0 .8735834 .6902622 0.782502

.8803515 .8735834 1.0 .7764065 .8323358

.8239624 .6902622 .7764065 1.0 .7293848

.7519506 0.782502 .8323358 .7293848 1.0

Las funciones global_variances y list_correlations calculan, res-

pectivamente, ciertas medidas globales de variacion y correlacion; para masinformacion, pıdase ayuda a Maxima con el comando describe o con ?.

Hay varios tipos de diagramas estadısticos programados en el paquetedescriptive: scatterplot para graficos de dispersion, histogram, barsplot,piechart y boxplot para el analisis homocedastico. A continuacion se pre-sentan un par de ejemplos cuyos salidas se presentan en la Figura 8.1.

(%i31) /* Comparando variabilidades */

boxplot(

s2,

terminal = eps,

title = "Velocidades del viento")$

(%i32) /* Diagramas de dispersion para las

tres ultimas estaciones meteorologicas */

scatterplot(

submatrix(s2,1,2),

point_type = circle,

terminal = eps)$

8.3. Estadıstica inferencial

El paquete stats contiene algunos procedimientos clasicos de estadısticainferencial. Cada uno de estos procedimientos devuelve un objeto de tipoinference_result, el cual guarda todos los resultados obtenidos, aunquesolo muestre una seleccion de ellos por defecto, los que se consideran de masrelevancia; el resto permanecen ocultos y solo seran visibles a peticion delusuario. Los siguientes ejemplos aclararan su uso.

130 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

0

5

10

15

20

25

30

1 2 3 4 5

Velocidades del viento

0

5

10

15

20

2 4 6 8 10 12 14 16 18 20

10

15

20

25

4 6 8 10 12 14 16 18 20

10

15

20

25

4 6 8 10 12 14 16 18 20

4 6 8

10 12 14 16 18 20

10 15 20 25 0 2 4 6 8

10 12 14 16

5 10 15 20 25 30

10

15

20

25

10 15 20 25

4 6 8

10 12 14 16 18 20

10 15 20 25

10

15

20

25

10 15 20 25 0

5

10

15

20

5 10 15 20 25

Figura 8.1: Graficos para muestras multivariantes: a) diagramas de cajas;b) diagramas de dispersion para tres variables.

8.3. ESTADISTICA INFERENCIAL 131

Partamos de una muestra de tamano 20 y tratemos de contrastar lahipotesis nula de que la media de la poblacion de la cual procede es igual a 32,frente a la alternativa de que la media es diferente a este valor. Para aplicarel test de Student nos interesa saber si podemos considerar la poblacionnormal; la funcion test_normality nos puede ser de ayuda,

(%i1) load(stats)$

(%i2) x: [28.9,35.0,30.6,31.3,31.9,31.7,29.3,37.8,29.9,36.8,

28.0,25.3,39.6,30.4,23.3,24.7,38.6,31.3,29.8,31.9]$

(%i3) test_normality(x);

( %o3)

∣∣∣∣∣∣SHAPIRO - WILK TEST

statistic = 0.9508091p value = 0.3795395

Segun este resultado, no hay evidencias suficientes para rechazar la hipote-sis de normalidad. Hagamos ahora el contraste sobre la media,

(%i4) z: test_mean(x,mean=32);

( %o4)

∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣

MEAN TESTmean estimate = 31.305

conf level = 0.95conf interval = [29.21482, 33.39518]

method = Exact t-test. Unknown variance.hypotheses = H0: mean = 32 , H1: mean 6= 32

statistic = 0.6959443distribution = [student t , 19]

p value = 0.4948895

En la llamada a la funcion test_mean se ha indicado mediante la op-cion mean el valor de la media en la hipotesis nula. El objeto devuelto porla funcion consta, como se ve, de varios elementos: el tıtulo del objeto, lamedia muestral, el nivel de confianza, el intervalo de confianza, informacionsobre el metodo utilizado, hipotesis a contrastar, estadıstico de contraste,su distribucion y el p-valor correspondiente. Si ahora quisiesemos extraer lamedia muestral para utilizar en otros calculos,

(%i5) take_inference(mean_estimate,z);

( %o5) 31.305

En caso de querer extraer mas de un resultado,

132 CAPITULO 8. PROBABILIDADES Y ESTADISTICA

(%i6) take_inference([p_value,statistic],z);

( %o6) [0.4948895, 0.6959443]

Para saber con certeza que resultados guarda el objeto devuelto haremosuso de la funcion items_inference, con lo que comprobamos que la funciontest_mean no oculta ninguno de sus resultados,

(%i7) items_inference(z);

( %o7)[mean estimate, conf level , conf interval ,method , hypotheses, statistic, distribution, p value]

En caso de que la muestra no procediese de una poblacion normal, ysi el tamano muestral fuese suficientemente grande, se podrıa hacer uso dela opcion asymptotic=true, si la desviacion tıpica de la poblacion fueseconocida, por ejemplo σ = 4.5, podrıa anadirse la opcion dev=4.5. En fin,las opciones que admite esta funcion permiten al usuario tener cierto controlsobre el procedimiento; para mas informacion consultese el manual.

Si la poblacion de referencia no es normal y la muestra es pequena,siempre se puede acudir a un test no parametrico para realizar un contrastesobre la mediana,

(%i8) signed_rank_test(x,median=32);

( %o8)

∣∣∣∣∣∣∣∣∣∣∣∣∣∣

SIGNED RANK TESTmed estimate = 30.95

method = Asymptotic test. Tieshypotheses = H0: med = 32 , H1: med 6= 32

statistic = 75distribution = [normal , 104.5, 26.78152]

p value = 0.2706766

Consultese el manual de referencia de Maxima para ver que otros testsestan programados en el paquete stats, ası como las opciones que se puedenutilizar en cada caso.

Capıtulo 9

Otros metodos numericos

9.1. Interpolacion

El paquete interpol permite abordar el problema de la interpolaciondesde tres enfoques: lineal, polinomio de Lagrange y splines cubicos.

A lo largo de esta seccion vamos a suponer que disponemos de los valoresempıricos de la siguiente tabla:

x 7 8 1 3 6

y 2 2 5 2 7

Nos planteamos en primer lugar el calculo de la funcion de interpolacionlineal, para lo cual haremos uso de la funcion linearinterpol,

(%i1) load(interpol)$

(%i2) datos: [[7,2],[8,2],[1,5],[3,2],[6,7]]$

(%i3) linearinterpol(datos);

( %o3)

(132 −

3x2

)charfun2 (x,−∞, 3) + 2 charfun2 (x, 7,∞) +

(37− 5x) charfun2 (x, 6, 7) +(

5x3 − 3

)charfun2 (x, 3, 6)

(%i4) f(x):=’’%$

Empezamos cargando el paquete que define las funciones de interpola-cion y a continuacion introducimos los pares de datos en forma de lista. Lafuncion linearinterpol devuelve una expresion definida a trozos, en la quecharfun2(x,a,b) devuelve 1 si el primer argumento pertence al intervalo[a, b) y 0 en caso contrario. Por ultimo, definimos cierta funcion f previa eva-luacion (dos comillas simples) de la expresion devuelta por linearinterpol.Esta funcion la podemos utilizar ahora tanto para interpolar como para ex-trapolar:

133

134 CAPITULO 9. OTROS METODOS NUMERICOS

(%i5) map(f,[7.3,25/7,%pi]);

( %o5)

[2,

62

21,5π

3− 3

](%i6) float(%);

( %o6) [2.0, 2.952380952380953, 2.235987755982989]

Unos comentarios antes de continuar. Los datos los hemos introducidocomo una lista de pares de numeros, pero tambien la funcion admite unamatriz de dos columnas o una lista de numeros, asignandole en este ultimocaso las abscisas secuencialmente a partir de la unidad; ademas, la listade pares de la variable datos no ha sido necesario ordenarla respecto dela primera coordenada, asunto del que ya se encarga Maxima por cuentapropia.

El polinomio de interpolacion de Lagrange se calcula con la funcionlagrange; en el siguiente ejemplo le daremos a los datos un formato matri-cial y le indicaremos a Maxima que nos devuelva el polinomio con variableindependiente w,

(%i7) datos2: matrix([7,2],[8,2],[1,5],[3,2],[6,7]);

( %o7)

7 28 21 53 26 7

(%i8) lagrange(datos2,varname=’w);

( %o8)73w4

420− 701w3

210+

8957w2

420− 5288w

105+

186

5

(%i9) g(w):=’’%$

(%i10) map(g,[7.3,25/7,%pi]), numer;

( %o10) [1.043464999999799, 5.567941928958199, 2.89319655125692]

Disponemos en este punto de dos funciones de interpolacion; repre-sentemoslas graficamente junto con los datos empıricos,

9.1. INTERPOLACION 135

(%i11) load(draw)$

(%i12) draw2d(

key = "Interpolador lineal",

explicit(f(x),x,0,10),

line_type = dots,

key = "Interpolador de Lagrange",

explicit(g(x),x,0,10),

key = "Datos empiricos",

points(datos),

terminal = eps)$

cuyo resultado se ve en el apartado a) de la Figura 9.1.El metodo de los splines cubicos consiste en calcular polinomios inter-

poladores de tercer grado entre dos puntos de referencia consecutivos, demanera que sus derivadas cumplan ciertas condiciones que aseguren unacurva sin cambios bruscos de direccion. La funcion que ahora necesitamoses cspline,

(%i13) cspline(datos);

( %o13)

(1159x3

3288 −1159x2

1096 −6091x3288 + 8283

1096

)charfun2 (x,−∞, 3) +(

−2587x3

1644 + 5174x2

137 − 494117x1644 + 108928

137

)charfun2 (x, 7,∞) +(

4715x3

1644 −15209x2

274 + 579277x1644 − 199575

274

)charfun2 (x, 6, 7) +(

−3287x3

4932 + 2223x2

274 − 48275x1644 + 9609

274

)charfun2 (x, 3, 6)

(%i14) s1(x):=’’%$

(%i15) map(s1,[7.3,25/7,%pi]), numer;

( %o15) [1.438224452554664, 3.320503453379974, 2.227405312429507]

La funcion cspline admite, ademas de la opcion ’varname que ya sevio anteriormente, otras dos a las que se hace referencia con los sımbolos’d1 y ’dn, que indican las primeras derivadas en las abscisas de los extre-mos; estos valores establecen las condiciones de contorno y con ellas Maximacalculara los valores de las segundas derivadas en estos mismos puntos extre-mos; en caso de no suministrarse, como en el anterior ejemplo, las segundasderivadas se igualan a cero. En el siguiente ejemplo hacemos uso de estasopciones,

(%i16) cspline(datos,’varname=’z,d1=1,dn=0);

136 CAPITULO 9. OTROS METODOS NUMERICOS

0

10

20

30

40

50

60

0 2 4 6 8 10

Interpolador linealInterpolador de Lagrange

Datos empiricos

-30

-25

-20

-15

-10

-5

0

5

0 2 4 6 8 10

s1s2

Datos empiricos

a) b)

Figura 9.1: Interpolacion: a) lineal y de Lagrange; b) Splines cubicos.

( %o16)

(2339 z3

2256 −14515 z2

2256 + 24269 z2256 −

271752

)charfun2 (z,−∞, 3) +(

−1553 z3

564 + 35719 z2

564 − 68332 z141 + 174218

141

)charfun2 (z, 7,∞) +(

613 z3

188 −35513 z2

564 + 56324 z141 − 38882

47

)charfun2 (z, 6, 7) +(

−4045 z3

5076 + 1893 z2

188 − 5464 z141 + 2310

47

)charfun2 (z, 3, 6)

(%i17) s2(z):=’’%$

(%i18) map(s2,[7.3,25/7,%pi]), numer;

( %o18) [1.595228723404261, 2.88141531519733, 2.076658794432369]

Con esto hemos obtenido dos interpoladores distintos por el metodo delos splines cubicos; con el siguiente codigo pedimos su representacion grafica,cuyo resultado se observa en el apartado b) de la Figura 9.1.

(%i19) draw2d(

key = "s1",

explicit(s1(x),x,0,10),

line_type = dots,

9.2. AJUSTE POR MINIMOS CUADRADOS 137

key = "s2",

explicit(s2(x),x,0,10),

key = "Datos empiricos",

points(datos),

terminal = eps)$

9.2. Ajuste por mınimos cuadrados

Existe en Maxima la posibilidad de ajustar por mınimos cuadrados adatos empıricos los parametros de curvas arbitrarias mediante las funcionesdel paquete lsquares. Vamos a simular una muestra de tamano 100 devalores x en el intervalo [0, 10]. Con estas abscisas calculamos despues lasordenadas a partir de la suma de una senal determinista (f) mas un ruidogaussiano. Para hacer la simulacion necesitamos cargar en primer lugar alpaquete distrib.

(%i1) load(distrib)$

(%i2) abs: makelist(random_continuous_uniform(0,10),k,1,100)$

(%i3) f(x):=3*(x-5)^2$

(%i4) data: apply(matrix,makelist([x, f(x)+random_normal(0,1)],x,abs))$

Aunque la senal determinista obedece a una funcion polinomica de se-gundo grado, si no lo sabemos a priori intentamos ajustar un polinomiocubico:

(%i5) load(lsquares)$

(%i6) param: lsquares_estimates(data,[x,y],

y=a*x^3+b*x^2+c*x+d,[a,b,c,d]), numer;

( %o6)[[a = −0.002705800223881305, b = 3.018798873646606 ,c = −29.94151342602112, d = 74.78603431944423]]

Vemos claramente que el termino de tercer grado es superfluo, por lo quereajustamos al de segundo grado,

(%i7) param: lsquares_estimates(data,[x,y],

y=b*x^2+c*x+d,[b,c,d]), numer;

( %o7)[[b = 2.979110687882263, c = −29.78353057922009, d = 74.64523259993118]]

Ahora estamos en disposicion de estudiar los residuos para valorar elajuste. En primer lugar calculamos el error cuadratico medio del residuo,definido como

138 CAPITULO 9. OTROS METODOS NUMERICOS

MSE =1

n

n∑i=1

(rhs(ei)− lhs(ei))2 ,

siendo n el tamano de la muestra y rhs(ei) y lhs(ei) los miembros derecho eizquierdo, respectivamente, de la expresion a ajustar. Para el caso que nosocupa, el valor calculado es

(%i8) lsquares_residual_mse(data, [x,y], y=b*x^2+c*x+d, first(param));

( %o8) 1.144872557335554

Tambien podemos calcular el vector de los residuos, definidos comolhs(ei) − rhs(ei), ∀i, para a continuacion representarlos graficamente jun-to con los datos y la curva ajustada, tal como se aprecia en la Figura 9.2.

(%i9) res: lsquares_residuals(data, [x,y],

y=b*x^2+c*x+d, first(param))$

(%i10) load(draw)$ /* necesitaremos las rutinas graficas */

(%i10) scene1: gr2d(points(data),

explicit(ev(b*x^2+c*x+d,first(param)),x,0,10))$

(%i12) scene2: gr2d(points_joined = true,

points(res))$

(%i13) draw(terminal = eps, scene1, scene2)$

Nosotros ya sabemos que el ruido del proceso simulado es gaussianode esperanza nula. En una situacion real, este dato lo desconoceremos y nosinteresara contrastar la hipotesis de normalidad y la de la nulidad de la mediade los residuos. El paquete stats tiene algunos procedimientos inferenciales,entre los cuales estan las funciones test_normality y test_mean; primerocargamos el paquete y contrastamos la hipotesis de normalidad,

(%i14) load(stats)$

(%i15) test_normality(res);

( %o15)

∣∣∣∣∣∣SHAPIRO - WILK TEST

statistic = 0.986785359052448p value = 0.423354600782769

El p-valor es lo suficientemente alto como para no rechazar la hipotesisnula de normalidad; ahora contrastamos la nulidad de la esperanza del ruido,

(%i16) test_mean(res);

9.3. OPTIMIZACION CON RESTRICCIONES 139

0

10

20

30

40

50

60

70

0 2 4 6 8 10

-2

-1

0

1

2

10 20 30 40 50 60 70 80 90 100

Figura 9.2: Resultados graficos del ajuste por mınimos cuadrados.

( %o16)

∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣

MEAN TESTmean estimate = −1.002451472320587× 10−7

conf level = 0.95conf interval = [−.2133782738324136, .2133780733421191]

method = Exact t-test. Unknown variance.hypotheses = H0: mean = 0 , H1: mean 6= 0

statistic = 9.321855844715968× 10−7

distribution = [student t , 99]p value = .9999992583830712

Sin duda admitirıamos la hipotesis nula como valida.

9.3. Optimizacion con restricciones

El paquete augmented_lagrangian permite minimizar funciones bajorestricciones expresables en forma de igualdades. Concretamente, si quere-mos obtener el valor mınimo de la funcion f(x, y) = x2 + 2y2, entre aquellospuntos que cumplen la condicion x+y = 1, podemos hacer uso de la funcionaugmented_lagrangian_method.

En primer lugar debemos cargar en memoria el programa correspondien-te,

(%i1) load ("augmented_lagrangian")$

140 CAPITULO 9. OTROS METODOS NUMERICOS

Introducimos la funcion objetivo y la restriccion, la cual guardamos enuna lista, dando por sentado que la expresion que la define esta igualada acero,

(%i2) f(x,y) := x^2 + 2*y^2 $

(%i3) c: [x + y - 1] $

A continuacion hacemos la llamada a la funcion correspondiente, en laque introducimos la funcion, la lista de variables independientes, las res-tricciones, un vector con una solucion inicial aproximada y una opcion quecontrola la salida de resultados intermedios. El valor que nos devuelve lafuncion es una lista con dos elementos, siendo el primero la solucion y elsegundo el valor de un parametro del algoritmo.

(%i4) sol: augmented_lagrangian_method(

f(x,y), [x, y], c, [1, 1], iprint=[-1,0]);

( %o4)[[x = .6666598410800233, y = .3333402724554476] , %lambda = [−1.333337940892538]]

Podemos asignar la solucion a las variables x0 y y0 y a continuacion z0,el valor mınimo alcanzado,

(%i5) [x0,y0]: map(rhs, first(sol)) $

(%i6) z0: f(x0,y0);

( %o6) 0.666666818190186

Para facilitar la visualizacion del problema, podemos plantearnos la rea-lizacion de un grafico, Figura 9.3,

(%i7) load("draw") $

(%i8) draw3d(

terminal = eps,

view = [93, 143],

enhanced3d = [z,x,z],

explicit(x^2 + 2*y^2, x, -2, 2, y, -2, 2),

color = red,

enhanced3d = [-z,x,z],

parametric_surface(x, -x+1, z, x, -2, 2, z, -1, 5),

enhanced3d = false,

color = black,

point_size = 2,

points([[x0,y0,z0]]))$

9.4. PROGRAMACION LINEAL 141

-2-1.5-1-0.5 0 0.5 1 1.5 2 -2 -1 0 1 2 3

0 2 4 6 8

10 12

-5-4-3-2-1 0 1 2

Figura 9.3: Minimizacion con restricciones.

9.4. Programacion lineal

El paquete simplex dispone de las funciones minimize_lp y maximize_lp

para la resolucion de problemas de programacion lineal. Nos planteamos elsiguiente problema:

Max. F (x1, x2, x3, x4) = 2x1 + 4x2 + x3 + x4

sujeto a x1 + 3x2 + x4 ≤ 4

2x1 + x2 ≤ 3

x2 + 4x3 + x4 ≤ 3

x1, x2, x3, x4 ∈ R+

que seguidamente pasamos a resolver cargando previamente en memoria elprograma y definiendo la funcion objetivo y las restricciones asociadas alproblema,

(%i1) load("simplex") $

(%i2) F : 2*x1 + 4*x2 + x3 + x4 $

(%i3) r1 : x1 + 3*x2 + x4 <= 4 $

(%i4) r2 : 2*x1 + x2 <= 3 $

(%i5) r3 : x2 + 4*x3 + x4 <= 3 $

(%i6) r4 : x1 >= 0 $

142 CAPITULO 9. OTROS METODOS NUMERICOS

(%i7) r5 : x2 >= 0 $

(%i8) r6 : x3 >= 0 $

(%i9) r7 : x4 >= 0 $

A continuacion resolvemos el problema invocando la funcion maximize_lp,

(%i10) maximize_lp(F, [r1, r2, r3, r4, r5, r6, r7]);

( %o10)

[13

2,

[x3 =

1

2, x4 = 0, x2 = 1, x1 = 1

]]El primer elemento de la lista es el valor maximo que alcanza la funcion

objetivo y el segundo es la lista que contiene la solucion.

Capıtulo 10

Programando en Maxima

10.1. Programacion a nivel de Maxima

Esencialmente, programar consiste en escribir secuencialmente un grupode sentencias sintacticamente correctas que el interprete pueda leer y luegoejecutar; la manera mas sencilla de empaquetar varias sentencias es medianteparentesis, siendo el resultado del programa la salida de la ultima sentencia:

(%i1) (a:3, b:6, a+b);

( %o1) 9

(%i2) a;

( %o2) 3

(%i3) b;

( %o3) 6

Como se ve en las salidas %o2 y %o3, este metodo conlleva un peligro,que consiste en que podemos alterar desapercibidamente valores de variablesque quizas se esten utilizando en otras partes de la sesion actual. La solucionpasa por declarar variables localmente, cuya existencia no se extiende masalla de la duracion del programa, mediante el uso de bloques; el siguienteejemplo muestra el mismo calculo anterior declarando c y d locales, ademasse ve como es posible asignarles valores a las variables en el momento decrearlas:

(%i4) block([c,d:6],

c:3,

c+d );

143

144 CAPITULO 10. PROGRAMANDO EN MAXIMA

( %o4) 9

(%i5) c;

( %o5) c

(%i6) d;

( %o6) d

A la hora de hacer un programa, lo habitual es empaquetarlo como cuer-po de una funcion, de forma que sea sencillo utilizar el codigo escrito tantasveces como sea necesario sin mas que escribir el nombre de la funcion con losargumentos necesarios; la estructura de la definicion de una funcion necesitael uso del operador :=

f(<arg1>,<arg2>,...):=<expr>

donde <expr> es una unica sentencia o un bloque con variables locales;veanse los siguientes ejemplos:

(%i7) loga(x,a):= float(log(x) / log(a)) $

(%i8) loga(7, 4);

( %o8) 1.403677461028802

(%i9) fact(n):=block([prod:1],

for k:1 thru n do prod:prod*k,

prod )$

(%i10) fact(45);

( %o10) 119622220865480194561963161495657715064383733760000000000

En el primer caso (loga) se definen los logaritmos en base arbitraria(Maxima solo tiene definidos los naturales); ademas, previendo que solo losvamos a necesitar en su forma numerica, solicitamos que nos los evaluesiempre en formato decimal. En el segundo caso (fact) hacemos uso de unbucle para calcular factoriales. Esta ultima funcion podrıa haberse escritorecursivamente mediante un sencillo condicional,

(%i11) fact2(n):= if n=1 then 1

else n*fact2(n-1) $

10.1. PROGRAMACION A NIVEL DE MAXIMA 145

(%i12) fact2(45);

( %o12) 119622220865480194561963161495657715064383733760000000000

O mas facil todavıa,

(%i13) 45!;

( %o13) 119622220865480194561963161495657715064383733760000000000

Acabamos de ver dos estructuras de control de flujo comunes a todoslos lenguajes de programacion, las sentencias if-then-else y los buclesfor. En cuanto a las primeras, puede ser de utilidad la siguiente tabla deoperadores relacionales

= ...igual que...

# ...diferente de...

> ...mayor que...

< ...menor que...

>= ...mayor o igual que...

<= ...menor o igual que...

He aquı un ejemplo de uso.

(%i14) makelist(is(log(x)<x-1), x, [0.9,1,1.1]);

( %o14) [true, false, true]

Los operadores logicos que frecuentemente se utilizaran con las relacionesanteriores son and, or y not, con sus significados obvios

p q p and q p or q not p

false false false false true

false true false true true

true false false true false

true true true true false

(%i15) if sin(4)< 9/10 and 2^2 = 4 then 1 else -1 ;

( %o15) 1

(%i16) if sin(4)< -9/10 and 2^2 = 4 then 1 else -1 ;

146 CAPITULO 10. PROGRAMANDO EN MAXIMA

( %o16) −1

Se ilustra en el ejemplo anterior (%i14) como se evalua con la funcionis el valor de verdad de una expresion relacional ante la ausencia de uncondicional o de un operador logico; la siguiente secuencia aclara algo maslas cosas:

(%i17) sin(4)< 9/10 ;

( %o17) sin 4 <9

10

(%i18) is(sin(4)< 9/10);

( %o18) true

Pero ante la presencia de un operador logico o una sentencia condicional,is ya no es necesario:

(%i19) sin(4)< 9/10 and 2^2 = 4;

( %o19) true

(%i20) if sin(4)< 9/10 then 1;

( %o20) 1

En cuanto a los bucles, for es muy versatil; tiene las siguientes variantes:

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>

Cuando el incremento de la variable es la unidad, se puede obviar laparte de la sentencia relativa a step, dando lugar a los esquemas

for <var>:<val1> thru <val3> do <expr>

for <var>:<val1> while <cond> do <expr>

for <var>:<val1> unless <cond> do <expr>

Cuando no sea necesaria la presencia de una variable de recuento deiteraciones, tambien se podra prescindir de los for, como en

10.1. PROGRAMACION A NIVEL DE MAXIMA 147

while <cond> do <expr>

unless <cond> do <expr>

Algunos ejemplos que se explican por sı solos:

(%i21) for z:-5 while z+2<0 do print(z) ;

- 5

- 4

- 3

( %o21) done

(%i22) for z:-5 unless z+2>0 do print(z) ;

- 5

- 4

- 3

- 2

( %o22) done

(%i23) for cont:1 thru 3 step 0.5 do (var: cont^3, print(var)) ;

1

3.375

8.0

15.625

27.0

( %o23) done

(%i24) [z, cont, var];

( %o24) [z, cont , 27.0]

(%i25) while random(20) < 15 do print("qqq") ;

qqq

qqq

qqq

( %o25) done

Vease en el resultado %o24 como las variables z y cont no quedan convalor asignado, mientras que var sı; la razon es que tanto z como cont

son locales en sus respectivos bucles, expirando cuando este termina; estosignifica, por ejemplo, que no serıa necesario declararlas locales dentro deun bloque.

Otra variante de for, sin duda inspirada en la propia sintaxis de Lisp,es cuando el contador recorre los valores de una lista; su forma es

148 CAPITULO 10. PROGRAMANDO EN MAXIMA

for <var> in <lista> do <expr>

y un ejemplo:

(%i26) for z in [sin(x), exp(x), x^(3/4)] do print(diff(z,x)) $

cos(x)

x

%e

3

------

1/4

4 x

Cuando una funcion debe admitir un numero indeterminado de argu-mentos, se colocaran primero los que tengan caracter obligatorio, encerran-do el ultimo entre corchetes para indicar que a partir de ahı el numero deargumentos puede ser arbitrario. La siguiente funcion suma y resta alterna-tivamente las potencias n-esimas de sus argumentos, siendo el exponente suprimer argumento,

(%i27) sumdif(n,[x]):= x^n . makelist((-1)^(k+1), k, 1, length(x)) $

(%i28) sumdif(7,a,b,c,d,e,f,g);

( %o28) g7 − f7 + e7 − d7 + c7 − b7 + a7

(%i29) sumdif(%pi,u+v);

( %o29) (v + u)π

En la entrada %i27, dentro del cuerpo de la funcion, la variable x es lalista de los argumentos que podrıamos llamar restantes; como tal lista, lafuncion length devuelve el numero de elementos que contiene. Recuerdesetambien que una lista elevada a un exponente devuelve otra lista con loselementos de la anterior elevados a ese mismo exponente. Por ultimo, eloperador . calcula el producto escalar.

En otras ocasiones, puede ser de interes pasar como argumento una fun-cion, en lugar de un valor numerico o una expresion. Esto no tiene problemapara Maxima, pero debe hacerse con cierto cuidado. A continuacion se defineuna funcion de Maxima que toma como argumento una funcion y la aplicaa los cinco primeros numeros enteros positivos,

10.1. PROGRAMACION A NIVEL DE MAXIMA 149

(%i30) fun_a(G):= map(G, [1,2,3,4,5]) $

Pretendemos ahora aplicar a estos cinco elementos la funcion seno, locual no da ningun problema,

(%i31) fun_a(sin);

( %o31) [sin 1, sin 2, sin 3, sin 4, sin 5]

Pero el problema lo vamos a tener cuando queramos aplicar una funcionalgo mas compleja,

(%i32) fun_a(sin(x)+cos(x));

Improper name or value in functional position:

sin(x) + cos(x)

#0: fun_a(g=sin(x)+cos(x))

-- an error. To debug this try debugmode(true);

lo cual se debe al hecho de que la funcion map no reconoce el argumentocomo funcion. En tal caso lo apropiado es definir la funcion objetivo sepa-radamente, lo cual podemos hacer como funcion ordinaria o como funcionlambda:

(%i33) sc(z):= sin(z) + cos(z) $

(%i34) fun_a(sc);

( %o34) [sin 1 + cos 1, sin 2 + cos 2, sin 3 + cos 3, sin 4 + cos 4, sin 5 + cos 5]

(%i35) fun_a( lambda([z], sin(z)+cos(z)) );

( %o35) [sin 1 + cos 1, sin 2 + cos 2, sin 3 + cos 3, sin 4 + cos 4, sin 5 + cos 5]

Cuando se hace un programa, lo habitual es escribir el codigo con uneditor de texto y almacenarlo en un archivo con extension mac. Una vezdentro de Maxima, la instruccion

load("ruta/fichero.mac")$

leera las funciones escritas en el y las cargara en la memoria, listas para serutilizadas.

Si alguna de las funciones definidas en el fichero fichero.mac contienealgun error, devolviendonos un resultado incorrecto, Maxima dispone delmodo de ejecucion de depurado (debugmode), que ejecuta el codigo pasoa paso, pudiendo el programador chequear interactivamente el estado delas variables o asignarles valores arbitrariamente. Supongamos el siguientecontenido de cierto fichero prueba.mac

150 CAPITULO 10. PROGRAMANDO EN MAXIMA

foo(y) :=

block ([u:y^2],

u: u+3,

u: u^2,

u);

Ahora, la siguiente sesion nos permite analizar los valores de las variablesen cierto punto de la ejecucion de la funcion:

(%i26) load("prueba.mac"); /* cargamos fichero */

( %o26) prueba.mac

(%i27) :break foo 3 /* declaro punto de ruptura al final de lınea 3*/

Turning on debugging debugmode(true)

Bkpt 0 for foo (in prueba.mac line 4)

(%i27) foo(2); /* llamada a funcion */

Bkpt 0:(prueba.mac 4)

prueba.mac:4:: /* se detiene al comienzo de la lınea 4 */

(dbm:1) u; /* ¿valor de u? */

7

(dbm:1) y; /* ¿valor de y? */

2

(dbm:1) u: 1000; /* cambio valor de u */

1000

(dbm:1) :continue /* continua ejecucion */

( %o27) 1000000

10.2. Programacion a nivel de Lisp

A veces se presentan circunstancias en las que es mejor hacer progra-mas para Maxima directamente en Lisp; tal es el caso de las funciones queno requieran de mucho procesamiento simbolico, como funciones de calculonumerico o la creacion de nuevas estructuras de datos.

Sin dar por hecho que el lector conoce el lenguaje de programacion Lisp,nos limitaremos a dar unos breves esbozos. Empecemos por ver como alma-cena Maxima internamente algunas expresiones:

(%i1) 3/4;

10.2. PROGRAMACION A NIVEL DE LISP 151

( %o1)3

4

(%i2) :lisp $%o1

((RAT SIMP) 3 4)

(%i2) :lisp ($num $%o1)

3

La expresion 34 se almacena internamente como la lista ((RAT SIMP) 3 4).

Una vez se ha entrado en modo Lisp mediante :lisp, le hemos pedido a Ma-xima que nos devuelva la expresion %o1; la razon por la que se antepone elsımbolo de dolar es que desde Lisp, los objetos de Maxima, tanto variablescomo nombres de funciones, llevan este prefijo. En la segunda instruccion queintroducimos a nivel Lisp, le indicamos que aplique a la fraccion la funcionde Maxima num, que devuelve el numerador de una fraccion.

Del mismo modo que desde el nivel de Lisp ejecutamos una instruccion deMaxima, al nivel de Maxima tambien se pueden ejecutar funciones de Lisp.Como ejemplo, veamos el comportamiento de las dos funciones de redondeo,la definida para Maxima y la propia del lenguaje Lisp:

(%i3) round(%pi);

( %o3) 3

(%i4) ?round(%pi);

Maxima encountered a Lisp error:

ROUND: $%PI is not a real number

Automatically continuing.

To reenable the Lisp debugger set *debugger-hook* to nil.

En el primer caso llamamos a la funcion de redondeo de Maxima y nosdevuelve un resultado que reconocemos como correcto. En el segundo caso,al utilizar el prefijo ?, estamos haciendo una llamada a la funcion round

de Lisp y obtenemos un error; la razon es que esta funcion de Lisp soloreconoce numeros como argumentos. En otras palabras, a nivel de Maximase ha redefinido round para que reconozca expresiones simbolicas.

A efectos de saciar nuestra curiosidad, veamos como se almacenan inter-namente otras expresiones:

(%i5) x+y*2;

152 CAPITULO 10. PROGRAMANDO EN MAXIMA

( %o5) 2 y + x

(%i6) [1,2];

( %o6) [1, 2]

(%i7) :lisp $%o5

((MPLUS SIMP) $X ((MTIMES SIMP) 2 $Y))

(%i7) :lisp $%o6

((MLIST SIMP) 1 2)

Otra forma de mostrar la representacion interna de expresiones de Maxi-ma es invocando la funcion print de Lisp. El siguiente ejemplo nos muestraque Maxima almacena internamente una expresion negativa como un pro-ducto por -1.

(%i8) ?print(-a)$

((MTIMES SIMP) -1 $A)

Para terminar, un ejemplo de como definir a nivel de Lisp una funcion quecambia de signo una expresion cualquiera que le pasemos como argumento:

(%i8) :lisp (defun $opuesto (x) (list ’(mtimes) -1 x))

$OPUESTO

(%i9) opuesto(a+b);

( %o9) −b− a

Se ha hecho un gran esfuerzo para que Maxima sea lo mas universal po-sible en cuanto a entornos Common Lisp, de tal manera que en la actualidadMaxima funciona perfectamente con los entornos libres clisp, gcl, cmuclo sbcl.

Tambien es posible llamar desde el nivel de Lisp funciones que previa-mente hayan sido definidas en Maxima, para lo cual sera necesario utilizarla funcion Lisp mfuncall.

(%i10) cubo(x):= x^3$

(%i11) :lisp (mfuncall ’$cubo 3)

27

Con :lisp solo podemos ejecutar una unica sentencia Lisp; pero si loque queremos es abrir una sesion Lisp completa, haremos uso de la funcionto_lisp, terminada la cual volveremos a Maxima ejecutando (to-maxima).

10.2. PROGRAMACION A NIVEL DE LISP 153

(%i12) to_lisp()$

Type (to-maxima) to restart, ($quit) to quit Maxima.

MAXIMA> (+ #c(3 4) #c(5 6/8)) ; suma complejos

#C(8 19/4)

MAXIMA> (if (< 2 0)

"2 es negativo"

"2 no es negativo") ; ejemplo de condicional

"2 no es negativo"

MAXIMA> (to-maxima)

Returning to Maxima

(%i13)