============================================

  Sistemas de Computación Algebraica  

 como Ambientes de  Cálculo Científico

============================================

      Por Héctor Hernández                                                                                                         29/09/04                                        

>   

   Algebra Computacional ?

 En el campo de la computación científica los métodos y  herramientas de análisis numérico son tradicionalmente más comunes que los Sistemas  de Computación  Algebraica ( SCA ).

La expresión:  " cálculo por computadora  " generalmente se entiende como   Computación Numérica

                  - FORTRAN, Basic, C, C++, Java   => Precisión fija (Punto Flotante)                           

>   

Los SCA  son programas que pueden  operar con   símbolos  que  representan Objetos Matemáticos :

                  - Números (Enteros, racionales, reales, complejos...)

                  - Polinómios, Funciones Racionales, Sistemas de  Ecuaciones,

                  - Grupos, Anillos, Algebras . . .

>   

 Estas herramientas trabajan de la forma:

                           Input : solve(problema);

                          Output : respuesta

>   

         FORM, GAP, CAMAL, SHEEP, STENSOR, LiE, KANT

         Axiom, Derive, Reduce, Maple, MatLab, Mathematica, Macsyma, MuPAD

 Los Sistemas  de Computación  Algebraica (SCA).

 Propiedades de los SCA

  • Son programas   Interactivos
  • Precisión arimética arbitraria
  • Cálculos exactos  con expresiones matemáticas   simbólicas
  • Manipulación de expresiones y subexpresiones
  • Aproximación analítica y numérica
  • Extensión a la programación

>   

 Sistemas de Computación Algebraica Modernos de Propósito General

Un SCA  de propósito general es un ambiente completamente integrado de computación para la investigación y la educación:

  • Interfaz gráfica  (worksheet) o ambiente interactivo:              

     * Procesador de texto, de fórmulas y de gráficas.  

     * Con salidas en Latex, RTF, HTML, FORTRAN  y C; o hyperlinks a otros documentos.
     * Manuales en línea.
     * Enlaces a otros programas y bibliotecas

  • Capacidades para cálculo numérico
  • Capacidades para  visualización, con salidas gráficas en diferentes formatos: PostScript, GIF,JPG, . . .
  • Pensado para usuarios no especializados  en  computación.

>   

    Los más populares SCA  :

               Derive,   Reduce ,   Mathematica  ,   Axiom  ,   Maple,    MuPAD,    Matlab                   

>   

  Principal Ventaja:    

Enorme capacidad para realizar cálculos algebraicos largos y tediosos.

>   

Por ejemplo, demostrar que la función:

f = sin(n*z*sqrt(x^2+y^2+z^2)/sqrt(y^2+z^2))/sqrt(x^2+y^2+z^2)

es solución de la Ecuación Diferencial:

 

diff(f,`$`(x,4))+diff(f,`$`(x,2),`$`(y,2))+diff(f,`$`(x,2),`$`(z,2))+n^2*(diff(f,`$`(x,2))+diff(f,`$`(y,2))) = 0

Puede tomarle a un PC un tiempo de CPU relativamente corto:

                tiempo de cpu =  1,365 seg

>   

   Un Ejemplo: Maple  

MapleV  es una herramienta de computación científica con las siguientes caracteristicas generales:

        °   Manipulador Simbólico

        °   Gran colección de Funciones Numéricas

        °   Capacidad gráfica en 2D y 3D

        °   Lenguaje de programación Avanzada

        °   Sintaxis  similar al FORTRAN,  PASCAL o C

        °   Hoja de Cálculo y Editor de Texto con salidas en Latex y HTML

         °    Maple  está dispononible para  DOS,  Windows,  MacOS,  UNIX, Linux...
        
°    La gran ventaja : una hoja de cálculo puede ser  utilizada sobre cualquier plataforma  sin necesidad  de ser alterada.

>   

   1  Sintaxis Básica:

  1.-    Zona de Texto (En color Negro)

 2.-    Zona de comandos (En Color Rojo)  (Cada comando debe finalizar con    ;    o con  :   )

 3.-  Zona de respuestas (En color Azul)

>    25! + 13^23;

57265115456744102351045797

  Las líneas con comentarios se colocan a continuación del  símbolo  #

>    c^2  =  a^2 + b^2 ; # Teorema de Pitágoras

c^2 = a^2+b^2

El siguiente comando reinicia la hoja de cálculo

>    restart;

>   

   2  Primeros Pasos

Maple hace cálculos tanto con numeros enteros como   en Punto Flotante

>    15 + 5^20;

95367431640640

>    15. + 5^20;

.9536743164e14

Pero el énfasis radica en los cálculos  exáctos

>    cos(Pi/12)^2 + ln(2/3+5)/7;

cos(1/12*Pi)^2+1/7*ln(17/3)

>    evalf(%); # EVALuate using Floating-point

1.180812853

Con %  se puede utilizar la última salida de Maple  como entrada en el comando siguiente.

Existe un orden de precedencia para los  operadores:   + -  * /  ^

>    1+2*3^2;

19

>    (1+2)*3^2;

27

Por lo tanto, su uso descuidado produce errores  

>    2^3^5;

Error, `^` unexpected

>    (2^3)^5;

32768

>    2^-5;

Error, `-` unexpected

>    2^(-5);

1/32

Constantes numéricas y letras griegas.   Maple  hace distinción  entre mayúsculas y minúsculas

>    evalf(Pi);

3.141592654

>    evalf(pi);

pi

La precisión de su evaluación puede ser  controlada:

>    sqrt( 68 ); sqrt( 68. ); evalf(sqrt(68),50 );

2*17^(1/2)

8.246211251

8.2462112512353210996428197119481540502943984507472

Se puede redondear a una fracción

>    convert(%,fraction);

143649/17420

  El simbolo %  permite que la ultima salida se asigne a la nueva instrucción!

>    restart;

Para asignar un objeto a una variable se hace con el operador  :=

>    f := arctan( (2*x^2-1)/(2*x^2+1) );

f := arctan((2*x^2-1)/(2*x^2+1))

>    f;

arctan((2*x^2-1)/(2*x^2+1))

Mientras que el símbolo  = ,  se utliza para mostrar una relación entre variables

>    h = x + y;

h = x+y

>    h;

h

 Por lo tanto, existen nombres que ya estan definidos   y por lo tanto no puedes ser utilizados

>    abs:= f*sin(x);

Error, attempting to assign to `abs` which is protected

abs  es la función valor absoluto

>    abs(x-a);

abs(x-a)

>    restart;

   3  Cálculo Elemental

Se definen, se evalúan y se derivan funciones  abstractas

>    f:= (x,y) -> exp(x^2+y^2)/(x-y);

f := proc (x, y) options operator, arrow; exp(x^2+y^2)/(x-y) end proc

>    f(a^(1/2),b^(1/2));

exp(a+b)/(a^(1/2)-b^(1/2))

>    f(2,3);

-exp(13)

>    evalf(%);

-442413.3920

>    diff( f(x,y) , x) + diff( f(x,y) , y) ;

2*x*exp(x^2+y^2)/(x-y)+2*y*exp(x^2+y^2)/(x-y)

Conserva las expresiones para la derivada  interna

>    f:= (t,r) -> g(c*t+r) + h(c*t-r);

f := proc (t, r) options operator, arrow; g(c*t+r)+h(c*t-r) end proc

>    diff(f(t,r),t$3);

`@@`(D,3)(g)(c*t+r)*c^3+`@@`(D,3)(h)(c*t-r)*c^3

Para funciones compuestas se utiliza el operador @ y para derivar el operador   D

>    (cos@ln@sqrt)(x);

cos(ln(x^(1/2)))

>    D(cos@ln@sqrt)(x);

-1/2*sin(ln(x^(1/2)))/x

>    diff(cos(ln(sqrt(x))),x);

-1/2*sin(ln(x^(1/2)))/x

  Límites:

>    f:= (x) -> 1/(1+r/x)^x;

f := proc (x) options operator, arrow; 1/((1+r/x)^x) end proc

>    Limit(f(x),x=infinity) = limit(f(x), x=infinity);

Limit(1/((1+r/x)^x),x = infinity) = exp(-r)

Las mayúsculas a la izquierda (  Limit  ) proveen una representación del  Límite. Las minúsculas ( limit  ) su ejecución.

También podemos calcular límites a la  izquierda y a la derecha.

>    g:= (x)-> tan(x + Pi) ;

g := proc (x) options operator, arrow; tan(x+Pi) end proc

>    Limit(g(x), x=Pi/2,right)=limit(g(x),x=Pi/2,right);

Limit(tan(x),x = 1/2*Pi,right) = -infinity

Sumatorias:

>    Sum((1+i)/i^2, i = 1..n) ;

Sum((1+i)/i^2,i = 1 .. n)

>    value(%);

Psi(n+1)-Psi(1,n+1)+gamma+1/6*Pi^2

Si se tienen dudas se invoca la ayuda

>    ?gamma

>    ?Psi

Integración:

>    g:=(x)-> 1/( x*( b*x+c*x^2)^(1/2) );

g := proc (x) options operator, arrow; 1/(x*(b*x+c*x^2)^(1/2)) end proc

>    Int( g(x) , x ) = int( g(x) , x );

Int(1/(x*(b*x+c*x^2)^(1/2)),x) = -2/b/x*(b*x+c*x^2)^(1/2)

  Evalua integrales definidas tanto analítica como numéricamente

>    f:=(x)->  exp(Pi*x);

f := proc (x) options operator, arrow; exp(Pi*x) end proc

>    Int( f(x) , x=1..3) = int( f(x) , x=1..3);

Int(exp(Pi*x),x = 1 .. 3) = exp(Pi)*(-1+exp(2*Pi))/Pi

  Evalua integrales impropias y las funciones que de ella emergen

>    h:= (t)-> exp(-t)*t^(z-1);

h := proc (t) options operator, arrow; exp(-t)*t^(z-1) end proc

>    Int(h(t),t=0..infinity) = int(h(t),t=0..infinity);

Int(exp(-t)*t^(z-1),t = 0 .. infinity) = GAMMA(z)

>    ?GAMMA

>    GAMMA(0.5); # Funcion Gamma

1.772453851

>    Int(x/(x^2+2*x+2),x) = int(x/(x^2+2*x+2),x);

Int(x/(x^2+2*x+2),x) = 1/2*ln(x^2+2*x+2)-arctan(x+1)

Comprobemos que la  solucion es la correcta

>    diff(rhs(%),x);

1/2*(2*x+2)/(x^2+2*x+2)-1/(1+(x+1)^2)

>    simplify(%);

x/(x^2+2*x+2)

>    restart;

   4  Resolución de sistemas de ecuaciones algebraicas

Resuelve sistemas de ecuaciones algebráicas.  El resultado queda almacenado en una lista, y luego  hay que asignar esos valores al  "nombre" de las variables correspondientes para seguir operando.

>    ecu1:= R[1]*i[1]+R[3]*i[3]+R[4]*i[4]-V[1]=0;

ecu1 := R[1]*i[1]+R[3]*i[3]+R[4]*i[4]-V[1] = 0

>    ecu2:= R[2]*i[2]-V[2]-R[3]*i[3]=0;

ecu2 := R[2]*i[2]-V[2]-R[3]*i[3] = 0

>    ecu3:=  i[1]-i[2]-i[3]= 0;

ecu3 := i[1]-i[2]-i[3] = 0

>    solve({ecu1,ecu2,ecu3},{i[1],i[2],i[3]} ); assign(%);

{i[1] = -(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3]), i[3] = -1/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])*(R[1]*V[2]+R[2]*R[4]*i[4]-R[2]*V[1]), i[2] = (R[1]*V[2...
{i[1] = -(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3]), i[3] = -1/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])*(R[1]*V[2]+R[2]*R[4]*i[4]-R[2]*V[1]), i[2] = (R[1]*V[2...

>    i[1],i[2],i[3];

-(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3]), (R[1]*V[2]+V[2]*R[3]-R[3]*R[4]*i[4]+R[3]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3]), -1/(R[2]*R[1]+R[2]*R[3]+...

Ahora al evaluar  x, y, z en las  ecuaciones   ecu1 ... ecu3

>    ecu1; ecu2; ecu3;

-R[1]*(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])-R[3]/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])*(R[1]*V[2]+R[2]*R[4]*i[4]-R[2]*V[1])+R[4]*i[4]-V[1] = 0

R[2]*(R[1]*V[2]+V[2]*R[3]-R[3]*R[4]*i[4]+R[3]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])-V[2]+R[3]/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])*(R[1]*V[2]+R[2]*R[4]*i[4]-R[2]*V[1]) = 0

-(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])-(R[1]*V[2]+V[2]*R[3]-R[3]*R[4]*i[4]+R[3]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])+1/(R[2]*R[1]+R[2]*R[3]+R[1...
-(-V[2]*R[3]+R[3]*R[4]*i[4]-R[3]*V[1]+R[2]*R[4]*i[4]-R[2]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])-(R[1]*V[2]+V[2]*R[3]-R[3]*R[4]*i[4]+R[3]*V[1])/(R[2]*R[1]+R[2]*R[3]+R[1]*R[3])+1/(R[2]*R[1]+R[2]*R[3]+R[1...

>    simplify(ecu1); simplify(ecu2); simplify(ecu3);

0 = 0

0 = 0

0 = 0

Seguidamente procedemos a "limpiar" el contenido de las variables  para poder utilizarlas en otras expresiones.

>    i[1]:='i[1]';  i[2]:='i[2]';  i[3]:='i[3]';

i[1] := 'i[1]'

i[2] := 'i[2]'

i[3] := 'i[3]'

Soluciones aproximadas para encontrar las raíces de un polinomio

>    p:= x^3 - 3*x^2 = 17*x - 51;

p := x^3-3*x^2 = 17*x-51

>    sol:=solve(p,x);

sol := 3, 17^(1/2), -17^(1/2)

>    evalf(%);

3., 4.123105626, -4.123105626

>    q:= x^5 +3*x^4 - 6*x^3 + x^2 + 12*x - 14=0;

q := x^5+3*x^4-6*x^3+x^2+12*x-14 = 0

>    solve(q , x);

RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 1), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 2), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 3), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index...
RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 1), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 2), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 3), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index...
RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 1), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 2), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 3), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index...
RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 1), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 2), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 3), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index...
RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 1), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 2), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index = 3), RootOf(_Z^5+3*_Z^4-6*_Z^3+_Z^2+12*_Z-14,index...

>    ?RootOf

>    fsolve(q,x); # fsolve utiliza punto-flotante

-4.264823400, -1.539657626, 1.190651733

>    restart:

   5  Ecuaciones Diferenciales

>    ED1:=diff(y(x),x)+y(x)/x=alpha/(x*y(x)^2);

ED1 := diff(y(x),x)+y(x)/x = alpha/x/y(x)^2

>    dsolve(ED1,y(x));

y(x) = (x^3*alpha+_C1)^(1/3)/x, y(x) = (-1/2*(x^3*alpha+_C1)^(1/3)+1/2*I*3^(1/2)*(x^3*alpha+_C1)^(1/3))/x, y(x) = (-1/2*(x^3*alpha+_C1)^(1/3)-1/2*I*3^(1/2)*(x^3*alpha+_C1)^(1/3))/x
y(x) = (x^3*alpha+_C1)^(1/3)/x, y(x) = (-1/2*(x^3*alpha+_C1)^(1/3)+1/2*I*3^(1/2)*(x^3*alpha+_C1)^(1/3))/x, y(x) = (-1/2*(x^3*alpha+_C1)^(1/3)-1/2*I*3^(1/2)*(x^3*alpha+_C1)^(1/3))/x

>    sols:=dsolve({ED1,y(1)=5},y(x));

sols := y(x) = (x^3*alpha+125-alpha)^(1/3)/x

Resuelve ecuaciones diferenciales, con y sin  valores iniciales por varios métodos.  Series . . .

>    dsolve({ED1,y(1)=5},y(x),series);

y(x) = series(5+(-5+1/25*alpha)*(x-1)+(-1/3125*alpha^2+5)*(x-1)^2+(-1/3125*alpha^2+1/234375*alpha^3-5+1/75*alpha)*(x-1)^3+(2/234375*alpha^3+5-1/75*alpha-2/9375*alpha^2-2/29296875*alpha^4)*(x-1)^4+(2/23...
y(x) = series(5+(-5+1/25*alpha)*(x-1)+(-1/3125*alpha^2+5)*(x-1)^2+(-1/3125*alpha^2+1/234375*alpha^3-5+1/75*alpha)*(x-1)^3+(2/234375*alpha^3+5-1/75*alpha-2/9375*alpha^2-2/29296875*alpha^4)*(x-1)^4+(2/23...
y(x) = series(5+(-5+1/25*alpha)*(x-1)+(-1/3125*alpha^2+5)*(x-1)^2+(-1/3125*alpha^2+1/234375*alpha^3-5+1/75*alpha)*(x-1)^3+(2/234375*alpha^3+5-1/75*alpha-2/9375*alpha^2-2/29296875*alpha^4)*(x-1)^4+(2/23...

Sistemas de Ecuaciones Difereciales. Mediante transformaciones de Laplace. . .

>    sys:= diff(y(x),x)=z(x) , diff(z(x),x)=y(x);

sys := diff(y(x),x) = z(x), diff(z(x),x) = y(x)

>    fcns:={y(x),z(x)};

fcns := {y(x), z(x)}

>    s:=dsolve({sys,y(0)=0,z(0)=1},fcns,method=laplace);

s := {z(x) = cosh(x), y(x) = sinh(x)}

>    s[1]; # Selecciono una de las soluciones

z(x) = cosh(x)

Puedo tomar únicamente el lado derecho de la  solución para una posterior  manipulación

>    2*( rhs(s[1] )); # right hand sides

2*cosh(x)

  Ecuaciones diferenciales famosas:   Bessel

>    ED2:=x^2*diff(y(x),x$2)+x*diff(y(x),x)+(x^2-mu)*y(x)=0;

ED2 := x^2*diff(y(x),`$`(x,2))+x*diff(y(x),x)+(x^2-mu)*y(x) = 0

>    dsolve(ED2,y(x)); assign(%);

y(x) = _C1*BesselJ(mu^(1/2),x)+_C2*BesselY(mu^(1/2),x)

>    simplify(ED2);

0 = 0

Se  pueden hacer graficas para un conjunto de  condiciones  iniciales

>    y:=subs(mu=10, _C1=1/2, _C2=1/3 ,y(x));

y := 1/2*BesselJ(10^(1/2),x)+1/3*BesselY(10^(1/2),x)

>    plot(y, x=0..20,-2..1 ,title=`y(x)`);

[Maple Plot]

Soluciones Numéricas:

>    de1 :={diff(g(t),t$2)=-f(t)-g(t),diff(f(t),t$2)= diff(g(t),t)+f(t)};

de1 := {diff(g(t),`$`(t,2)) = -f(t)-g(t), diff(f(t),`$`(t,2)) = diff(g(t),t)+f(t)}

>    init1 := {g(0)=1, D(g)(0)=0, f(0)=0, D(f)(0)=1}:

>    F := dsolve(de1 union init1, {g(t),f(t)},type=numeric);

F := proc (x_rkf45) local res, data, vars, solnproc, outpoint, ndsol, i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; _EnvDSNumericSaveDigits := Digits; Digits := 15; if _En...

>    F(0.0);

[t = 0., f(t) = 0., diff(f(t),t) = 1., g(t) = 1., diff(g(t),t) = 0.]

>    F:=dsolve(de1 union init1,{g(t),f(t)},type=numeric,output=array([0,1,2,3,4]));

F := matrix([[vector([t, f(t), diff(f(t),t), g(t), diff(g(t),t)])], [matrix([[0., 0., 1., 1., 0.], [1., .966818091329165741, .876014924666769668, .382939951992786132, -1.29441467524315002], [2., 1.6139...

>    with(plots):

Warning, the name changecoords has been redefined

>    odeplot(F,[t,g(t)],1..10,labels=[t,g]);

[Maple Plot]

>    odeplot(F,[t,f(t)],1..10,labels=[t,f]);

[Maple Plot]

>    with(DEtools):

>    S:=cos(xi)*diff(h(xi),xi$3)-diff(h(xi),xi$2)+Pi*diff(h(xi),xi)=h(xi)-xi;

S := cos(xi)*diff(h(xi),`$`(xi,3))-diff(h(xi),`$`(xi,2))+Pi*diff(h(xi),xi) = h(xi)-xi

>    DEplot(S,h(xi),xi=-2.5..1.4,[[h(0)=1,D(h)(0)=2,(D@@2)(h)(0)=1]],h=-4..5,stepsize=.05);

[Maple Plot]

>    restart;

   6  Manipulación algebraica

Maple ,  automáticamente evalua y simplifica expresiones

>    p:=(a+b)^3*(a+b)^2;

p := (a+b)^5

>    expand(p);

a^5+5*a^4*b+10*a^3*b^2+10*a^2*b^3+5*a*b^4+b^5

>    factor(p);

(a+b)^5

>    t:=cos(x)^5+sin(x)^4+2*cos(x)^2-2*sin(x)^2-cos(2*x);

t := cos(x)^5+sin(x)^4+2*cos(x)^2-2*sin(x)^2-cos(2*x)

>    simplify(t);

cos(x)^4*(cos(x)+1)

>    r:=alpha*(x^3-y^3)/(beta*(x^2+x-y-y^2));

r := alpha*(x^3-y^3)/beta/(x^2+x-y-y^2)

>    normal(r);

(y^2+x*y+x^2)*alpha/(y+1+x)/beta

>    n:=numer(r); d:=denom(r);

n := alpha*(-x^3+y^3)

d := beta*(-x^2-x+y+y^2)

>    n*d*delta;

alpha*(-x^3+y^3)*beta*(-x^2-x+y+y^2)*delta

>    expand(%);

alpha*beta*delta*x^5+alpha*beta*delta*x^4-alpha*beta*delta*x^3*y-alpha*beta*delta*x^3*y^2-alpha*beta*delta*y^3*x^2-alpha*beta*delta*y^3*x+alpha*beta*delta*y^4+alpha*beta*delta*y^5

>    collect(%,x);

alpha*beta*delta*x^5+alpha*beta*delta*x^4+(-alpha*beta*delta*y-alpha*beta*delta*y^2)*x^3-alpha*beta*delta*y^3*x^2-alpha*beta*delta*y^3*x+alpha*beta*delta*y^4+alpha*beta*delta*y^5

>    coeff(%,x^3);

-alpha*beta*delta*y-alpha*beta*delta*y^2

>    factor(%);

-y*alpha*beta*delta*(1+y)

Puede convertir muchos tipos de expresiones en otras más especificas

>    expr1:=(a*x^2+b)/(x*(-3*x^2-x+4));

expr1 := (a*x^2+b)/x/(-3*x^2-x+4)

>    expr2:=convert(expr1,parfrac,x);

expr2 := 1/28*(-16*a-9*b)/(3*x+4)+1/7*(-a-b)/(x-1)+1/4*b/x

>    expr3:=sin(x)*cos(x);

expr3 := sin(x)*cos(x)

>    expr4:=convert(%,exp);

expr4 := -1/2*I*(exp(x*I)-1/exp(x*I))*(1/2*exp(x*I)+1/2*1/exp(x*I))

Se pueden  aislar los operandos de las expresiones

>    op(3,expr2); op(3,expr4);

1/4*b/x

1/2*exp(x*I)+1/2*1/exp(x*I)

>    op(3,expr2)*op(3,expr4);

1/4*b/x*(1/2*exp(x*I)+1/2*1/exp(x*I))

>    simplify(%);

1/4*b/x*cos(x)

No siempre todo funciona de la manera correcta. La siguiente intregal es trivial, pero veamos lo que sucede con Maple

>    Int(2*x*(x^2+1)^24,x);

Int(2*x*(x^2+1)^24,x)

>    value(%);

x^2+7084*x^38+19228*x^36+81719*x^32+653752/5*x^30+92*x^44+208012*x^26+208012*x^24+178296*x^22+653752/5*x^20+43263*x^16+19228*x^14+81719*x^18+x^48+12*x^46+7084*x^12+506*x^42+10626/5*x^40+10626/5*x^10+92...
x^2+7084*x^38+19228*x^36+81719*x^32+653752/5*x^30+92*x^44+208012*x^26+208012*x^24+178296*x^22+653752/5*x^20+43263*x^16+19228*x^14+81719*x^18+x^48+12*x^46+7084*x^12+506*x^42+10626/5*x^40+10626/5*x^10+92...
x^2+7084*x^38+19228*x^36+81719*x^32+653752/5*x^30+92*x^44+208012*x^26+208012*x^24+178296*x^22+653752/5*x^20+43263*x^16+19228*x^14+81719*x^18+x^48+12*x^46+7084*x^12+506*x^42+10626/5*x^40+10626/5*x^10+92...

>    factor(%);

1/25*x^2*(x^8+5*x^6+10*x^4+10*x^2+5)*(x^40+20*x^38+190*x^36+1140*x^34+4845*x^32+15505*x^30+38775*x^28+77625*x^26+126425*x^24+169325*x^22+187760*x^20+172975*x^18+132450*x^16+84075*x^14+43975*x^12+18760*...
1/25*x^2*(x^8+5*x^6+10*x^4+10*x^2+5)*(x^40+20*x^38+190*x^36+1140*x^34+4845*x^32+15505*x^30+38775*x^28+77625*x^26+126425*x^24+169325*x^22+187760*x^20+172975*x^18+132450*x^16+84075*x^14+43975*x^12+18760*...
1/25*x^2*(x^8+5*x^6+10*x^4+10*x^2+5)*(x^40+20*x^38+190*x^36+1140*x^34+4845*x^32+15505*x^30+38775*x^28+77625*x^26+126425*x^24+169325*x^22+187760*x^20+172975*x^18+132450*x^16+84075*x^14+43975*x^12+18760*...

>    factor(%+1/25);

1/25*(x^2+1)^25

>    restart;

   7  Bibliotecas

No todos los comandos son cargados en la memoria cuando Maple V  es iniciado. Sólo los comandos estandard son cargados automáticamente

>    P:=  x^5-24*x^4+85*x^3-108*x^2+166*x-120 ;

P := x^5-24*x^4+85*x^3-108*x^2+166*x-120

>    factor(P);

(x-20)*(x-1)*(x-3)*(x^2+2)

>    realroot(P);

[[0, 2], [2, 4], [16, 32]]

>    readlib(realroot):

>    realroot(P,1);

[[1, 1], [3, 3], [20, 20]]

Las Bibliotecas de Maple V :

   -   La biblioteca estandard

  - La biblioteca de misceláneos

  - Paquetes

>    ?index

>    ?index,packages

>    ?index,misc

>    restart:

   8  Graficos y Visualización

Una mayor capacidad grafica es obtenida con el paquete plots

>    with(plots);

Warning, the name changecoords has been redefined

[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...
[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...
[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...
[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...
[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...
[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, displ...

  Graficos básicos en 2 y 3 Dimensiones:

>    f:=x-> exp(-x^2)*sin(Pi*x^3);

f := proc (x) options operator, arrow; exp(-x^2)*sin(Pi*x^3) end proc

>    plot( f(x),x=-2..2,title=`f(x)`);

[Maple Plot]

>   

>    g:=(x,y)-> f(x)*f(y);

g := proc (x, y) options operator, arrow; f(x)*f(y) end proc

>    plot3d(g(x,y),x=-1..1,y=-1..1);

[Maple Plot]

>   

>    h:=(x) -> cos(sqrt(x^2+3*y^2))/(1+x^2/8);

h := proc (x) options operator, arrow; cos(sqrt(x^2+3*y^2))/(1+1/8*x^2) end proc

>    j:= (x) -> 1/3 -(2*x^2+y^2)/19;

j := proc (x) options operator, arrow; 1/3-2/19*x^2-1/19*y^2 end proc

>    plot3d({h(x),j(x)},x=-3..3,y=-3..3,title=`Interseccion de h(x) y j(x)`);

[Maple Plot]

Mapas Topol ó gicos

>    with(plots):

>    contourplot(sin(x*y),x=-10..10,y=-10..10);

[Maple Plot]

Graficando Campos Vectoriales :

>    phi[1]:=(x,y)->ln((x^2+2*x+1+y^2)^(1/2));

phi[1] := proc (x, y) options operator, arrow; ln((x^2+2*x+1+y^2)^(1/2)) end proc

>    phi[2]:=(x,y)->-ln((x^2-2*x+1+y^2)^(1/2));

phi[2] := proc (x, y) options operator, arrow; -ln((x^2-2*x+1+y^2)^(1/2)) end proc

>    fieldplot([phi[1](x,y),phi[2](x,y)],x=-2..2,y=-2..2,arrows=SLIM,grid=[8,8]);

[Maple Plot]

>    gradplot((-phi[1](x,y)-phi[2](x,y)),x=-2..2,y=-1..1,arrows=SLIM,grid=[10,10]);

[Maple Plot]

Animaciones:

>    animate3d(cos(sqrt(t*x^2+t*y^2)),x=-5..5,y=-5..5,t=1..8);

[Maple Plot]

Con un poco más de complejidad

>    tubeplot({[10*cos(t),10*sin(t),0,t=0..2*Pi,radius=2+cos(7*t),numpoints=120,tubepoint=24],[0,10+5*cos(t),5*sin(t),t=0..2*Pi,radius=1.5,numpoint=50,tubepoint=18]});

[Maple Plot]

>   

   9  Aplicaciones

  Algebra Lineal

>    restart:

>    with(linalg):# Leemos el paquete de A.L.

Warning, the protected names norm and trace have been redefined and unprotected

>   

Creando Matrices  y  Vectores

>    A:=array( [ [a, b, c], [d, e, f ], [g, h, i ] ] );

A := matrix([[a, b, c], [d, e, f], [g, h, i]])

>    B:=array(antisymmetric,1..3,1..3):

>    B[1,2]:=x+a; B[1,3]:=y+b; B[2,3]:=z+c;

B[1,2] := x+a

B[1,3] := y+b

B[2,3] := z+c

>    print(B);

matrix([[0, x+a, y+b], [-x-a, 0, z+c], [-y-b, -z-c, 0]])

>    v:= vector([1,2,3] );

v := vector([1, 2, 3])

>    C:=matrix(4,4, (i,j) -> i^(j-1));

C := matrix([[1, 1, 1, 1], [1, 2, 4, 8], [1, 3, 9, 27], [1, 4, 16, 64]])

>    M:=array(antisymmetric,1..3,1..3):

>    entermatrix(M);

enter element 1,2 >    2*alpha;

2*alpha

>    2*beta;

2*beta

>    2*gamma:

>    N:=diag(mu,nu,lambda);

N := matrix([[mu, 0, 0], [0, nu, 0], [0, 0, lambda]])

>    G:=diag(M,N);

G := matrix([[0, 2*alpha, 2*beta, 0, 0, 0], [-2*alpha, 0, 2*gamma, 0, 0, 0], [-2*beta, -2*gamma, 0, 0, 0, 0], [0, 0, 0, mu, 0, 0], [0, 0, 0, 0, nu, 0], [0, 0, 0, 0, 0, lambda]])

>   

  La función "solve" para resolver un sistema  de  ecuaciones:

>    ec1:= (c^2-1)*x+(c-1)*y = (1-c)^2 ;

ec1 := (c^2-1)*x+(c-1)*y = (1-c)^2

>    ec2:=(c-1)*x+(c^2-1)*y=c-1;

ec2 := (c-1)*x+(c^2-1)*y = c-1

>    sis:=({ec1,ec2}):

>    solve(sis,{x,y});

{y = 2/c/(c+2), x = (c^2-2)/c/(c+2)}

>   

Algebra de matrices para resolver el sistema  de ecuaciones

>    H:=genmatrix(sis,[x,y],'flag');

H := matrix([[c^2-1, c-1, (1-c)^2], [c-1, c^2-1, c-1]])

>    A:=genmatrix(sis,[x,y]);

A := matrix([[c^2-1, c-1], [c-1, c^2-1]])

>    B:=delcols(H,1..2);

B := matrix([[(1-c)^2], [c-1]])

  La ecuacion A X = B  se puede resolver con:

>    sol:= linsolve(A,B);

sol := matrix([[(c^2-2)/c/(c+2)], [2/c/(c+2)]])

>    x:=sol[1,1]; y:=sol[2,1];

x := (c^2-2)/c/(c+2)

y := 2/c/(c+2)

>    simplify(ec1); simplify(ec2);

1-2*c+c^2 = (c-1)^2

c-1 = c-1

>    x:='x': y:='y': # Limpio las variables x y

>   

Operaciones con matrices

>    S:=evalm(M+N);

S := matrix([[mu, 2*alpha, 2*beta], [-2*alpha, nu, 2*gamma], [-2*beta, -2*gamma, lambda]])

>    evalm(3*M + 5/3*N);

matrix([[5/3*mu, 6*alpha, 6*beta], [-6*alpha, 5/3*nu, 6*gamma], [-6*beta, -6*gamma, 5/3*lambda]])

>    evalm(M*N);

Error, (in evalm/evaluate) use the &* operator for matrix/vector multiplication

>    evalm(M &* N);

matrix([[0, 2*alpha*nu, 2*beta*lambda], [-2*alpha*mu, 0, 2*gamma*lambda], [-2*beta*mu, -2*gamma*nu, 0]])

>    evalm(N &* M);

matrix([[0, 2*alpha*mu, 2*beta*mu], [-2*alpha*nu, 0, 2*gamma*nu], [-2*beta*lambda, -2*gamma*lambda, 0]])

>    V:= vector([x,y,z]);

V := vector([x, y, z])

>    evalm(M &* V);

vector([2*alpha*y+2*beta*z, -2*alpha*x+2*gamma*z, -2*beta*x-2*gamma*y])

>    S1:= evalm( (M)^(3) );

S1 := matrix([[0, 2*(-4*alpha^2-4*beta^2)*alpha-8*alpha*gamma^2, 2*(-4*alpha^2-4*beta^2)*beta-8*beta*gamma^2], [-2*(-4*alpha^2-4*gamma^2)*alpha+8*alpha*beta^2, 0, -8*beta^2*gamma+2*(-4*alpha^2-4*gamma^...

>    S1:= map(factor,S1);

S1 := matrix([[0, -8*alpha*(alpha^2+beta^2+gamma^2), -8*beta*(alpha^2+beta^2+gamma^2)], [8*alpha*(alpha^2+beta^2+gamma^2), 0, -8*gamma*(alpha^2+beta^2+gamma^2)], [8*beta*(alpha^2+beta^2+gamma^2), 8*gam...

>    print(S);

matrix([[mu, 2*alpha, 2*beta], [-2*alpha, nu, 2*gamma], [-2*beta, -2*gamma, lambda]])

>    zeta:=inverse(S);

zeta := matrix([[(nu*lambda+4*gamma^2)/(mu*nu*lambda+4*mu*gamma^2+4*alpha^2*lambda+4*beta^2*nu), -2*(alpha*lambda+2*beta*gamma)/(mu*nu*lambda+4*mu*gamma^2+4*alpha^2*lambda+4*beta^2*nu), 2*(2*alpha*gamm...

>    map(simplify,evalm(S &*  zeta));

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

>    trace(zeta);

(nu*lambda+4*gamma^2)/(mu*nu*lambda+4*mu*gamma^2+4*alpha^2*lambda+4*beta^2*nu)+(mu*lambda+4*beta^2)/(mu*nu*lambda+4*mu*gamma^2+4*alpha^2*lambda+4*beta^2*nu)+(mu*nu+4*alpha^2)/(mu*nu*lambda+4*mu*gamma^2...

>    det(zeta);

1/(mu*nu*lambda+4*mu*gamma^2+4*alpha^2*lambda+4*beta^2*nu)

>    normal( trace(zeta) / det(zeta) );

nu*lambda+4*gamma^2+mu*lambda+4*beta^2+mu*nu+4*alpha^2

>   

Cálculo de Autovectores y Autovalores

>    K:=matrix([[sqrt(2),alpha,beta],[alpha,sqrt(2),alpha],[beta,alpha,sqrt(2)]]);

K := matrix([[2^(1/2), alpha, beta], [alpha, 2^(1/2), alpha], [beta, alpha, 2^(1/2)]])

>    pc:=charpoly(K, lambda); # Polinomio Caracteristico

pc := lambda^3-3*lambda^2*2^(1/2)+6*lambda-2*alpha^2*lambda-2*2^(1/2)+2*2^(1/2)*alpha^2-2*alpha^2*beta-beta^2*lambda+beta^2*2^(1/2)

>    factor(%);

(-lambda^2+2*lambda*2^(1/2)+beta*lambda-2-beta*2^(1/2)+2*alpha^2)*(2^(1/2)-beta-lambda)

>    solve(pc=0,lambda);

1/2*beta+2^(1/2)+1/2*(beta^2+8*alpha^2)^(1/2), 1/2*beta+2^(1/2)-1/2*(beta^2+8*alpha^2)^(1/2), 2^(1/2)-beta

>    eigenvals(K);

1/2*beta+2^(1/2)+1/2*(beta^2+8*alpha^2)^(1/2), 1/2*beta+2^(1/2)-1/2*(beta^2+8*alpha^2)^(1/2), 2^(1/2)-beta

>    eigenvects(K);

[1/2*beta+2^(1/2)+1/2*(beta^2+8*alpha^2)^(1/2), 1, {vector([1/2*(1/2*beta+1/2*(beta^2+8*alpha^2)^(1/2))/alpha, 1, 1/2*(1/2*beta+1/2*(beta^2+8*alpha^2)^(1/2))/alpha])}], [1/2*beta+2^(1/2)-1/2*(beta^2+8*...
[1/2*beta+2^(1/2)+1/2*(beta^2+8*alpha^2)^(1/2), 1, {vector([1/2*(1/2*beta+1/2*(beta^2+8*alpha^2)^(1/2))/alpha, 1, 1/2*(1/2*beta+1/2*(beta^2+8*alpha^2)^(1/2))/alpha])}], [1/2*beta+2^(1/2)-1/2*(beta^2+8*...

 El resultado es una lista de la forma:

                      [ e_i, m_i,  {  v[1,i],... v[n_i,i] }  ]

donde:

                e_i = son los autovalores
    m_i = multiplicidad
            {v[1,i], ..., v[n_i,i]}  = conjunto de vectores bases

>    print(K);

matrix([[2^(1/2), alpha, beta], [alpha, 2^(1/2), alpha], [beta, alpha, 2^(1/2)]])

>   

Solución  de B x = v  mediante Gauss-Jordan

>    B:=matrix(3,3,[19,-50,88,  53,85,-49, 78, 17, 72] );

B := matrix([[19, -50, 88], [53, 85, -49], [78, 17, 72]])

>    v1:= vector( [3 ,5,-2] ):

>    v2:= vector( [4 ,-5,9] ):

>    v3:= vector( [21 ,4,7] ):

>    augment(B,v1,v2,v3 );

matrix([[19, -50, 88, 3, 4, 21], [53, 85, -49, 5, -5, 4], [78, 17, 72, -2, 9, 7]])

Construimos la matriz aumentada, e invocamos la solución

>    gaussjord(%);

matrix([[1, 0, 0, 56399/9855, -42938/9855, 43729/3285], [0, 1, 0, -20528/3285, 15761/3285, -15913/1095], [0, 0, 1, -46832/9855, 36584/9855, -35782/3285]])

>    leastsqrs(B, v1); leastsqrs(B, v2);leastsqrs(B, v3);

vector([56399/9855, -20528/3285, -46832/9855])

vector([-42938/9855, 15761/3285, 36584/9855])

vector([43729/3285, -15913/1095, -35782/3285])

  Funciones test

>    beta := sqrt(2)*sqrt(5-sqrt(5));

beta := 2^(1/2)*(5-5^(1/2))^(1/2)

>    A:= matrix([[(sqrt(5)+beta +1)/4, -beta/2 ],[ beta/4 ,( sqrt(5) - beta+1)/4]]);

A := matrix([[1/4*5^(1/2)+1/4*2^(1/2)*(5-5^(1/2))^(1/2)+1/4, -1/2*2^(1/2)*(5-5^(1/2))^(1/2)], [1/4*2^(1/2)*(5-5^(1/2))^(1/2), 1/4*5^(1/2)-1/4*2^(1/2)*(5-5^(1/2))^(1/2)+1/4]])

>    B:=matrix( [[(sqrt(5)+1)/4,-beta/4 ],[ beta/4,(sqrt(5)+1)/4 ]  ]);

B := matrix([[1/4*5^(1/2)+1/4, -1/4*2^(1/2)*(5-5^(1/2))^(1/2)], [1/4*2^(1/2)*(5-5^(1/2))^(1/2), 1/4*5^(1/2)+1/4]])

 Queremos verificar si A y B son similares, es decir,  si existe una  matriz T, no singular, de manera que  

   B = T A T^(-1).

>    issimilar(A,B,'T');

true

>    map(simplify,T);

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

>   

Cálculo Vectorial.

Gradiente

>    f:= 4*x*y*z - 5*y*x^3;

f := 4*x*y*z-5*y*x^3

>    gradf:= grad(f,[x,y,z]);

gradf := vector([4*y*z-15*y*x^2, 4*x*z-5*x^3, 4*x*y])

Vectores

>    v:=vector([4*x-3*x^3*y,7*x*y*z^2+5*y^3,4*x^2*y^2+2*x]);

v := vector([4*x-3*y*x^3, 7*x*y*z^2+5*y^3, 4*x^2*y^2+2*x])

Rotores

>    curlv:= curl(v,[x,y,z] );

curlv := vector([8*y*x^2-14*x*y*z, -2-8*x*y^2, 7*y*z^2+3*x^3])

Jacobianos

>    jacobian(%,[x,y,z]);

matrix([[16*x*y-14*y*z, 8*x^2-14*x*z, -14*x*y], [-8*y^2, -16*x*y, 0], [9*x^2, 7*z^2, 14*y*z]])

Laplacianos

>    laplacf:= laplacian(f,[x,y,z] );

laplacf := -30*x*y

Evaluación boleana de expresiones

>    evalb(laplacf = diverge(gradf,[x,y,z]));

true

Diferentes tipos de coordenadas

>    f := r*sin(theta)*z^2:  v := [r, theta, z]:

>    gr:=grad(f, v, coords=cylindrical);

gr := vector([sin(theta)*z^2, cos(theta)*z^2, 2*r*sin(theta)*z])

>    diverge(gr,v, coords=spherical);

1/r*(sin(theta)^2*z^2+cos(theta)^2*z^2+2*r*sin(theta))/sin(theta)

>    laph= laplacian(f,v);

laph = -r*sin(theta)*z^2+2*r*sin(theta)

>    laph= laplacian(f,v,coords=bipolarcylindrical);

laph = (cosh(theta)-cos(r))^2*(-r*sin(theta)*z^2+2/(cosh(theta)-cos(r))^2*r*sin(theta))

>    ?coords

>   

 

  

 10 Procesos en UNIX

nodo5%> maple

        | \ ^ / |              Maple 9  (IBM INTEL LINUX)

._ | \ |        | / | _.     Copyright (c) 2002 by Waterloo Maple Inc.
    \  MAPLE  /          All rights reserved. Maple is a registered trademark of

  <____ ____>        Waterloo Maple Inc.
            |                  Type ? for help.

>  evalf(sqrt(Pi),100);

1.7724538509055160272981674833411451827975494561223871282138077898529112845\
    91032181374950656738544665

> Int( tan(x), x ) = int( tan(x), x );

                             /
                           |
                           |  tan(x) dx = -ln(cos(x))
                           |
                          /

>   

nodo5%> maple < archimap.txt

Con esta instrucción   Maple   ejecutará todos los comandos que se encuentran en el archivo archimap.txt

>   

nodo5%> maple < archimap.txt > archimap.out

>   

nodo5%> maple < archimap.txt | more

>   

nodo5%> maple -q < archimap > archimap.out

^Z
Suspended
nodo5%> bg
[2] maple -q < archimap > archimap.out &

nodo5%>

>   

>   

============================================