Está en la página 1de 17

EJEMPLOS DE USO DE MAXIMA

MARTÍN PAVÓN

Índice
1. Introducción 1
2. Gráficos 2
2.1. Las instrucciones plot2d y plot3d 2
2.2. El paquete draw y las instrucciones draw2d y draw3d 3
3. Matrices 5
3.1. Operaciones 5
3.2. Determinante e inversa 6
3.3. Submatrices 6
4. Diferenciación 7
4.1. Derivadas 7
4.2. Diferencial, matriz jacobiana 9
4.3. Hessiano, extremos locales de funciones de varias variables 10
5. Integración 12
5.1. Integración de funciones de una variable. 12
5.2. Integración de funciones de varias varibles. 13
6. Ecuaciones diferenciales ordinarias 13
6.1. Derivadas 13
6.2. Solución general de ecuaciones diferenciales lineales de primer y segundo orden 14
6.3. Condiciones iniciales y de borde 14
7. Series de Fourier 16
7.1. Series de Fourier de una función dada 16
7.2. Series de senos y cosenos 17

1. Introducción
Estas notas no pretenden ser una introducción formal al uso del programa Maxima, sólo pretenden
mostrar algunas instrucciones básicas y unos pocos ejemplos de uso, que pueden ser convenientes para
complementar el estudio de cursos de análisis matemático, ecuaciones diferenciales, etc. Además de la docu-
mentación de ayuda que acompaña al programa, en la red pueden encontrarse varios tutoriales (por ejemplo
en http://www.csulb.edu/~ woollett/) y aún videos ( http://vimeo.com/maximajaj#3053491). Existen
versiones del programa para Linux, Mac que es instalan de la manera usual y para Windows; esta última
puede descargarse de
http://sourceforge.net/projects/maxima/files/Maxima-Windows/5.20.1-Windows/maxima-5.20.1.exe/download

La idea de las notas es que el lector copie los ejemplos que aparecen y a partir de ahı́ comience a
experimentar introduciendo los cambios que desee hasta familiarizarse con la instrucción que esté empleando.
Si bien en la ventana aparece una barra con botones para las operaciones más frecuentes, las intrucciones
están pensadas para ser tipeadas (o usar copy & paste). Para ejecutar lo que se tipea se debe presionar
enter o crtl + enter según la configuración.
2 MARTÍN PAVÓN

2. Gráficos
2.1. Las instrucciones plot2d y plot3d. Los comandos más sencillos en Maxima para realizar gráficos
relacionados con funciones son plot2d para graficar curvas en el plano (ya sean curvas parametrizadas o
gráficos de funciones )y plot3d para obtener el gráfico de funciones definidas en subconjuntos de R2 a R .

Ejemplos

(1) Gráfico de la función f (x) = x2 − 3x + 2 , con −5 ≤ x ≤ 6 .


plot2d([x^2 - 3*x +2], [x,-5,5])$

(2) Gráfico de la función f (x) = sen(3x) y g(x) = cos(2x) con x entre −π y 2π .


plot2d([sin(3*x), cos(2*x)], [x, -%pi, 3*%pi])
(Observar que las distintas funciones están dentro de un mismo corchete, separadas por comas y
el uso de %pi para el número π .)

(3) Gráfico de una circunferencia parametrizada


plot2d ([parametric, cos(t), sin(t), [t,-%pi,%pi]],
[gnuplot_preamble, "set size ratio -1"])

Es conveniente señalar algunas diferencias en la estructura de las instrucciones, por ejemplo, cuan-
do dibujamos el gráfico de una función, el rango de la variable está afuera del corchete donde está la
definición de la función; en cambio en el paso paramétrico, además de la instrucción parametric
el rango está dentro del mismo corchete. La instrucción dentro del último corchete se emplea para
enviar instrucciones al programa que ese encarga en última instancia de hacer el dibujo (en este caso
la instrucción es la que está entre comillas), ¿qué pasa si no la colocamos?

(4) Gráfico de f (x, y) = yex + x sen(y) , −1 ≤ x ≤ 2 , −2 ≤ y ≤ 5 .


plot3d(y*exp(x)- x*sin(y), [x,-1,2], [y,-2,5])

(5) El mismo gráfico del inciso anterior, pero con el agregado del nombre los ejes.
plot3d(exp(x)- x*sin(y), [x,-1,2], [y,-2,5],
[xlabel, "eje x"], [ylabel, "eje y"], [zlabel, "z"])



 x2

 si y < 0,
 x2 + y 2
(6) Gráfico de la función f (x, y) = 0 si y = 0,

 y2

 p si y > 0.

x2 + y 2

Primero definimos la función de la siguiente manera:


f(x, y):= if y < 0 then x^2/(x^2 + y^2)
elseif y = 0 then 0
else y^2/sqrt(x^2 + y^2)

Prestar atención a la manera de realizar la asignación := y a la estructura


if ... elseif ... else .
Una vez resuelto esto, procedemos con en los ejemplos anteriores pero en lugar de poner la fórmula,
usamos el nombre de la función; en este caso f.
EJEMPLOS DE USO DE MAXIMA 3

plot3d( f, [x, -1, 1], [y, -1, 1], [xlabel, "eje x"], [ylabel, "eje y"])

(7) Para graficar una superficie parametrizada, no es necesaria la instrucción parametric, el siguiente
ejemplo muestra el dibujo de la superficie parametrizada dada por f (u, v) = (u + v, u − 5v, u2 − v) ,
con u y v entre −3 y 3 .
plot3d([u + v , u - 5*v, u^2 -v], [u, -3, 3 ], [v , -3, 3])

Una vez más, es conveniente que se detengan unos instantes a observar las diferencias plot2d y
plot3d.

2.2. El paquete draw y las instrucciones draw2d y draw3d. Si bien las instrucciones anteriores son
suficientes para gráficos simples, carecen de flexibilidad a la hora de encarar gráficos más ambiciosos; en
particular, el de superficies definidas por ecuaciones o representar en un único dibujo gráficos de distinto tipo:
superficies definidas por ecuaciones, curvas parametrizadas y gráficos de funciones. En este caso combine
utilizar el paquete draw. Vale la pena señalar que esta mayor flexibilidad se da a costa de una mayor
complejidad, aquı́ presentamos unos ejemplos mı́nimos, la referencia obligada tanto para ejemplos como
para más información es
http://www.telefonica.net/web2/biomates/maxima/gpdraw/index.html
Para comenzar, es importante señalar que si bien draw es un paquete estandar del programa, no se carga
automáticamente, de modo que eso tenemos que hacerlo nosotros; para esto basta ejecutar la instrucción
load(draw).

Ejemplos

(1) Graficar la función f (x, y) = x2 − y 2 con −1 ≤ x ≤ 2 , −2 ≤ y ≤ 2 .


load(draw);
draw3d(
explicit(x^2 - y^2, x, -2, 2, y, -2, 2),
surface_hide=true)

Vale la pena notar que la fórmula de la función aparece dentro del explicit acompañada por el
rango de las variables.

(2) Graficar la función del inciso (6) del ejemplo anterior.


En este caso utilizamos una caracterı́stica particular de draw que permite superponer gráficos de
distintas funciones en un mismo dibujo. ¿Cuál de los dos gráficos representa más fielmente al gráfico
de la función?
draw3d(
xu_grid=20, yv_grid=20,
explicit(x^2/(x^2 + y^2), x, -1, 1, y,-1, 0),
color="red",
line_width=3,
parametric(t,0,0, t, -1, 1),
line_width=1,
color="black",
explicit(y^2/sqrt(x^2 + y^2), x, -1, 1, y,0 , 1),
surface_hide=true,xlabel="eje x", ylabel="eje y", zlabel="eje z"
);

En este caso, además de las declaraciones de color para el gráfico aparece la instrucción parametric
para introducir una curva representada en forma paramétrica que corresponde a la condición f (x, y) =
4 MARTÍN PAVÓN

0 si y = 0 . Si hubiesemos querido representar una superficie parametrizada, la instrucción que cor-


responde es parametric surface.
xu grid e yv grid se utilizan para indicar las cantidad de puntos que se usan para la malla
que genera la superficie. line width establece el grosor del trazo; damos el valor 3 para que no pase
desapercibida la curva roja y después volvemos al valor por defecto.

(3) Graficar la esfera de centro (0, 0, 0) y radio 1 y el plano de ecuación z = x − y .


draw3d(
color="red",
implicit(x^2 + y^2 + z^2 = 1, x, -1, 1, y, -1, 1, z, -1, 1),
color="blue",
explicit(x - y, x, -1,1, y, -1, 1),
surface_hide=true,
xlabel="eje x", ylabel="eje y", zlabel= "eje z",
user_preamble="set size 0.5,1;set origin 0.25,0.1")

Este ejemplo muestra el uso de la instrucción implicit para graficar superficies definidas por ecua-
ciones (en el caso de la esfera). Respecto al plano, dado que la ecuación tiene la forma z = f (x, y)
continuamos usando la instrucción explicit. Por último, en el caso de tres dimensiones, la instruc-
ción set size ratio square no tiene ninguna utilidad y debemos recurrir a la instrucción más
complicada dada dentro del user preamble. (Por otro lado, no debemos confundirnos: dentro de
plot2d y plot3d se usa gnuplot preamble, en cambio con draw2d y draw3d se usa user preamble).

(4) Graficar las curvas de nivel −1 , −1/2 , 0 , 1/2 y 1 de la función f (x, y) = x2 − y .


draw3d(
explicit(x^2 - y, x, -2, 2, y, -2, 2),
surface_hide=true,
xlabel="eje x", ylabel="eje y", zlabel= "eje z",
contour_levels={ -1, -1/2, 0, 1/2, 1},
contour=map,
user_preamble="set size square"
)

En verdad, es posible graficar curvas de nivel sin necesidad de utilizar el paqauete draw (buscar
contour plot en la ayuda del programa).

(5) Para la misma función del inciso anterior, graficar la función, las curvas de nivel en el plano xy y
las curvas de nivel sobre el gráfico de f .
draw3d(
color=green,
explicit(x^2 - y, x, -2, 2, y, -2, 2),
surface_hide=true,
xlabel="eje x", ylabel="eje y", zlabel= "eje z",
contour_levels={ -1, -1/2, 0, 1/2, 1},
contour=both,
user_preamble="set size square"
)

Si comparamos los dos incisos, la ubicación de las curvas está dada por las instrucción contour.
Si la definimos como map, aparecen las curvas en el plano, como están definidas matemáticamente.
Si damos a contour el valor base, obtenemos el gráfico de la función y en el plano xy las curvas.
EJEMPLOS DE USO DE MAXIMA 5

Si le damos el valor surface, aparecen sobre el gráfico y si le damos el valor both, aparecen sobre
el gráfico de la función y en el plano xy .

3. Matrices
Hay dos maneras de introducir matrices en Maxima (además de usar el menú desplegable): con la in-
strucción matrix y con entermatrix.
En el primer caso, la instrucción tiene la forma
matrix([primera fila (sep. por comas)], ..., [última fila]

En el segundo, la forma es
entermatrix(nro. de filas, nro. de columnas)

En este caso el programa va solicitando los distintos coeficientes de la matriz.

3.1. Operaciones. Las instrucciones son +, para la suma - para la resta y . para el producto de matrices
usual (* se usa para calcular el producto un escalar por una matriz o el producto de dos matrices de igual
tamaño “componente a componente”)
Ejemplo
(1) Sean
     
1 2 3 4 1 3 0 0 2 3 1
A =  −1 3 0 1 , B =  −3 4 1 −3  , C =  −1 0 1 
3 −1 −1 2 0 2 2 1 2 2 1

Calcular C(A − 3B) .

(%i3) A:matrix([1, 2, 3, 4], [-1, 3, 0, 1], [3, -1, -1, 2]);


(%o3) matrix([1,2,3,4],[-1,3,0,1],[3,-1,-1,2])
(%i5) B: entermatrix(3, 4);
Row 1 Column 1: 1;
Row 1 Column 2: 3;
Row 1 Column 3: 0;
Row 1 Column 4: 0;
Row 2 Column 1: -3;
Row 2 Column 2: 4;
Row 2 Column 3: 1;
Row 2 Column 4: -3;
Row 3 Column 1: 0;
Row 3 Column 2: 2;
Row 3 Column 3: 2;
Row 3 Column 4: 1;
Matrix entered.
(%o5) matrix([1,3,0,0],[-3,4,1,-3],[0,2,2,1])
(%i6) C:matrix([2, 3, 1], [-1, 0, 1], [2, 2, 1]);
(%o6) matrix([2,3,1],[-1,0,1],[2,2,1])
(%i7) C.(A - 3*B);
(%o7) matrix([23,-48,-10,37],[5,0,-10,-5],[15,-39,-7,27])
6 MARTÍN PAVÓN

3.2. Determinante e inversa. La instrucción para calcular el determinante de una matriz es


determinant(matrix) y para calcular la inversa, si existe, es invert(matrix).
Ejemplos
 
2 3 1
(1) Sea A =  −1 0 1  , calcular el determinante de A .
2 2 1
(%i13) A:matrix([2, 3, 1], [-1, 0, 1], [2, 2, 1]);
(%o13) matrix([2,3,1],[-1,0,1],[2,2,1])
(%i14) determinant(A);
(%o14) 3

Notemos que, dado que el determinante es distinto de cero, la matriz es inversible.

(2) Calcular A−1 con A la matriz de ejemplo anterior.


(%i16) invert(A);
(%o16) matrix([-2/3,-1/3,1],[1,0,-1],[-2/3,2/3,1])

 
1 2 3
(3) Calcular la inversa de B =  4 5 6  .
7 8 9
(%i17) B: matrix([1, 2, 3], [4, 5, 6], [7, 8, 9]);
(%o17) matrix([1,2,3],[4,5,6],[7,8,9])
(%i18) invert(B);
Division by 0
-- an error. To debug this try debugmode(true);

En este caso el programa informa que la matriz no es inversible.


3.3. Submatrices. En ocasiones, por ejemplo cuando intentamos estudiar el hessiano de una función de
varias variables, es importante considerar submatrices de una matriz dada, esto es matrices que obtenemos
al descartar alguna fila y/o columna de la matriz original. En este caso la instrucción a usar es submatrix
que tiene la forma
submatrix(filas a remover sep. por comas, matriz, colum. a remover sep. por comas)
Ejemplo
(1) Calcular las submatrices diagonales de A y sus determinantes con
 
1 2 3 5 6
 −2 1 5 6 0 
 
A=  2 2 2 0 −9  .
 0 9 7 −4 2 
−3 2 1 1 9
La submatriz diagonal de 1 × 1 es 1 , para las demás usamos el programa.
(%i21) A : matrix(
[1, 2, 3, 5, 6], [-2, 1, 5, 6,0 ], [2, 2, 2, 0, -9], [0, 9, 7, -4, 2],
[-3, 2, 1, 1, 9]);
(%o21) matrix([1,2,3,5,6],[-2,1,5,6,0],[2,2,2,0,-9],[0,9,7,-4,2],[-3,2,1,1,9])
(%i24) A2:submatrix(3,4, 5, A, 3, 4, 5);
(%o24) matrix([1,2],[-2,1])
(%i25) A3:submatrix(4, 5, A, 4, 5);
(%o25) matrix([1,2,3],[-2,1,5],[2,2,2])
(%i26) A4: submatrix(5, A, 5);
EJEMPLOS DE USO DE MAXIMA 7

(%o26) matrix([1,2,3,5],[-2,1,5,6],[2,2,2,0],[0,9,7,-4])
(%i27) determinant(A2);
(%o27) 5
(%i28) determinant(A3);
(%o28) 2
(%i29) determinant(A4);
(%o29) -296
(%i30) determinant(A);
(%o30) 4872

4. Diferenciación
Esta sección requiere de los contenidos de la sección 2.
4.1. Derivadas. La instrucción para calcular las derivadas de una función de una o más variables es diff;
su estructura es
diff(funcion, variable, orden de derivación, variable, orden de derivación, . . . )
En ocasiones no deseamos conocer el valor de la derivada en determinado punto. Como diff no devuelve
una función sino una expresión, no podemos proceder de la misma manera que con una función; en cambio,
usamos la instrucción ev.
Ejemplos
(1) Calcular la derivada de f (x) = x2 + sen(3x + 4) .
(%i14) f(x) := x^2 + sin(3*x + 4);
(%o14) f(x):=x^2+sin(3*x+4)
(%i15) diff(f(x), x);
(%o15) 3*cos(3*x+4)+2*x

(2) Calcular las derivadas segundas y terceras de la función del inciso anterior.
(%i16) diff(f(x), x, 2);
(%o16) 2-9*sin(3*x+4)
(%i17) diff(f(x), x, 3);
(%o17) -27*cos(3*x+4)

2
(3) Calcular las derivadas parciales de f (x, y) = x3 + xey .
(%i18) f(x, y) := x^3 + x*exp(y^2);
(%o18) f(x,y):=x^3+x*exp(y^2)
(%i19) diff(f(x,y), x);
(%o19) %e^y^2+3*x^2
(%i20) diff(f(x, y) , y);
(%o20) 2*x*y*%e^y^2

(4) Evaluar las derivadas parciales del inciso anterior en (2, 0) .


(%i27) f(x,y) := x^3 + x*exp(y^2);
(%o27) f(x,y):=x^3+x*exp(y^2)
(%i23) fx:diff(f(x, y), x);
(%o23) %e^y^2+3*x^2
(%i24) ev(fx, x=2, y=0);
(%o24) 13
8 MARTÍN PAVÓN

(%i29) fy:diff(f(x, y), y);


(%o29) 2*x*y*%e^y^2
(%i30) ev(fy, x = 2, y = 0);
(%o30) 0

(5) Verificar que las derivadas segundas mixtas de la función del inciso anterior son iguales
(%i13) f(x,y) := x^3 + x*exp(y^2);
(%o13) f(x,y):=x^3+x*exp(y^2)
(%i14) diff(f(x, y), x, 1, y, 1);
(%o14) 2*y*%e^y^2
(%i15) diff(f(x, y), y, 1, x, 1);
(%o15) 2*y*%e^y^2

Otra manera de hacer esto es combinando dos “diff”. No es la manera más simple pero apunta
directamente a la definición de derivada sucesiva.
(%i21) diff(diff(f(x, y), x), y);
(%o21) 2*y*%e^y^2
(%i22) diff(diff(f(x, y), y), x);
(%o22) 2*y*%e^y^2

(6) Graficar la trayectoria g(t) = (t2 − t, t4 − t3 , 3t − 2) , el punto g(1) , el vector tangente a la


trayectoria en g(1) y la recta tangente a la trayectoria en g(1) .
(%i1) g(t) := [t^2 - t, t^4 - t^3, 3*t - 2]; #definimos g
(%o1) g(t):=[t^2-t,t^4-t^3,3*t-2]
(%i2) g(1); #verificamos cuanto vale g(1).
(%o2) [0,0,1]
(%i4) deri:diff(g(t), t, 1); /* calculamos la derivada de g, guardamos
la expresión en la variable deri. */
(%o4) [2*t-1,4*t^3-3*t^2,3]
(%i6) vt:ev(deri, t = 1); /* evaluamos la derivada en t =1,
guardamos el vector g’(1) en la variable vt. */
(%o6) [1,1,3]
(%i16) recta : g(1) + t*vt; /* ec. de la recta tangente en forma
paramétrica. */
(%o16) [t,t,3*t+1]

(%i7) load(draw); /* cargamos el paquete draw para hacer los gráficos */

(%o7) /usr/share/maxima/5.17.0/share/draw/draw.lisp

(%i38) draw3d(
xlabel="eje x", /* nombramos los ejes para orientarnos. */
ylabel="eje y",
color="blue",
parametric(g(t)[1], g(t)[2], g(t)[3],t, -1, 1.5), /* graficamos la
trayectoria en azul. */
color="red",
parametric(recta[1], recta[2], recta[3], t, -1, 2), /* graficamos la recta
en rojo. */
color="black",
point_type = filled_circle,
EJEMPLOS DE USO DE MAXIMA 9

point_size = 2,
points([g(1)]), /* graficamos el punto en negro. Lo graficamos
situando un disco de tama~
no 2. */
color = "green",
vector(g(1), vt), /* graficamos el vector tangente en verde. */
user_preamble="set size square"
);
(%o38) [gr3d(parametric,parametric,points,vector)]

4.2. Diferencial, matriz jacobiana. El comando para calcular la matriz jacobiana de una función es
jacobian. La instrucción tiene la forma
jacobian(función o expresión vectorial, vector de variables)
Es importante notar que la función debe estar dada por un vector; este no suele ser el caso de los campos
escalares, de modo que en este caso encerramos la función entre corchetes.
Ejemplos
(1) Calcular la matriz jacobiana de f (x, y, z) = x3 y + 3 z − e(z x−x y+y z) .
(%i31) f(x, y, z) := x^3 *y +3*z - exp(z*x-x*y + y*z);
(%o31) f(x,y,z):=x^3*y+3*z-exp(z*x-x*y+y*z)
(%i19) jacobian([f(x,y, z)], [x, y, z]);
(%o19) matrix([3*x^2*y-(z-y)*%e^(y*z+x*z-x*y),
x^3-(z-x)*%e^(y*z+x*z-x*y),
3-(y+x)*%e^(y*z+x*z-x*y)])

Observen en %i19 que encerramos la función entre corchetes. La salida es una matriz de una fila
y tres columnas.

(2) Calcular la matriz de la diferencial de f (u, v) = (u + v, u − v, u2 − v 2 ) en (1, 2) .


(%i34) f(u, v) := [u + v, u - v, u^2 - v^2];
(%o34) f(u,v):=[u+v,u-v,u^2-v^2]
(%i35) df : jacobian(f(u, v), [u, v]);
(%o35) matrix([1,1],[1,-1],[2*u,-2*v])
(%i36) ev(df, u = 1, v = 2);
(%o36) matrix([1,1],[1,-1],[2,-4])

En este caso, la función es un campo vectorial (observen como la definimos en %i34) de modo que
en este caso no es necesario encerrarla entre corchetes.

(3) Sea f (x, y) = x3 − 3xy + y 3 . En un mismo gráfico, mostrar la superficie z = f (x, y) , el punto
(1, −1, f (1, −1)) y el plano tangente a la superficie en dicho punto.
(%i37) f(x, y) := x^3 - 3*x*y + y^3; /* definimos la función. */
(%o37) f(x,y):=x^3-3*x*y+y^3
(%i38) P : [1, -1, f(1, -1)]; /* calculamos el punto que
nos interesa */
(%o38) [1,-1,3]
(%i39) fx : diff(f(x,y), x); /* calculamos la derivada parcial respecto
de x y la guardamos en la variable
fx. */
(%o39) 3*x^2-3*y
(%i40) a : ev(fx, x=1, y = -1); /* evaluamos la derivada en (1, -1),
asignamos el valor a la variable a. */
10 MARTÍN PAVÓN

(%o40) 6
(%i41) fy : diff(f(x, y), y);
(%o41) 3*y^2-3*x
(%i42) b : ev(fy, x = 1, y = -1);
(%o42) 0
(%i48) draw3d( /* graficamos. El paquete draw ya estaba
cargado, si no primero tenemos que
ejecutar load(draw) */
xlabel = "eje x", ylabel = "eje y",
xu_grid = 20, yv_grid = 20, /* damos la cantidad de puntos que se usan
para establecer los gráficos; por
default es 30 pero con esto el gráfico
queda un poco recargado. */
color = "blue",
explicit(f(x, y), x, 0, 2, y, -2, 0),
color = "red",
explicit(f(1, -1) + a*(x - 1) + b*(y + 1), x, 0, 2, y, -2, 0),
color = "black",
points([P]),
point_type = filled_circle,
point_size = 5,
surface_hide = true,
user_preamble = "set size square"
);
(%o48) [gr3d(explicit,explicit,points)]

(4) Calcular la derivada direccional de g(x, y) = xey−1 + yex−2 en el punto (2, 1) en la dirección del
vector v = (3/5, −4/5) . Además, calcular el valor de la derivada direccional máxima de f en ese
punto y la dirección en que se alcanza.
El programa no tiene definida una función que calcule el gradiente de una función de dos variables,
ası́ que usamos la matriz de la diferencial. Afortunadamente, cuando es necesario, el programa
interpreta a una matriz fila como un vector y permite calcular el producto interno tal como se ve
en %i34. (Para calcular el producto vectorial entre los vectores u y v se utiliza .)
(%i31) g(x, y) := x*exp(y-1) + y*exp(x-2);
(%o31) g(x,y):=x*exp(y-1)+y*exp(x-2)
(%i32) Dg : jacobian([g(x,y)], [x, y]);
(%o32) matrix([%e^(y-1)+%e^(x-2)*y,x*%e^(y-1)+%e^(x-2)])
(%i33) Dg21 : ev(Dg, x = 2, y=1);
(%o33) matrix([2,3])
(%i34) der = Dg21 . [3/5, -4/5];
(%o34) der=-6/5
(%i37) der_max : sqrt(Dg21.Dg21);
(%o37) sqrt(13)
(%i38) vec_max : Dg21/der_max;
(%o38) matrix([2/sqrt(13),3/sqrt(13)])

4.3. Hessiano, extremos locales de funciones de varias variables. El comando para calcular hessiano
de una función es hessian. La instrucción tiene la forma
hessian(función, vector de variables)
Ejemplos
(1) Calcular el hessiano de f (x, y, z) = x2 y − zx + z 3 + y 2 y evaluarlo en el punto (2, −1, 3) .
EJEMPLOS DE USO DE MAXIMA 11

(%i35) f(x, y, z) := x^2*y - z*x + z^3 + y^2;


(%o35) f(x,y,z):=x^2*y-z*x+z^3+y^2
(%i36) hess : hessian(f(x, y, z), [x, y, z]);
(%o36) matrix([2*y,2*x,-1],[2*x,2,0],[-1,0,6*z])
(%i37) hess : ev(hess, x=2,y=-1,z=3);
(%o37) matrix([-2,4,-1],[4,2,0],[-1,0,18])

Para los ejemplos que siguen son necesarias algunas intrucciones relacionadas con matrices que
aparacen en la sección 3

(2) Hallar y clasificar los puntos crı́ticos de f (x, y) = (x + y)(xy − 1) .


(%i38) f(x, y) := (x + y)*(x*y -1);
(%o38) f(x,y):=(x+y)*(x*y-1)
(%i39) ec1 : diff(f(x, y), x) = 0;
(%o39) y*(y+x)+x*y-1=0
(%i40) ec2 : diff(f(x, y), y) = 0;
(%o40) x*(y+x)+x*y-1=0
(%i41) solve([ec1, ec2], [x, y]);
(%o41) [[x=-1/sqrt(3),y=-1/sqrt(3)],[x=1/sqrt(3),y=1/sqrt(3)],
[x=-%i,y=%i],[x=%i,y=-%i]]
(%i43) hess: hessian(f(x, y), [x, y]);
(%o43) matrix([2*y,2*y+2*x],[2*y+2*x,2*x])
(%i44) hess1: ev(hess,x=-1/sqrt(3),y=-1/sqrt(3) );
(%o44) matrix([-2/sqrt(3),-4/sqrt(3)],[-4/sqrt(3),-2/sqrt(3)])
(%i45) determinant(hess1);
(%o45) -4
(%i46) hess2 : ev(hess,x=1/sqrt(3),y=1/sqrt(3) );
(%o46) matrix([2/sqrt(3),4/sqrt(3)],[4/sqrt(3),2/sqrt(3)])
(%i47) determinant(hess2);
(%o47) -4

En %i38, definimos la función que vamos a estudiar; en %i39, %i40 calculamos las derivadas par-
ciales, las igualamos a 0 y asigamos estas expresiones a las variables ec1, ec2.
En %i41 usamos la instrucción solve1 para resolver el sistema de ecuaciones

 ∂f

 ∂x (x, y) = 0


 ∂f

 (x, y) = 0
∂y
√ √
El sistema √ tiene cuatro
√ soluciones, pero sólo dos son reales; ası́ que los puntos crı́ticos son (1/ 3, 1/ 3)
y (−1/ 3, −1/ 3) . Para clasificarlos calculamos en hessiano (en %i43) evaluamos en los puntos
crı́ticos (en %i44 y en %i46) y calculamos el determinante ( %i45 e %i47). En ambos casos el deter-
minante es negativo, por lo tanto ambos puntos son puntos de ensilladura.

(3) Hallar y clasificar los puntos crı́ticos de f (x, y, z) = x2 + y 2 + z 2 + xy .


(%i48) f(x, y, z) := x^2 + y^2 + z^2 + x*y;
(%o48) f(x,y,z):=x^2+y^2+z^2+x*y
(%i49) ec1 : diff(f(x, y, z), x) = 0;
(%o49) y+2*x=0
(%i50) ec2 : diff(f(x, y, z), y) = 0;
(%o50) 2*y+x=0
1La instrucción solve tiene la forma solve([cjto. ecuaciones], [lista de variables])
12 MARTÍN PAVÓN

(%i51) ec3 : diff(f(x, y, z), z) = 0;


(%o51) 2*z=0
(%i52) solve([ec1, ec2, ec3], [x, y, z]);
(%o52) [[x=0,y=0,z=0]]
(%i54) hess :hessian(f(x, y, z), [x, y, z]);
(%o54) matrix([2,1,0],[1,2,0],[0,0,2])
(%i55) determinant(hess);
(%o55) 6
(%i56) hess2: submatrix(3, hess, 3);
(%o56) matrix([2,1],[1,2])
(%i57) determinant(hess2);
(%o57) 3

La resolución es similar al ejemplo anterior; en este caso, de acuerdo con el criterio para funciones
de tres variables, en el punto crı́tico se alcanza un mı́nimo local.

5. Integración
5.1. Integración de funciones de una variable. La instrucción básica para calcular integrales simbóli-
coas es integrate. Esta se puede emplear tanto para buscar primitivas como para calcular integrales
definidas. La estructura de la instrucción es
integrate(función, variable)
para calcular primitivas e
integrate(función, variable, lı́mite inferior, lı́mite superior)
para calcular integrales definidas.

Ejemplos
(1) Hallar una primitiva de f (x) = x2 + sen(3x) .
(%i1) integrate(x^2 + sin(3*x), x);
(%o1) x^3/3-cos(3*x)/3
Z π
(2) Calcular x2 + sin(3x) dx .
0
(%i2) integrate(x^2 + cos(3*x), x, 0, %pi);
(%o2) %pi^3/3

(3) Hallar una primitiva de f (x) = sen(x)/x .


(%i3) integrate(sin(x)/x, x);
(%o3) integrate(sin(x)/x,x)
En este caso es imposible hallar una primitiva y el programa devuelve la expresión de la integral
Z 3π
sen x
(4) Calcular dx .
π x
Dado que no es posible determinar una primitiva del integrando, recurrimos a métodos numéricos
para estimar la integral.
(%i4) quad_qags(sin(x)/x, x, %pi, 3*%pi);
(%o4) [-0.1771752530025,7.6034219750884554*10^-15,21,0]
La respuesta es un vector de cuatro componentes, la primera es el resultado, la segunda una
estimación del error cometido, la tercera está relacionada con la cantidad de evaluaciones y la última
es un código de errores, 0 significa que se encontraron problemas.
5.2. Integración de funciones de varias varibles. Para calcular integrales dobles o triples, primero
debemos escoger una iteración y a partir de esta realizamos el cálculo anidando la instrucción para el cálculo
de integrales de una variable.

Ejemplos
ZZ
(1) Calcular x2 y − ex+y dxdy con R el rectángulo 0 ≤ x ≤ 1 , −1 ≤ y ≤ 2 .
R
(%i6) integrate( integrate(x^2*y - exp(x+y), x, 0, 1), y, -1, 2);
(%o6) -(%e^(-1)*(6*%e^4-6*%e^3-9*%e+6))/6
ZZ
(2) Calcular x + 3y dxdy con D el recinto definido por 0 ≤ y ≤ 1 , y 2 ≤ x ≤ 2 − y .
D
(%i7) integrate( integrate( x + 3*y, x, y^2, 2 - y), y, 0, 1);
(%o7) 139/6

(3) Calcular el volumen del sólido definido por 0 ≤ x ≤ 1/2 , 0 ≤ y ≤ 1 − 2x , 0 ≤ z ≤ 5 − x2 .


(%i8) integrate( integrate( integrate ( 1, z, 0, 5 - x^2), y, 0, 1-2*x), x, 0, 1/2);
(%o8) 119/96

(4) Calcular el volumen de una esfera de radio 2 empleando coordenadas esféricas.


(%i13) integrate(
integrate(
integrate(
r^2*sin(u),
r, 0, 2),
u, 0, %pi),
v, 0, 2*%pi)$
(%o13) 32%pi/3

6. Ecuaciones diferenciales ordinarias


6.1. Derivadas. Para calcular derivadas de funciones se utiliza la instrucción diff.

Ejemplos.
(1) Calcular la derivada de f (x) = x2 + sen(3x + 4) .
(%i14) f(x) := x^2 + sin(3*x + 4);
(%o14) f(x):=x^2+sin(3*x+4)
(%i15) diff(f(x), x);
(%o15) 3*cos(3*x+4)+2*x

(2) Calcular las derivadas segundas y terceras de la función del inciso anterior.
(%i16) diff(diff(f(x), x), x);
(%o16) 2-9*sin(3*x+4)
(%i17) diff(diff(diff(f(x), x), x), x);
(%o17) -27*cos(3*x+4)
14 MARTÍN PAVÓN

Una manera alternativa y que conviene mencionar es diff(f(x), x, 2) y diff(f(x), x, 3)


respectivamente.

2
(3) Calcular las derivadas parciales de f (x, y) = x3 + xey .
(%i18) f(x, y) := x^3 + x*exp(y^2);
(%o18) f(x,y):=x^3+x*exp(y^2)
(%i19) diff(f(x,y), x);
(%o19) %e^y^2+3*x^2
(%i20) diff(f(x, y) , y);
(%o20) 2*x*y*%e^y^2

(4) Verificar que las derivadas segundas mixtas de la función del inciso anterior son iguales
(%i21) diff(diff(f(x, y), x), y);
(%o21) 2*y*%e^y^2
(%i22) diff(diff(f(x, y), y), x);
(%o22) 2*y*%e^y^2

6.2. Solución general de ecuaciones diferenciales lineales de primer y segundo orden. La instruc-
ción para hallar la solución general de una ecuación de primer o segundo orden es ode2. Para definir una
ecuación diferencial, debemos indicar la derivada de una función que no conocemos, para esto anteponemos
a diff un apostrofe.

Ejemplos.
Hallar la solución general de las siguientes ecuaciones

(1) y 0 + 3xy = sen(x) .


(%i11) eq:’diff(y, x) + 3*x*y = x;
(%o11) ’diff(y,x,1)+3*x*y=x
(%i12) ode2(eq, y, x);
(%o12) y=%e^(-(3*x^2)/2)*(%e^((3*x^2)/2)/3+%c)
(%i13) expand(%);
(%o13) y=%c*%e^(-(3*x^2)/2)+1/3

Notemos que, a diferencia de lo que ocurre cuando queremos calcular derivadas, no hay que
poner la variable independiente en la función dentro de diff (o sea, escribimos ’diff(y, x), no
’diff(y(x), x). Suele ser cómodo definir la ecuación fuera de ode2 como hicimos en la primera
linea, pero esto no es necesario. La instrucción expand distribuye la exponencial que aparece en %o12
(el sı́mbolo % que pasamos como argumento se refiere a la última “salida” del programa). El uso de
expand tampoco es necesario pero la solución aparece mejor presentada.

(2) y 00 + 3y 0 − 4y = x cos(2x) .
(%i17) eq2: ’diff(y, x, 2) +3 *’diff(y, x) - 4*y = x*cos(2*x);
(%o17) ’diff(y,x,2)+3*(’diff(y,x,1))-4*y=x*cos(2*x)
(%i19) ode2(eq2, y, x);
(%o19) y=((6*x+4)*sin(2*x)+(3-8*x)*cos(2*x))/100+%k1*%e^x+%k2*%e^(-4*x)

6.3. Condiciones iniciales y de borde. Las instrucciones que se usan son ic1 para hallar la solución
particular de una ecuación de primer orden que cumple una condición inicial dada, ic2 para resolver el
problema análogo con ecuaciones de segundo orden y bc2 para hallar, si existen, las soluciones particulares
EJEMPLOS DE USO DE MAXIMA 15

que cumplen satisfacen condiciones de borde dadas. Las tres reciben como parámetros la solución general
obtenida con ode2 más las condiciones.

Ejemplos
Resolver los siguientes problemas con condiciones iniciale o de borde.
(1) y 0 − 3xy = x , y(0) = 3 .
(%i48) eq3: ’diff(y, x) -3*x*y = x;
(%o48) ’diff(y,x,1)-3*x*y=x
(%i49) ode2(eq3, y, x);
(%o49) y=(%c-%e^(-(3*x^2)/2)/3)*%e^((3*x^2)/2)
(%i50) ic1(%, x=0, y=3);
(%o50) y=(10*%e^((3*x^2)/2)-1)/3

(2) y 00 + 3y 0 − 2y = x2 , y(0) = 1 , y 0 (0) = 2 .


(%i53) ode2(eq4, y, x);
(%o53) y=%k1*%e^(((sqrt(17)-3)*x)/2)+
%k2*%e^(((-sqrt(17)-3)*x)/2)-(2*x^2+6*x+11)/4
(%i54) ic2(%, x = 0, y= 1, diff(y, x) = 2);
(%o54) y=((73*sqrt(17)+255)*%e^(((sqrt(17)-3)*x)/2))/136-
((73*sqrt(17)-255)*%e^(((-sqrt(17)-3)*x)/2))/136-(2*x^2+6*x+11)/4

En este caso es importante notar la manera de introducir las condiciones inciales.

(3) y 00 + 9y = 0 , y(0) = 0 , y(π) = 0 .


(%i55) eq4: ’diff(y, x, 2) + 9*y = 0$
(%i56) ode2(eq4, y, x);
(%o56) y=%k1*sin(3*x)+%k2*cos(3*x)
(%i57) bc2(%, x = 0, y = 0, x= %pi, y = 0);
Dependent equations eliminated: (2)
(%o57) y=%r1*sin(3*x)‘

El programa nos hace saber que en este caso hay infinitas soluciones de la forma y(x) = k sen(3x) .

(4) y 00 + 5y = 0 , y(0) = 0 , y(π) = 0 .


(%i58) eq4: ’diff(y, x, 2) + 5*y = 0$
(%i59) ode2(eq4, y, x);
(%o59) y=%k1*sin(sqrt(5)*x)+%k2*cos(sqrt(5)*x)
(%i60) bc2(%, x = 0, y = 0, x= %pi, y = 0);
(%o60) y=0

En este caso la solución es única.

(5) y 00 + 5y = 0 , y(0) = 1 , y(π) = 0 .


(%i58) eq4: ’diff(y, x, 2) + 5*y = 0$
(%i59) ode2(eq4, y, x);
(%o59) y=%k1*sin(sqrt(5)*x)+%k2*cos(sqrt(5)*x)
(%i60) bc2(%, x = 0, y = 0, x= %pi, y = 0);
(%o60) y=0
(%i61) bc2(%, x = 0, y = 1, x= %pi, y = 0);
Dependent equations eliminated: (2)
Inconsistent equations: [1]
#0: bc2(soln=y = 0,xa=x = 0,ya=y = 1,xb=x = %pi,yb=y = 0)
-- an error. To debug this try debugmode(true);

Y este ejemplo muestra como nos informa el programa que no existe solución.

7. Series de Fourier
7.1. Series de Fourier de una función dada. Para el cálculo de series de Fourier, necesitamos cargar el
paquete fourie, como siempre, con la instrucción load. A partir de esto, tenemos funciones que nos permiten
calcular las series de Fourier, de senos y de cosenos de una función dada. En cada uno de estos casos, la
respuesta del programa es un vector con los coeficientes pedidos; también están disponibles funciones para
calcular sumas parciales de las series.

Ejemplos
(1) Hallar la serie de Fourier de la función de perı́odo 2π definida por f (x) = x2 , −2π ≤ x ≤ π .
load(fourie);

(%o1) /usr/share/maxima/5.17.0/share/calculus/fourie.mac

(%i2) fourier(x^2, x, %pi);

Is cos(%pi*n) positive, negative, or zero?

positive;

(%t2) a[0]=%pi^2/3

(%t3) a[n]=(2*((%pi^2*sin(%pi*n))/n-(2*sin(%pi*n))/n^3+
(2*%pi*cos(%pi*n))/n^2))/%pi

(%t4) b[n]=0

(%o4) [%t2,%t3,%t4]
En el primer renglón cargamos el paquete fourie (es importante notar que, por alguna razón, no
tiene la “r” final de Fourier).
En el segundo, calculamos la serie, al instrucción tiene como primer argmento la función cuya serie
queremos calcular, el segundo el nombre de la variable independiente y el tercero L si el perı́odo
de la función es 2L .
Lo que sigue es una pregunta que en ocasiones hace el programa para poder continuar, noten que
no es una respuesta estandar dado que la pregunta no está precidida por %o; la respuesta usual es
positive (y ctrl + enter).
En la última parte tenemos la respuesta, el coeficiente a0 , los an y bn y para finalizar todo eso
se guarda en un vector.

(2) Graficar la suma de los primeros cinco terminos de la serie de Fourier de la función del ejemplo
anterior entre −6 y 6 .
(%i5) coefi : fourier(x^2, x, %pi);

Is cos(%pi*n) positive, negative, or zero? positive;


EJEMPLOS DE USO DE MAXIMA 17

(%t5) a[0]=%pi^2/3

(%t6) a[n]=(2*((%pi^2*sin(%pi*n))/n-(2*sin(%pi*n))/n^3 +
(2*%pi*cos(%pi*n))/n^2))/%pi

(%t7) b[n]=0

(%o7) [%t5,%t6,%t7]

(%i9) fourexpand(coefi, x, %pi, 5);

(%o9) -(4*cos(5*x))/25+cos(4*x)/4-(4*cos(3*x))/9 +
cos(2*x)-4*cos(x)+%pi^2/3

(%i11) f(x) := fourexpand(coefi, x, %pi, 5);

(%o11) f(x):=fourexpand(coefi,x,%pi,5)

(%i12) plot2d(f(x), [x, -6, 6]);

En el primer renglón, calculamos como en el ejemplo anterior los coeficientes de la serie pero, a
diferencia de lo hecho antes, “guardamos” el resultado del vector con el nombre de coefi (obvia-
mente, podemos poner cualquier nombre).
En ( %i9) aparece una nueva función, fourexpand, que es la que calcula la suma. El 5 que
aparece en último lugar tiene que ver con la cantidad de sumandos. Una manera alternativa de
lograr lo mismo serı́a fourexpand(fourier(x^2, x, %pi), x, %pi,5);. . . Un plomazo.
La salida %o9 es la suma parcial; para graficarla es conveniente asignarla a una función, eso lo
hacemos en %i11 (presten atención al uso de := para definir la función).
Finalmente, en %12 ejecutamos la instrucción para hacer el gráfico.
7.2. Series de senos y cosenos. Otros comandos relacionados con series de Fourier son:
(1) fourcos, foursin que devuelve los coefientes de los desarrollos en cosenos y senos de una función;
las instrucciones usan la misma sintaxis que fourier, pero en este caso se considera definida en el
intervalo [0, L] .

(2) totalfourier que intenta encontrar la fórmula del término general de la serie y la serie de Fourier
en sı́ (también con una sintaxis similar a la de fourier).

(3) foursimp simplifica sen(nπ) y cos(nπ) (depende de las variables sinnpiflag, cosnpiflag que
por default están definidas como true) . Por ejemplo,
(%i2) coef_sen : foursin(x^2, x, %pi);
Is sin(%pi*n) positive, negative, or zero?positive;
(%t2) b[n]=(2*((2*%pi*sin(%pi*n))/n^2-(%pi^2*cos(%pi*n))/n +
(2*cos(%pi*n))/n^3-2/n^3))/%pi
(%o2) [%t2]
(%i3) foursimp(coef_sen);
(%t3) b[n]=-(2*(%pi^2*n^2*(-1)^n-2*(-1)^n+2))/(%pi*n^3)
(%o3) [%t3]

Hay más información en la ayuda del programa (dentro del item “Numerical”).

También podría gustarte