Minicurso de Introducción a Maple
Observación:
En este Minicurso de Introducción a Maple V, hemos usado para la notación habitual de Maple para la introducción de los distintos comandos. No debemos olvidar, que podríamos introducir gran parte de los comandos, expresiones y acciones haciendo uso de las paletas, menús contextuales y el editor matemático; o bien, mostrar los inputs en formato tradicional matemático.
CUANDO USE MAPLE V NO OLVIDE QUE:
Cálculos Numéricos
Enteros
Maple V puede ser usado como una potente calculadora:
> 32*12^13;
Además, Maple V incorpora un gran número de funciones para trabajar con enteros, incluyendo:
> 25 mod 3;
> 200!;
> ifactor(%);
> isprime(157);
Racionales
Una de las principales virtudes de Maple V es el cálculo simbólico racional: podemos trabajar con racionales e irracionales sin necesidad de tener que remitirnos a aproximaciones numéricas (en coma flotante).
> 1/2 + 2/3;
Maple V automáticamente se encarga de simplificar las fracciones:
> 2/4;
También la manipulación de números irracionales se realiza de manera simbólica:
> sqrt(2);
> (2^30)/(3^20)*sqrt(2)+sqrt(8);
Decimales
A pesar que Maple V es un Sistema de Cálculo Simbólico (y por lo tanto se trabaja de manera exacta), podemos obtener aproximaciones numéricas de cualquier valor. El límite es de 500.000 dígitos.
Para obtener dichas aproximaciones decimales usaremos el comando evalf .
> evalf(%);
> evalf(7/6);
Podemos manipular constantes como de manera simbólica o a partir de aproximaciones numéricas:
> Pi;
> evalf(Pi,200);
Cuando intervienen expresiones decimales dentro de los inputs, los outputs obtenidos también son expresiones decimales:
> 1.0/5.3;
> sin(.2);
Maple V puede calcular valores numéricos tanto para las funciones elementales como para funciones más especiales (y obtener expresiones decimales cuando lo deseeemos):
> sin(2*Pi);
> exp(2);
> evalf(%);
Complejos
Maple V trabaja con números imaginarios. En particular, la unidad imaginaria es representada por el símbolo I :
> (2+5*I)+(1-I);
> (1+I)/(3-2*I);
Cálculos Simbólicos
Manipulación de expresiones polinómicas
La verdadera virtud de Maple (como Sistema de Computación Algebraica) se encuentra en el área del cálculo simbólico, donde es capaz de trabajar con indeterminadas de manera matemática:
> (1+x)^2;
Maple V trabaja de manera matemática y automática con las expresiones polinómicas:
> (1+x)+(3-2*x);
Disponemos de miles de funciones para la manipulación de expresiones simbólicas. A continuación podemos ver algunos ejemplos:
> expand((1+x)^2);
> factor(%);
> diff(sin(x),x);
> sum(n^2,n);
> rem(x^3+x+1,x^2+x+1,x);
> series(sin(x),x=0,10);
Manipulación algebraica de expresiones
Maple V proporciona al usuario un potente entorno para simplificación de expresiones. En particular, hace uso de distintas identidades trigonométricas para la simplificación de expresiones:
> simplify(cos(x)^5+sin(x)^4+2*cos(x)^2-2*sin(x)^2-cos(2*x));
Para simplificar expresiones algebraicas racionales, podemos usar también el comando normal .
> normal((x^3-y^3)/(x^2+x-y-y^2));
El comando convert permite al usuario transformar una determinada expresión a otro tipo de formato. En particular, podemos transformar una expresión racional a una expresión equivalente en forma de suma de distintas expresiones racionales:
> expr:=(a*x^2+b)/(x*(-3*x^2-x+4));
> convert(expr,parfrac,x);
Con el mismo comando podemos transformar una expresión trigonométrica a su equivalente en formato exponencial:
> convert(cot(x),exp);
Resolución de ecuaciones
Es conveniente usar el comando restart al comienzo de una sesión, o cuando vayamos a involucrarnos dentro de una misma sesión en cálculos que no están relacionados con las variables o expresiones definidas con anterioridad.
> ?restart;
Con el comando restart eliminamos de la memoria del kernel cualquier definición o asignación que hayamos realizado.
> restart;
Para resolver ecuaciones algebraicas usaremos el comando solve :
> solve(a*x^2+b*x+c,x);
Observación: Maple V asume que la ecuación contenida dentro del comando solve está igualada a 0, si no se indica lo contrario. Si Maple V devuelve la ecuación sin resolver, esto no significa que la ecuación no tenga solución, sino que Maple V no ha sido capaz de determinarla con el comando que le hemos indicado.
Con el mismo comando, Maple V puede resolver sistemas de ecuaciones y sistemas de inecuaciones:
> solve({x+2*y=3,y+1/x=1},{x,y});
> solve({x^2*y^2=0,x-y=1,x<>0},{x,y});
En ocasiones, el comando solve devuelve la expresión Root_Of . Con esta expresión representamos de manera simbólica el conjunto de raíces de ciertas ecuaciones de una variable. Si queremos obtener todos los valores (mediante una aproximación numérica) podemos hacer uso del comando allvalues :
> solve(x^5-2*x+2,x);
>
### WARNING: allvalues now returns a list of symbolic values instead of a sequence of lists of numeric values
allvalues(%);
Error, (in allvalues) redundant option RootOf(_Z^5-2*_Z+2,index = 3)
Sumas y productos
Maple V es capaz de calcular sumas finitas y series, y productos finitos e infinitos:
> Sum(k^2,k);
> value(%);
> sum(1/k!,k=0..infinity);
> Product(k^2,k=1..4);
> value(%);
Visualización
Maple V permite realizar gráficos bidimensionales y tridimensionales. Además, podemos representar ecuaciones explícitas, implícitas, paramétricas y conjuntos de datos. También podemos representar funciones con discontinuidades.
> restart;
Gráficos 2D
Simples Gráficos
Para generar gráficos 2D usaremos el comando plot .
> plot(sin(x),x=-2*Pi..2*Pi);
Para modificar los gráficos, podemos usar el menú contextual que aparece al pulsar el botón derecho del ratón o bien al pulsar sobre la ventana gráfica mediante los botones que aparecen en el menú de gráficos. También podemos indicar las distintas opciones dentro del comando plot .
> ?plot[options];
Funciones con Discontinuidades
Para indicar a Maple que la función que vamos a representar presenta discontinuidades usaremos la opción discont=true .
> plot(tan(x),x=-2*Pi..2*Pi,y=-4..4,discont=true,title=`Representación de Tan(x)`);
Representación Conjunta de ditintas funciones
> plot({x,x^2,x^3,x^4,x^5},x=-10..10,y=-10..10);
Observación: Hemos usado en el gráfico anterior el menú contextual para cambiar el grosor de los gráficos.
Representación Polar de curvas
> plot(sin(3*t),t=0..Pi,coords=polar);
Gráficos 3D
Representación de Superficies
> plot3d(sin(x*y),x=-2..2,y=-2..2);
Representación Paramétrica de Superficies
> plot3d([sin(t),cos(t)*sin(u),sin(u)],t=-Pi..Pi,u=-Pi..Pi);
Representación Esférica de Superficies
> plot3d(1,t=0..2*Pi,p=0..Pi,coords=spherical);
Animaciones
Maple V puede realizar animaciones de gráficos bidimensionales y de superficies.
> with(plots);
Warning, the name changecoords has been redefined
> animate(sin(x*t),x=-10..10,t=1..2,frames=50);
> animate3d(cos(t*x)*sin(t*y),x=-Pi..Pi,y=-Pi..Pi,t=1..2);
Gráficos Especiales
El paquete plots contiene rutinas para producir distintos tipos de gráficos especiales, incluyendo mapas topográficos, mapas de densidades y representaciones conformes de funciones complejas.
> with(plots);
> implicitplot3d(x^3+y^3+z^3+1=(x+y+z+1)^3,x=-2..2,y=-2..2,z=-2..2,grid=[13,13,13]);
Composición de Gráficos
Los comandos display y display3d permiten la creación de composición de gráficos.
Cuando asignamos un nombre a un gráfico, se omite el gráfico (debemos utilizar en lugar de punto y coma, dos puntos para omitir el output que muestra la estructura del gráfico). Para representar el gráfico asignado hay que utilizar el comando display o display3d . El uso de estos comandos también nos permite representar conjuntamente distintos gráficos.
> with(plots);
En este primer ejemplo, crearemos mediante una representación conforme una rejilla. Usando el comando display mostraremos conjuntamente la rejilla y la función seno.
> c:=coordplot(cartesian,colour=GREY):
> d:=plot(2*sin(3*x),x=-2*Pi..2*Pi,y=-2*Pi..2*Pi,color=RED):
> display([c,d],view=[-2*Pi..2*Pi,-5..5],axes=NORMAL);
También es posible combinar gráficos con etiquetas de texto:
> p:=plot(sin(x),x=-Pi..Pi):
> t1:=textplot([Pi/2,1,`Máximo Local`],align=ABOVE):
> t2:=textplot([-Pi/2,-1,`Mínimo Local`],align=BELOW):
> display({p,t1,t2});
Paquetes específicos.
Álgebra Lineal
> restart;
Introducción
Maple V proporciona al usuario un amplio abanico de paquetes especiales relacionados con Estadística, Teoría de Números, Teoría de Grafos... y uno especialmente diseñado para la enseñanza de Análisis a los estudiantes.
Existen distintos procedimientos para cargar un paquete:
> with(stats);
> with(DEtools,odeadvisor);
> finance[cashflows]([100, 200, 50], 0.1);
Uno de los paquetes más usados es el paquete de álgebra lineal, linalg. Este paquete contiene comandos para la manipulación de matrices y vectores.
> with(linalg);
Warning, the protected names norm and trace have been redefined and unprotected
Operaciones Matriciales
Un array es una generealización de la estructura matricial de datos. La conversión entre arrays y matrices es automática; por ello, cuando creamos un array podemos utilizarlo como una matriz.
Definamos una matriz numérica 3 x 3 mediante el comando array .
> M1:=array([[1/2,-1/3,2],[-5,14/3,9],[0,11,-5/6]]);
Para mostrar una matriz, usaremos los comandos print o evalm .
> print(M1);
> evalm(M1);
Para calcular la inversa tenemos el comando inverse :
> inverse(M1);
Definimos a continuación una matriz con valores simbólicos. En esta ocasión nos serviremos del comando matrix con una variación sobre la sintaxis habitual:
> M2:=matrix(3,3,[1/2,0,-2,sin(theta),1,phi^2,0,phi-1,3/4]);
Para multiplicar las matrices M1 y M2 tenemos el comando multiply o el operador:
> M3:=multiply(M1,M2);
Calculemos el determinante de esta última matriz:
> det(M3);
El paquete linalg contiene definiciones de matrices especiales como la matriz de Hilbert o la matriz de Vandermonde:
> hilbet(4);
> vandermonde([s,t,u,v,w]);
Operaciones con Vectores
Veamos a continuación algunos de los comandos para la creación y manipulación de vectores dentro del entorno de Maple V:
> v1:=vector([1,1,1]);
> v2:=vector([1,0,0]);
Calculemos el ángulo determinado por los dos vectores anteriores:
> angle(v1,v2);
También podemos calcular el producto escalar y el producto vectorial de ambos vectores:
> dotprod(v1,v2);
> crossprod(v1,v2);
Cuando los elementos del vector son funciones, tenemos la posibilidad de manipular de la misma manera todos los elementos del vector, de la misma manera que haríamos con una función:
> diff_vector:=vector([sin(x),cos(x),sin(x)*cos(x)]);
> map(diff,diff_vector,x);
Cálculo Infinitesimal
> restart;
Límites
Calculemos el límite de una función racional cuando x se aproxima al valor 1.
> f:=(x^2-2*x+1)/(x^4+3*x^3-7*x^2+x+2);
> Limit(f,x=1);
> value(%);
Cuando el límite en un punto no se encuentra definido, siempre podemos recurrir al cálculo de límites laterales:
> limit(tan(x),x=Pi/2);
> limit(tan(x),x=Pi/2,left);
> limit(tan(x),x=Pi/2,right);
Derivación e Integración
Maple V, como manipulador algebraico, permite calcular derivadas e integrales de manera simbólica:
> diff(sin(x)*x,x);
> int(cos(x),x);
> int(sin(x),x=0..Pi);
Ahora podemos derivar una expresión, integrar el resultado y comparar la expresión inicial con la final:
> f:=x*sin(a*x)+b*x^2;
> df:=diff(f,x);
> int(df,x);
> simplify(%);
Podemos realizar integrales definidas:
> int(df,x=1..2);
E incluso integrales mucho más complejas:
> f:=exp(-x^2);
> Int(f,x);
> value(%);
En caso que Maple V no sepa resolver simbólicamente la integral, podemos usar el comando evalf para obtener una aproximación numérica.
> int(exp(-x^3),x=0..1);
> evalf(%);
Estudiemos otro ejemplo:
> f:=exp(-a*t)*ln(t);
> int(f,t=0..infinity);
Definite integration: Can't determine if the integral is convergent.
Need to know the sign of --> a
Will now try indefinite integration and then take limits.
Vemos cómo la solución simbólica consiste en un límite, cuyo valor final depende de los distintos valores que puede tomar el parámetro a . Si asumimos ciertas condiciones sobre el parámetro a , podemos obtener una expresión más concreta:
> assume(a>0);
> int(f,t=0..infinity);
Observación: El símbolo ~ indica que el parámetro a tiene en su memoria ciertas suposiciones. Para eliminar las posibles suposiciones que tenga el símbolo a debemos escribir:
> a:='a';
Ecuaciones Diferenciales
Maple V puede resolver ecuaciones diferenciales ordinarias simbólica y numéricamente:
> dsolve(diff(y(x),x)=y(x));
> edsist:=diff(y(x),x)=z(x),diff(z(x),x)=y(x);
> dsolve({edsist,y(0)=0,z(0)=1},{y(x),z(x)});
Las opciones del comando dsolve permiten especificar tres posibles metodologías para resolver ecuaciones diferenciales: métodos numéricos, métodos de series y métodos de Laplace:
> ecuac:={diff(y(t),t)=x(t)+y(t),diff(x(t),t)=y(t),x(0)=2,y(0)=1};
> result:=dsolve(ecuac,{x(t),y(t)},type=numeric);
El resultado es un procedimiento de Maple (es decir, una función implementada con lenguaje de programación de Maple) que puede ser representado gráficamente o evaluado en puntos concretos:
> result(0);
> result(1);
> result;
Desarrollos de Taylor
> restart;
Vamos a calcular la aproximación de Taylor de orden 6 en x = 0 de cierta función:
> f:=sin(4*x)*cos(x);
> fs1:=taylor(f,x=0,6);
Podemos comparar la función inicial con la aproximación gráficamente:
> plot({f,convert(fs1,polynom)},x=-1..1,-2..2,title=`sin(4x) cos(x) vs. Desarrollo de Taylor`);
El orden del desarrollo de Taylor puede especificarse como opción del comando taylor o bien usando la variable global Order . Cambiaremos el orden, y estudiaremos cómo varía el gráfico con esta nueva aproximación:
> Order:=12;
> fs2:=taylor(f,x=0);
> plot({f,convert(fs2,polynom)},x=-1..1,-2..2,title=`sin(4x) cos(x) vs. Desarrollo de Taylor de orden 12`);
Por último, crearemos una animación para estudiar la aproximación de f por distintos desarrollos de Taylor:
> taylordisplay:=proc(func,xpoint,n::posint,xrange::range)
> local x,p,q,i;
> if type(xpoint,name) then x:=xpoint;
> elif type(xpoint,name=constant) then x:=lhs(xpoint);
> fi;
> p:=plots[display]([seq(plot(convert(taylor(func,xpoint,i),polynom),x=xrange,color=blue,args[5..nargs]),i=1..n)],insequence=true);
> q:=plot(func,x=xrange,color=red,args[5..nargs]);
> plots[display]([p,q]);
> end:
Veamos un par de ejemplos-animaciones. Una vez obtenido el output debemos pulsar sobre él y seleccionar el botón "Play" del menú de animaciones:
> taylordisplay(exp(x),x=0,10,-6..6);
> taylordisplay(sin(x),x=2*Pi,26,-3*Pi..3*Pi,view=-2..2);
>
Student Package
Este paquete permite mostrar paso a paso cómo se resuelven los distintos problemas matemáticos que se plantean a los alumnos:
Rectas tangentes
> restart;
> with(student);
La pendiente de la recta tangente a una curva en x=a se calcula como el límite del cociente incremental:
> f:=x->x^2+3;
> slope([x,f(x)],[a,f(a)]);
> Limit(%,x=a);
Para calcular el límite, en primir lugar debemos simplificar la expresión racional (dado que presenta una indeterminación), y luego realizar el límite:
> normal(%);
> value(%);
En el caso particular que queramos calcular la pendiente de la recta tangente a la curva dada por f en x=3, simplemente debemos sustituir en la expresión anterior a=3.
> subs(a=3,%);
Para mostrar gráficamente la tangente podemos usar el comando showtangent( ) :
> showtangent(f(x),x=3,x=0..4);
Ahora podríamos crear un programa que representara las rectas tangentes a f(x) en los puntos x= 0.8+0.2*i, cuando i toma valores enteros de 1 a 11. Usaremos el comando display con la opción insequence=true para obtener la animación:
> for i to 11 do
> p.i:=showtangent(f(x),x=0.8+0.2*i,x=0..4,colour=black) od:
Error, invalid left hand side in assignment (note that the concatenation operator is now || instead of .)
> plots[display]([p||(1..11)],insequence=true);
Error, (in plots[display]) invalid argument [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11] which must be a plot structure, or a list/set/array thereof
>
Área bajo la curva
El Student Package contiene un conjunto de funciones que pueden resultar útiles para el aprendizaje de Cálculo Infinitesimal por parte de los alumnos.
> restart;
> with(student);
Consideremos el área de la curva y=sin(x), de x=0.1 a x=1. Podemos aproximarla mediante 4 rectángulos usando la función leftbox (contenida en el Student Package).
> leftbox(sin(x),x=0.1..1,4);
La parte coloreada representa la aproximación al área bajo la curva. Si aumentamos el número de rectángulos (disminuyendo su base) parece ser que obtendremos mejores aproximaciones. Realicemos algunas pruebas:
> leftbox(sin(x),x=0.1..1,8);
> leftbox(sin(x),x=0.1..1,16);
Ahora realizaremos las aproximaciones numéricamente. Calcularemos la suma de las áreas de los rectángulos que hemos empleado en cada caso:
> leftsum(sin(x),x=0.1..1,4);
> value(%);
> leftsum(sin(x),x=0.1..1,8);
> value(%);
> leftsum(sin(x),x=0.1..1,16);
> value(%);
Veamos cómo varía el valor aproximado cuando aumentamos el número de rectángulos usados. Para ello usaremos un bucle:
> for k from 20 to 200 by 20 do
> print(evalf(leftsum(sin(x),x=0..1,k)));
> od;
Podemos observar cómo las sumas convergen hacia cierto valor 0.457... Calculemos el límite de la suma de rectángulos para un número indeterminado n de rectángulos:
> leftsum(sin(x),x=0.1..1,n);
> limit(%,n=infinity);
Para comprobar la bondad de esta aproximación, podemos calcular la integral de la curva desde 0.1 hasta 1:
> Int(sin(x),x=0.1..1);
> value(%);