Professional Documents
Culture Documents
Maple
Dr. Horacio Martnez Alfaro
hma@itesm.mx
http://www-cia.mty.itesm.mx/~hma
Enero de 1997
i
Indice General
5 Gracas avanzadas 63
Captulo 1
0.8
0.6
0.4
0.2
00 2 4 6 8
> rsolve({reqn,f(0)=1,f(1)=2,f(2)=4},f(n));
n n
123 164 1 27 47
+
44 91 2 4004 3
> int(integrand,x);
276 1041 815
ln( x 3 ) + ln( 2 x + 7 ) + ln( 3 x2 + x + 1 )
403 1781 25482
4387 1
+ 11 arctan ( 6 x + 1 ) 11
140151 11
0
-2 -2
-1 -1
0 0
y x
1 1
2 2
6
4
2
0
-2
-4
-6
-10
-10
-5
-5
0
0
5
5
10
10
15
Captulo 2
Normalmente sera con maple o xmaple para DOS, Unix o XWindows, o dando doble click sobre la
aplicacion en Mac, NeXT, o Windows.
> 2 + abs(-2);
4
> 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 *
> 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18:
> " - 18!;
0
> 2 * * 4 * 5 * 6 -;
syntax error:
2 * * 4 * 5 * 6 -;
^
> 2 * 3 * 4 * 5 * 6 -;
syntax error:
2 * 3 * 4 * 5 * 6 -;
^
Una variable matematica o una variable sin asignar es una variable que no tiene un valor asignado.
Una variable comienza con una letra y le pueden seguir hasta 498 letras, dgitos o guiones infere-
riores.
Si se desea que una variable contenga otros caracteres, el nombre debe de ir entre comillas
izquierdas sencillas ().
expr1 x T
Formula_47 d2DYDX nombre raro?
La respuesta es= SesionLog.m
> fuerza;
29400.0
> fuerza;
34300.0
> soluciones:=";
1 1/3 1 1/3 1 1
soluciones := k 1/3 , k + I 3 k , k 1/3 I 3 k 1/3
2 2 2 2
> soluciones[1];
k 1/3
> soluciones[3];
1 1/3 1 1/3
k I 3k
2 2
La funcion predenida assign tomara el conjunto solucion que regreso solve y asignara los valores
correspondientes
> assign(Solconjunto);
> x;
3k + 2b
3a + 2
> y;
ab k
3
3a + 2
> ecnconjunto;
3k + 2b ab k a(3k + 2b) ab k
+3 = b, 2 =k
3a + 2 3a + 2 3a + 2 3a + 2
> simplify(ecnconjunto);
{ k = k, b = b }
Para que las variables x y y retomen valores desconocidos, se tiene que eliminar sus valores asignados
asignandoles sus propios nombres entre comillas simples:
> x := x; y := y;
x := x
y := y
> ecnconjunto;
2
x + y = b, a x y = k
3
Si no se le proporcionan variables (incognitas), Maple tratara de resolver para todas las incognitas
> solve( a*x^2 + b*x + c = 0 );
{ b = b, c = a x2 b x, a = a, x = x }
> subs(cos(x)^(-2)=1/(1-sin(x)^2),");
sin( x )2
1 sin( x )2 +
1 sin( x )2
> " - 1;
.1 109
> sum(1/(2*i-1),i=1..10);
31037876
14549535
> sum(1.0/(2*i-1),i=1..10);
2.133255530
> Digits := 5:
> 2.0/3.0 + 5;
5.6667
> evalf(expr1);
.627632138
> evalf(");
{1.1644839172258724765, .50000000000000000000 + .86602540378443864675 I,
.50000000000000000000 .86602540378443864675 I, 1.}
> fsolve(cos(x)=x);
.7390851332
En ocasiones, fsolve se comportara como solve (que da como respuesta nada) o como int o sum
que dan como resultado la expresion que se le dio a Maple de entrada
> fsolve({x^2+y^2=1,x^3*y+2*x*y=3}, {x,y});
Si el problema es muy sensible a errores de redondeo, fsolve no podra encontrar todas las races de
una manera precisa.
> poly := 23*x^5 + 105*x^4 - 10*x^2 + 17*x:
> fsolve(poly, x);
0, 4.536168981, .6371813185
> g := a - b^2 = 1;
g := a b2 = 1
Una forma tpica de ejecutar la funcion plot es plot(f(x),x=a..b), donde f es una funcion
real en x y a..b especica el rango real horizontal en el que f se gracara.
La funcion plot proporciona soporte para gracas en dos dimensiones de una o mas funciones
especicadas como expresiones, procedimientos, funciones parametricas o listas de puntos (cuando
se graca un procedimiento, la notacion de operador se debe de utilizar). Se puede consultar
?plot[function] para mayor informacion. Para gracas en tres dimensiones, ver ?plot3d. La
ejecucion de plot produce una estructura de datos PLOT wue posteriormente se despliega. Para
mayor informacion, ver ?plot[structure].
Los argumentos para los rangos horizontal y vertical, rangoH y rangoV, denen las etiquetas de
los ejes y los rangos en que se desplegara la funciones (o funciones). La forma de los rangos puede
ser una de las siguientes: string,a..b, o string=a..b, donde a y b son constantes reales. Para
mayor informacion, ver ?plot[range].
Los argumentos restantes se interpretan como opciones que se especican como ecuaciones en
la forma de opcion=valor. En particular, la opcion style permite gracar los puntos como
puntos solamente, o interpolarlos utilizando el modo de line. Para mayor informacion, ver
?plot[options].
Deniendo la variable global plotdevice (va el comando interface) con uno de los valores lis-
tados bajo ?plot[device], controla el tipo de graca que se producira. Para mayor informacion,
ver ?plot[device] y ?plot[setup].
1.5
1
0.4
0.5
0.2
x -4 -2 00 2 4
0.2 0.4 0.6 0.8 1 1.2 1.4 x
0
-0.5
-0.2
-1
-0.4 -1.5
-0.6
-0.8
Opcion Descripcion
scaling Controla la escala de la graca. Puede ser CONSTRAINED o UNCONSTRAINED.
El default es UNCONSTRAINED.
axes Especica el tipo de ejes, a escoger uno de: FRAME, BOXED, NORMAL y NONE.
coords=polar Indica que una graca parametrica esta en coordenadas polares. El primer
parametro es el radio y el segundo parametro es el angulo.
numpoints=n Especica el mnimo numero de puntos que se generaran. Nota: plot
emplea un algoritmo adaptable para gracar que automaticamente hace
mas trabajo cuando los valores de la funcion no caen cercanos a una lnea
recta. Por lo tanto, plot comunmente generara mas puntos que el numero
mnimo.
resolution=n Dene la resolucion horizontal de despligue del disposivo en pixeles (el de-
fault es 200). El valor de n es usado para determinar cuando el esquema
adaptable de gracado ha terminado. Un valor mayor resultara en mas
evaluaciones de la funcion cuando esta no es suave.
color=n Permite al usuario especicar el color de las curvas que se van a gracar.
Ver ?plot,color para detalles.
xtickmarks=n Indica que un numero razonable no menor que n que debera marcarse sobre
el eje horizontal; n debera ser un netero positivo. Tambien existe una opcion
ytickmarks=m, que corresponde al eje vertical.
style=s El estilo de interpolacion debera ser uno de los siguientes (el default es
LINE): POINT solo puntos, LINE interpolacion lineal, y PATCH estilo de par-
ches para polgonos.
discont=s Para grecado con expresiones solamente. Si s es true, primero se llama a
discont de la biblioteca de rutinas para determinar las discontinuidades de
la funcion de entrada y posteriormente parte el eje horizontal en intervalos
apropiados donde la expresion es continua.
title=t El ttulo de la graca. t debera ser un string. El default es sin ttulo.
thickness=n Grosor de las lneas en la graca. n debera ser 0, 1, 2 o 3. El default es 0.
linestyle=n Controla el patron de guionado utilizado para generar las lneas en la graca.
Los estilos 0 y 1 dan lneas solidas mientras que valores mayores varan el
patron de guionado.
symbol=s Smbolo para puntos en la graca. s es uno de BOX, CROSS, CIRCLE, POINT
y DIAMOND.
font=l Font para los objetos tipo texto en la graca. l es una lista de la for-
ma [familia, estilo, tama~ no], donde familia es una de TIMES, COURIER,
HELVETICA, y SYMBOL. Para TIMES el estilo podra ser uno de ROMAN, BOLD,
ITALIC o BOLDITALIC. Para HELVETICA y COURIER, estilo podra omitirse
o ser uno de BOLD, OBLIQUE o BOLDOBLIQUE. SYMBOL no acepta la opcion
estilo. El ultimo parametro, tamano, debera ser el tamano en puntos a
utilizar.
continua en la siguiente pagina
Opcion Descripcion
titlefont=l Font para el ttulo de la graca y se especica en la misma forma que font.
axesfont=l Font para las etiquetas en la marcas de los ejes. Se especica en la misma
forma que font.
labelfont=l Font para las etiquetas (nombres) de los ejes en la graca. Se especica de
la misma forma que font.
view= Indica el mnimo y maximo que se desplegara en ambos ejes. El default es
[xmin..xmax, que sea la totalidad de la curva.
ymin..ymax]
Graca de unos puntos dados como una lista, los Graca de una serie de puntos generados a partir
elementos nones son las x y los pares las y. de la evaluacion de una funcion
> plot([0,0,1,1,2,2,3,3,4,4,5,5], > plot([[n,sin(n/Pi)] $n=1..20],
> x=0..5,y=0..5,style=point); > x=0..20,style=point,
> > symbol=circle);
5 1
4
0.5
y
00 5 10 15 20
2 x
1 -0.5
00 1 2 3 4 5 -1
> diff(f(z),z);
2z
Muchas veces se ha calculado alguna expresion y posteriormente se desea declarar una funcion con dicha
expresion. Para esos casos, se utiliza el comando unapply
> expr1 := tan(t):
> expr2 := diff(tan(t),t):
> f := unapply(expr2,t);
f := t 1 + tan( t )2
El comando unapply puede tener argumentos adicionales que permiten la declaracion de funciones de
mas de una variable
> expr3 := subs(t=s*t,expr2):
> g := unapply(expr3,s,t);
g := ( s, t ) 1 + tan( s t )2
> simplify(expr);
cos( 2 y )2 + 3 + e( 5/2 x ) csgn( 1 + x ) + e( 5/2 x ) csgn( 1 + x ) x + 4 2
> simplify(expr,power);
2 cos( 2 y )2 + 3 sin( 2 y )2 + e( 5/2 x ) csgn( 1 + x ) + e( 5/2 x ) csgn( 1 + x ) x + 4 2
> simplify(expr,trig);
cos( 2 y )2 + 3 + ( ex )5/2 ( 1 + x )2 + 4 2
> simplify(");
4
2.13.1 Diferenciacion
> diff( sin(ln(x^2 + 1) / 3), x);
1 2
cos ln( x + 1 ) x
2 3
3 x2 + 1
2.13.2 Integracion
> Int(x^3*cos(x), x) = int(x^3*cos(x), x);
x3 cos( x ) dx = x3 sin( x ) + 3 x2 cos( x ) 6 cos( x ) 6 x sin( x )
En ocasiones, Maple no podra calcular una solucion de forma cerrada y respondera con el comando que
se ejecuto
> int( 1/(x+exp(x)), x=0..1);
1
1
dx
0 x + ex
Al declarar la ecuacion diferencial, se tiene que declarar que la funcion y depende explcitamente de la
variable x, es decir y(x). Lo anterior permite utilizar diff para denir la deriva de y(x) con respecto
a x.
> deq := diff(y(x),x)*x^2+y(x)=0;
deq := y( x ) x2 + y( x ) = 0
x
La solucion de la ecuacion diferencial se obtiene mediante el comando dsolve, siendo los parametros
la ecuacion diferencial a resolver y la funcion que se desea encontrar.
> dsolve(deq, y(x));
y( x ) = e( x ) C1
1
Un problema de valor inicial se dene como un conjunto de ecuaciones formado por la ecuacion diferencial
y las condiciones iniciales
> dsolve({deq, y(1)=a},y(x));
e( x ) a
1
y( x ) =
e
Como parte de la programacion de dsolve, se incluye el algoritmo de Kovacic para resolver ecuaciones
diferenciales lineales homogeneas de segundo orden con coecientes racionales.
> dsolve(x^2*diff(y(x),x,x) + 5*diff(y(x),x) = 0,y(x));
( 1
5x ) 1
y( x ) = C1 + C2 x e + 5 Ei 1, 5
x
Sin embargo, no siempre puede encontrar una solucion; en cuyo caso, se puede aproximar la solucion
mediante series (el orden default es 6)
> dsolve( diff(f(x),x) + f(x)^5*x = sin(x), f(x));
> dsolve( {f(0)=1/2, diff(f(x),x) + f(x)^5*x = sin(x)},f(x), series);
1 31 2 977 4
f( x ) = + x x + O( x6 )
2 64 12288
Tambien se pueden resolver sistemas de ecuaciones diferenciales con condiciones iniciales para un con-
junto de funciones.
> sys := { diff(y(x),x) = z(x), diff(z(x),x) = y(x), y(0) = 0, z(0) = 2};
sys := y( x ) = z( x ), z( x ) = y( x ), y( 0 ) = 0, z( 0 ) = 2
x x
Se calculan los primeros terminos de la serie de Taylor para la funcion sin(x) al rededor de x = 0. El
default es que Maple calcule los terminos hasta de orden 6.
> t1 := series(sin(x), x=0);
1 3 1 5
t1 := x x + x + O( x6 )
6 120
O(x6 ).
> S := series(t1*t1, x=0, 10);
1 4 2 6
S := x2 x + x + O( x7 )
3 45
Para evaluar una serie en un valor dado, se tiene que primero calcular la serie y luego convertirla a
un polinomio mediante la eliminacion de los terminos de orden. Lo anterior se logra con la funcion
predenida convert:
> P := convert(", polynom);
1 4 2 6
P := x2 x + x
3 45
Para eliminar los terminos de orden superior de un polinomio de una serie, se puede dividir por la
potencia de menor orden que se desea eliminar utilizando la funcion predenida rem:
> rem(P,x^6, x);
1 4
x2 x
3
Los polinomios tienen una expansion en series que son correctas exactamente si el orden de expansion
es mayor que el grado del polinomio
> series(x^10 + 1, x=0, 20);
1 + x10
2.13.5 Lmites
> r := (x^2 - 1) / (11*x^2 - 2*x -9):
> limit( sqrt(r), x=1 );
1
10
10
> sum(1/(i^2),i);
( 1, i )
> sum(1/(1-i),i=0..n);
n
1
i=0
1i
> lprint(");
sum(1/(1-i),i = 0 .. n)
1 1
32768
6
6 , 212992
7
7 ,
1+ 5 1 + 5 1+ 5 1 + 5
1 1
1376256
8
8 , 8912896
9
9 ,
1+ 5 1 + 5 1+ 5 1 + 5
1
57671680
10
10
1+ 5 1 + 5
> evalf(");
[.9999999992, .9999999989, 1.999999996, 2.999999992, 4.999999984, 7.999999967,
12.99999994, 20.99999989, 33.99999981, 54.99999964]
El comando rsolve puede tomar un tercer parametro ztrans, el cual hace que rsolve utilice el metodo
de transformada Z
> rsolve( {y(n+1) + f(n) = 2*2^n + n, f(n+1) - y(n) = n- 2^n + 3,
> y(1)=1, f(5)=6}, {y,f}, ztrans );
{ y( n ) = 1 + 2n , f( n ) = n + 1 }
Captulo 3
> expand(expr1);
2 x z + 2 y z + z2
combine(expr , trig) Elimina productos y potencias de cos, sin, cosh, y sinh en expr utilizando
varias reglas para angulos como:
a+b ab
sin(a) cos(b) sin + sin
2 2
a+b ab
sinh(a) sinh(b) cosh cosh
2 2
combine(expr , power) Simplica expresiones que contengan productos de potencias (incluyendo expo-
nenciales) utilizando reglas:
dn
n (1 z) (1)n ( n (z) + cot z)
dz n
para n entera positiva.
combine(expr ) Combina sumas de terminos en expr que involucren los operadores inertes Int,
Sum y Limit:
b b b
c1 f (x)dx + c2 g(x)dx c1 f (x) + c2 g(x)dx
a a a
b
b
b
c1 f (i) + c2 g(i) c1 f (i) + c2 g(i)
i=a i=a i=a
> expan(expr2);
( a+b ) ( ( n + 1 )! )2
expan cos( a + b ) e +
( n! )2
> combine([e1,e3],{exp,ln,trig});
2
( 2 x+y ) a 2 x
cos( x ), e + ( x ) + ln
y
> normal(");
(x + 2y)(x y)
2
x+y
> normal(");
2 x + x2 + x y + y x2 + 2 x y 2 + y 3 + y x3 + 3 y 2 x2 + 3 x y 3 + y 4
( x + y )3
> c := expand((x^2+x+1)^5);
c := 5 x + 1 + 30 x3 + 30 x7 + 15 x8 + x10 + 5 x9 + 51 x5 + 45 x6 + 45 x4 + 15 x2
> sort(c);
x10 + 5 x9 + 15 x8 + 30 x7 + 45 x6 + 51 x5 + 45 x4 + 30 x3 + 15 x2 + 5 x + 1
> sort([z,u,w,s,u,v,w,y,t]);
[ s, t, u, u, v, w, w, y, z ]
> sort(t*s*u);
sut
> sort(t+s+u);
s+u+t
> sin(t+s+u);
sin( s + u + t )
> e := 1+x^4*y*z+y^5*z^2*x+x*y^2*z^3;
e := 1 + x4 y z + y 5 z 2 x + x y 2 z 3
> expand(cos(x+y)-sin(x+y)^2);
cos( x ) cos( y ) sin( x ) sin( y ) sin( x )2 cos( y )2 2 sin( x ) cos( y ) cos( x ) sin( y )
cos( x )2 sin( y )2
> simplify(expr);
2 cos( a )2 cos( b )2 2 cos( a ) cos( b ) sin( a ) sin( b ) + 1 cos( b )2 cos( a )2
> simplify(");
cos( a + b )2
Uso del comando alias para utilizar una forma abreviada de la funcion binomial
> alias( C = binomial );
I, C
> simplify(");
1 ln( nln()+ln( 2) 8
8 2)
7 7
> simplify(");
8 3 8
n
7 7
> factor(");
3 ( x + 1 )2
Compare ahora la forma factorizada de la derivada con la derivada del factorizado original
> factor(p);
( x + 1 )3
La factorizacion sobre los numeros racionales signica que solamente numeros racionales, no complejos,
aparecen en los factores. El polinomio q es irreducible sobre los numeros racionales.
> q := x^2 + 9/4;
9
q := x2 +
4
> factor(q);
9
x2 +
4
> factor(");
x2 ( sin( y ) + 1 ) x2 sin( y )3 + 1
> whattype(s);
+
> whattype(t);
string
> nops(op(3,s));
1
El operando 0 de una funcion es el nombre de la misma
> op(0, op(3, s));
sin
Los cocientes se representan como productos. Los productos siempre tienen la constante racional como
primer operando (excepto cuando la constante es 1)
> q := x/(6*y);
1 x
q :=
6 y
> type(q,*);
true
> op(1,q);
1
6
> op(2,q);
x
> r := op(3,q);
1
r :=
y
> type(r,^);
true
> op(1,r);
y
> op(2,r);
1
3.4.1 Secuencias
> t := taylor(seq1);
1 3
t := x x + O( x5 )
6
Maple maneja el concepto de conjuntos tal y como lo conocemos, es decir, solo desplegara una instancia
de cada elemento aun cuando el conjunto tenga mas de una.
> set1 := {a, b};
set1 := { a, b }
Las listas en Maple se declaran con corchetes ([. . . ]) y para accesar alguno de los elementos de la
lista, solo se tiene que indicar la posicion que ocupan en la lista. La numeracion de las posiciones en
una lista siempre comienza en 1.
> list1 := [1, 2, 3];
list1 := [ 1, 2, 3 ]
> n := nops(list3);
n := 6
> print(list6);
[ 6, 5, 4, 3, 47, 1 ]
3.5.1 Tablas
> LongitudDeOnda := table([rojo=610, azul=480, violeta=450, verde=520, negro=0]);
LongitudDeOnda := table([
rojo = 610
azul = 480
violeta = 450
verde = 520
negro = 0
])
> LongitudDeOnda[rojo];
610
> LongitudDeOnda;
LongitudDeOnda
> print(LongitudDeOnda);
table([
rojo = 640
azul = 480
violeta = 450
verde = 520
naranja = 600
])
> indices(LongitudDeOnda);
[ rojo ], [ azul ], [ violeta ], [ verde ], [ naranja ]
> entries(LongitudDeOnda);
[ 640 ], [ 480 ], [ 450 ], [ 520 ], [ 600 ]
> W13;
LongitudDeOnda
Copias de tablas
> Fibonnaci_table[1] := 1: Fibonnaci_table[2] := 1:
> Fibonnaci_table[3] := 2: Fibonnaci_table[4] := 3:
> Fibonnaci_table[5] := 5: Fibonnaci_table[6] := 9:
> b := eval(Fibonnaci_table):
> c := copy(Fibonnaci_table):
> b[6] := 8;
b6 := 8
> Fibonnaci_table[6];
8
> c[6];
9
3.5.2 Arreglos
A diferencia de las listas, la numeracion de las posiciones de un arreglo las dene el usuario y no esta
restringida a que siempre comience en 1. De tal forma que se puede tener un arreglo cuya numeracion
de sus posiciones comience en -1 (como se ve en un ejemplo posteriormente) y termina en 3. El numero
total de elementos de ese arreglo sera de 5 (-1, 0, 1, 2, 3).
> a := array(1..2, 1..2);
a := array( 1..2, 1..2, [ ] )
> print(a);
1 2
a2,1 4
> i := i;
i := i
> b := a[i+1,i];
b := ai+1,i
> c := 2*b;
c := 2 ai+1,i
> i := 1;
i := 1
> b;
a2,1
> F := table(sparse);
F := table(sparse, [
])
> indices(F);
[ b ], [ a ], [ x ], [ y ], [ z ]
> entries(F);
[ 1 ], [ 2 ], [ 5 ], [ 2 ], [ 4 ]
> "/nops(testscores);
167
2
> evalf(");
83.50000000
> evalf(L);
[ .6000000000, 1.570796327, 1.098612289 ]
> evalf(s2);
{ 0, .7071067810 }
> L2 := [1,2,3,4];
L2 := [ 1, 2, 3, 4 ]
> s2 := {op(L2)};
s2 := { 1, 2, 3, 4 }
Maple asume que un vector es un arreglo de la forma array(1..n) y una matriz es un arreglo de la
forma array(1..m,1..n), para valores positivos enteros de m y n.
Para realizar operaciones aritmeticas vectoriales o matriciales con Maple, el comando evalm permite
hacerlo de una manera muy sencilla.
Ahora, denimos a v como un vector que solamente tiene denidos los primeros dos elementos
> v := array(1..3): v[1] := 23: v[2]:=-y:
> print(v);
[23 y v3 ]
Si desearamos realizar el producto punto
> A &* v;
A & v
la expresion anterior tpica de Maple no nos servira. Es necesario que utilicemos evalm
> evalm(A &* v);
23
23 2 y + 3 v3 23 x x y + 5 v3 4 y v3
2
Los vectores (arreglos unidimensionales) se manejan de la misma forma que matrices con una sola
columna (con el mismo numero de las). La multiplicacion escalar es la misma.
> w := array(1..3,1..1, [[v[1]], [v[2]], [v[3]]]);
23
w := y
v3
La biblioteca de Maple contiene varios paquetes, cada uno es una conjunto de funciones relacionadas.
En esta seccion se presenta al paquete linalg. Este paquete es un conjunto de funciones que trabajan
con arreglos que representan vectores y matrices. El comando with(linalg) dene nombres mas
cortos que pueden ser utilizados para ejecutar estas rutinas. Por ejemplo, despues de haber ejecutado
el comando with(linalg), podemos ejecutar jacobian en lugar de linalg[jacobian].
La tabla 3.5 muestra las funciones contenidas en este paquete.
Tabla 3.5: Funciones denidas en el paquete linalg.
> with(linalg):
Denimos una matriz de 33
> A := array( [[1,2,3], [3,-1,6], [4,8,12]] );
1 2 3
A := 3 1 6
4 8 12
y ahora, denimos a u como un vector de 3 elementos
> u := array( [ -1, 3-s, -4 ] );
u := [ 1 3 s 4 ]
Con el vector y matriz anteriormente denidos, podemos resolver el sistema Ax = u. Si existe mas de
una solucion, linsolve utiliza los parametros t1 , t2 , t3 , etc. para describir parametricamente las
soluciones.
> linsolve(A,u);
7 1
5 t1 + 5 s t1 t1 2 + s
3 3
Podemos calcular el determinante
> det(A);
0
o el polinomio caracterstico
> cpoly := charpoly(A,lambda);
cpoly := 3 12 2 67
Podemos vericar el teorema de CayleyHamilton mediante la evaluacion del polinomio caracterstico
en lambda=A y vericar que produce una matriz de ceros.
> subs(lambda=A, cpoly);
A3 12 A2 67 A
> evalm(");
0 0 0
0 0 0
0 0 0
Tambien podemos calcular los valores caractersticos
> eigenvals(A);
0, 6 + 103, 6 103
y mediante la factorizacion del polinomio caracterstico, podemos vericar que son los mismos valores
La exponencial de una matriz esta denida como ea y no es lo mismo que mapear la funcion exp a los
elementos de a.
> exponential(a);
cos( x ) sin( x )
sin( x ) cos( x )
> C := swaprow( B, 3, 2 );
19 50 88
C := 78 17 72
4265 5595
0
19 19
> D1 := mulrow( C, 3, 19 );
19 50 88
D1 := 78 17 72
0 4265 5595
19 50 88
4265 5595
0
19 19
78 17 72
19 50 88
> gaussjord(");
56399 42938 43729
1 0 0
9855 9855 3285
20528 15761 15913
0 1 0
3285 3285 1095
46832 36584 35782
0 0 1
9855 9855 3285
> linalg[add](Id,Id);
2 0 0
0 2 0
0 0 2
> with(linalg,randmatrix);
[ randmatrix ]
> R := randmatrix(2,2);
85 55
R :=
37 35
> rref(R);
1 0
0 1
> linalg[rref](R);
1 0
0 1
> b := x^4;
b := x4
> quit;
> readlib(iroot):
> iroot(103900,3);
47
Captulo 4
while condicion do
instrucciones
od;
> a := 20; b := 12; > a := 35;
a := 35
a := 20
b := 12
> b:= 15;
>
b := 15
while b<>0 do
> d := irem(a,b);
> a := b; > while b<>0 do
> b := d; > d := irem(a,b);
> od; > a := b;
d := 8 > b := d;
a := 12 > od;
b := 8 d := 5
d := 4 a := 15
a := 8 b := 5
b := 4 d := 0
d := 0 a := 5
a := 4 b := 0
b := 0
> lprint(
> lprint( > El mayor comun denominador es,a);
> El mayor comun denominador es ,a); El mayor comun denominador es 5
El mayor comun denominador es 4
1 3 1 2 1
n + n + n
3 2 6
suma de j^4 j = 1..n es:
1 5 1 4 1 3 1
n + n + n n
5 2 3 30
suma de j^6 j = 1..n es:
1 1 1 1 1
n n3 + n5 + n6 + n7
42 6 2 2 7
> i;
8
if condicion
then instrucciones cuando la condicion es verdadera
else instrucciones cuando la condicion es falsa
fi;
> isprime(37); true > A := array(1..4, 1..4 ):
>
> isprime(6); false >
for i to 4 do
for j to 4 do
> for i to 8 do > if i > j then A[i,j] := j
> es_primo := 2^(2*i+1)-1; > elif i < j then A[i,j] := i
> if isprime(es_primo) > else A[i,j] := 1
> then print(es_primo, es primo); > fi
> else print(es_primo, no es primo) > od;
> fi; > od:
> od: > print(A);
7, es primo 1 1 1 1
31, es primo
127, es primo 1 1 2 2
511, no es primo 1 2 1 3
2047, no es primo
1 2 3 1
8191, es primo
32767, no es primo
131071, es primo
> h;
> f(w,z+1); f
w+z+1
> op(f);
> g:= f;
g := f proc(x,y) x+y end
> print(h);
> h:= g;
h := f proc(x,y) x+y end
> h(3,5);
8
global (misma sintaxis que local) permite el uso de variables denidas en una sesion de Maple fuera
del procedimiento que se esta deniendo (variables globales).
> maxN := proc ()
> local result, i;
> if not(type([args], list(numeric)) )
> then procname(args);
> elif nargs>0 then
> result := args[1];
> for i from 2 to nargs do
> if args[i] > result then result := args[i]; fi;
> od;
> result;
> fi;
> end:
> maxN(25/7, 525/149);
25
7
> maxN();
> maxN(25/7,z,525/149);
25 525
maxN , z,
7 149
> result;
result
> x := 1/4:
> seq(a[i], i = 0..5);
1 7 11 17 61
1, , , , ,
4 8 16 32 64
> x := x;
x := x
> plot({seq(a[i],i=0..5)},x=-1..1);
> f(5);
5y
> y := 47;
y := 47
> f(5);
42
> h := proc(x)
> local w;
> w := x + 1;
> i(x);
> end:
> i := proc(a) a-w end:
> h(5);
5w
> w := 47;
w := 47
> h(5);
42
> maxN();
Error, (in maxN) no arguments
> lasterror;
the modular inverse does not exist
> printlevel := 3:
> for x in [0, 1, 2] do
> r := traperror( f(x) );
> if r = lasterror then
> if r = division by zero then
> r := limit(f(u), u=x)
> else
> ERROR(lasterror)
> fi
> fi;
> lprint(Resultado: x =, x, f(x) =, r)
> od;
r := 1
Resultado: x = 0 f(x) = 1
r := division by zero
r := 2
Resultado: x = 1 f(x) = 2
r := 3
Resultado: x = 2 f(x) = 3
> 1-(Pi+f(2))^2;
1 ( + f( 2 ) )2
> p:=-x^2*y^6-4*x^2*z^4-2*x^2*y*z^4+3*x^5*y^2*z^2;
p := x2 y 6 4 x2 z 4 2 x2 y z 4 + 3 x5 y 2 z 2
> f(0) := 1;
f( 0 ) := 1
> f(infinity) := 0;
f( ) := 0
> Chebyshev(x,5);
{--> enter Chebyshev, args = x, 5
{--> enter Chebyshev2, args = XX_, 5
{--> enter Chebyshev2, args = XX_, 4
<-- exit Chebyshev2 (now in Chebyshev2) = 8*XX_^4-8*XX_^2+1}
<-- exit Chebyshev2 (now in Chebyshev) = 16*XX_^5-20*XX_^3+5*XX_}
5 3
cpoly := 16 XX 20 XX + 5 XX
> L := proc(n,x)
> option remember;
> if n<2 then x^n
> else normal( (2*n-1)/n*x * L(n-1,x) - (n-1)/n*L(n-2,x) );
> fi;
> end:
> L(4, t);
35 4 15 2 3
t t +
8 4 8
> L := proc(n,x)
> local result;
> if n<2 then
> result := x^n;
> else
> result := normal( (2*n-1)/n*x*L(n-1,x) - (n-1)/n*L(n-2,x) );
> fi;
> if not type(x,numeric) then
> L(n,x) := result;
> fi;
> RETURN(result);
> end:
> L(4, y);
35 4 15 2 3
y y +
8 4 8
> f := x ->x^2;
f := x x2
> df := D(f);
df := x 2 x
> df(3);
6
> (D@@2)(g);
D( 2 ) ( g )
> g := log@tan + f;
g := log@tan + f
> d2gAt1;
2
D( 2 ) ( log )( tan( 1 ) ) 1 + tan( 1 )2 + 2 D( log )( tan( 1 ) ) 1 + tan( 1 )2 tan( 1 ) + 2
Dencion del operador de diferencias utilizando el metodo de forma funcional para crear una nueva
funcion.
> Shift := proc(f)
> local x;
> option operator;
> unapply( simplify(f(x+1) - f(x)), x);
> end:
> SSin := Shift( sin );
SSin := x sin( x + 1 ) sin( x )
> SSin(Pi);
sin( 1 )
> SSin(1.0);
.0678264420
> SSin(x^2);
sin( x2 + 1 ) sin( x2 )
> Shift(");
2
> "(3.5);
2
El acceso a las funciones y/o comandos de un paquete en Maple, se puede tener mediante el comando
with(paquete). Adicionalmente, se puede crear un archivo .m y utilizar el comando read para utilizarlo
en una sesion de Maple.
> read quaternion.m;
> ?quaternion
> a := quat(2,3,1,5): b := quat(9,4,7,6):
> quaternion[qmul](a,b);
> quaternion[qadd](a,b);
Captulo 5
Gracas avanzadas
Mediante la denicion del plotdevice y plotoutput, se puede almacenar cualquier graca que se
genere con los comandos plot y plot3d. El siguiente ejemplo muestra como se puede generar un
archivo Postscript de una serie de puntos, as como la estructura que se genera para dicha graca.
> interface( plotdevice=postscript, plotoutput=display1.ps );
> listadatos := [ [1950,18.6], [1960,19.3], [1970,20.4], [1980,21.6], [1990,25.4] ]:
> PointPlot := plot( listadatos, style=POINT, title=Grafica de puntos):
> lprint( PointPlot );
PLOT(CURVES([[1950., 18.6], [1960., 19.3], [1970., 20.4], [1980., 21.6],
[1990., 25.4]], COLOUR(RGB,0,0,0)),TITLE(Gr\char"E1fica de puntos,
FONT(TIMES,ROMAN,18)),STYLE(POINT),AXESLABELS(,,FONT(TIMES,ROMAN,18)),
AXESTICKS(DEFAULT,DEFAULT,FONT(TIMES,ROMAN,18)),FONT(TIMES,ROMAN,18),
VIEW(DEFAULT,DEFAULT))
Mediante el uso de convert, podemos separar los valores de x y de y de listadatos que estaban
acomodados como una lista de 5 elementos y cada elemento era una lista de 2 elementos (pares de
x, y).
> ldatos:=convert(transpose(convert(listadatos,matrix)),listlist);
ldatos := [ [ 1950, 1960, 1970, 1980, 1990 ], [ 18.6, 19.3, 20.4, 21.6, 25.4 ] ]
Podemos hacer un ajuste polinomial por mnimos cuadrados mediante el paquete stat[fit]
> with(stats,fit):
> fit[leastsquare[[t,y], y=a + b*t + c*t^2, {a,b,c}]](ldatos);
y = 17252.83118 17.65409727 t + .004521089495 t2
> y:=rhs(");
y := 17252.83118 17.65409727 t + .004521089495 t2
Ahora, gracamos la funcion ajustada y posteriormente desplegamos ambas gracas: la de los puntos y
la de la funcion.
> CurvaPlot := plot(y,t=1950..1990):
> with(plots):
> display( [PointPlot, CurvaPlot],
> title=Datos y curva ajustada mediante mnimos cuadrados);
25
24
23
22
21
20
19
El siguiente ejemplo muestra como se puede generar un histograma manipulando la estructura PLOT. El
procedimiento torre genera los rectangulos que denen al histograma. El procedimiento histograma
necesita como entrada una lista de datos y el ttulo que llevara la graca del histograma.
> torre := proc(xnlist)
> local xleft, xright, n;
> n := xnlist[2];
> xleft := xnlist[1]-1/2;
> xright := xnlist[1]+1/2;
> RETURN([xleft,0,xright,0,xright,n,xleft,n,xleft,0]);
> end:
> histograma := proc( List, Title )
> local histolist, plotset, count, el, zipproc, palette;
> count := table(sparse);
> for el in List do count[el] := count[el]+1; od;
> zipproc := (x,y) -> [op(x),op(y)];
> histolist := zip( zipproc, [indices(count)],[entries(count)] );
> plotset := convert( map(torre,histolist), set ) union
> { [0, 0, max(op(List))+1, 0] };
> plotstructure := plot(plotset,style=LINE,title=Title,xtickmarks=8):
> palette := [ RED, WHITE, YELLOW, GREEN, BLUE, CYAN, MAGENTA ];
> subs( map(((x) -> x=BLACK), palette), plotstructure );
> end:
> lvals := [1,3,1,7,1,3,7,7,4,6,4,4,2,7,3,3,3]:
> histograma(lvals,Ejemplo de un histograma);
0 1 2 3 4 5 6 7 8
m := 3
n := 7
z 0
-2
-4
-4 -4
-2 -2
0 0
y x
2 2
4 4