Transformaciones algebraicas: desarrollar, simplificar, evaluar, sustituir...

 

Maxima puede realizar operaciones algebraicas conceptualmente simples (multiplicar expresiones, factorizar, simplificar, sustituir, evaluar...) pero cuyo cálculo puede resultar tedioso para humanos. En este apartado describimos los comandos que permiten realizar las operaciones algebraicas usuales como desarrollar productos de sumas o potencias de sumas, simplificar funciones racionales, factorizar polinómios, hacer sustituciones formales en una expresión o evaluar una expresión, por ejemplo, asignando valores a algunos de los parámetros de la misma. También explicamos comandos para calcular el máximo común divisor y el mínimo común múltiplo de polinomios, realizar divisiones enteras de polinomios, realizar desarrollos o simplificaciones de expresiones trigonométricas o logarítmicas, eliminar varias entre varias ecuaciones, incluso realizar descomposiciones en fracciones simples.

Desarrollar, simplificar con wxmaxima

 

indice

Desarrollar

Los comandos expand y ratexpand sirven para efectuar el desarrollo de expresiones algebraicas, tales como elevar a una potencia, multiplicar polinomios o fracciones polinómicas.

  1. r:(x^2+1)^2+(x-1)^5-2*(x-3)/(1+(x+2)^5);
  2. expand(r);
  3. expand(r,2,0);
  4. r: (x - 1)/(x + 1)^2 + 1/(x - 1);
  5. expand(r);
  6. ratexpand(r);

El comando expand también se puede aplicar al desarrollo de expresiones trigonométricas en las que aparecen senos y cosenos de sumas de ángulos, de productos de ángulos por un número, o del ángulo mitad. Para mejorar el control en los desarrollos se dispone de las siguientes variables lógicas.

  1. trigexpandplus; trigexpandtimes; halfangles;
  2. expand( sin(x+y)+ cos(2*x)-sin (1/2*x) );
  3. trigexpand:true$ expand( sin(x+y)+ cos(2*x)-sin (x/2) );
  4. halfangles:true$ expand( sin(x+y)+ cos(2*x)-sin (x/2) );
  5. trigexpand:true$ expand( tan(x+y) );
  6. trigexpand:false$ trigsign:true$ trigexpand( tan(x-y) );
  7. expand( trigreduce( sin(x)^2+ cos(x)^2 ) );

En el caso de los logaritmos también se dispone de variable lógica para controlar el desarrollo de los mismos

logexpand:super$ log(x^y); log(x*y); log(%e^1/y)

Otra herramienta útil para el cálculo manual de primitivas es la descomposición en fracciones simples

partfrac(1/((x+1)^2*(x^2+x+1)),x);

 

indice

Evaluar y sustituir

Uno de los comandos más potentes y versatiles de Maxima que permite evaluar expresiones es

En el primer ítem se muestra la sintaxis general, tanto para evaluaciones globales como para otras limitadas a ciertas subexpresiones o grupos. En el segundo ítem se muestra una sintaxis alternativa aplicable en evaluaciones globales.

  1. f(x):=cos(x)$ ev(f(x),x=0);
  2. x^2 - %pi/2+ev(atan(x),x=1);
  3. ev(sin(1),numer);
  4. x**3-2*x**2-747-sqrt(y),x=54,y=2;

La siguiente secuencia de evaluaciones realizadas a partir de una primera expresión le ayudará a comprender el funcionamiento.

  1. EC : sin(x)+cos(y)+(w+1)**2+'diff(sin(w),w);
    A la expresi&ioacute;n le asignamos el nombre EC
  2. ev(EC,diff);
    Ejecutamos el cálculo la derivada indicada en EC.
  3. ev(EC,expand);
    Desarrollamos la potencia indicada en EC
  4. ev(EC,expand,diff);
    Las dos evaluaciones anteriores a la vez
  5. ev(EC,expand,diff,x=2,y=1);
    Y ahora cuatro evaluaciones al mismo tiempo

El Argumento nouns en un comando ev tiene el efecto de evaluar las formas nominales (comandos no desarrollados).

  1. f(x):='integrate(x^2+ 1,x)+'diff(log(1+x^2),x);
    Definimos una función que contiene formas nominales, es decir, comandos que no se expanden; en este caso, son integrales y derivadas
  2. ev(f(x),nouns)
    Evaluamos todas las formas nominales

Pueden realizarse sustituciones formales en expresiones utilizando los siguientes comandos:

El Original que es reemplazado por un Sustituto debe ser un "átomo" o bien un "grupo completo" de Expresión; así, por ejemplo, en la expresión 2*(x+y+z)/w, x+y+z constituye un grupo mientras que x+y no.

  1. subst(v,x+y+z,2*(x+y+z)^(a+b));
    De las tres primeras es, para mi, la menos sencilla de recordar al hacer substituciones
  2. subst(x+y+z=v,2*(x+y+z)^(a+b));
    Esta sintaxis me resulta más fácil de recordar
  3. subst([x+y+z=v, a+b=w],2*(x+y+z)^(a+b));
    De este modo hacemos varias sustituciones simultáneas usando una lista para las mismas
  4. subst(x=0,diff(sin(x),x,3));
    En la tercera derivada del seno, substituimos x por 0
  5. at(2*(x+y+z)^w, x+y+z=v);
  6. at(2*(x+y+z)^w,[x+y+z=v, w=a+b]);
  7. kill(f)$ at('integrate(f(x),x,a,b),[a=0,b=1]);
  8. Como se aprecia, la sintaxis de at es diferente, pero la funcionalidad es la misma que la de subst
  9. atvalue (f(x,y), [x = 0, y = 1], a^2);

El comando ev también permite realizar substituciones. Alguna de las anteriores las hacemos con ev

  1. ev(2*(x+y+z)^w, x+y+z=v);
  2. ev(2*(x+y+z)^w, x+y+z=v, w=p+q);

Si ejecuta el código que sigue obtendrá más ejemplos en la ventana de la consola (preste atención para responder a la pregunta que se le hace)

example(subst);

 

indice

Factorizar

Para realizar la operación inversa de desarrollar una expresión polinómica se utiliza el comando

que factoriza la Expresión, conteniendo cualquier número de variables o funciones, en factores irreducibles sobre los enteros.

  1. expand( (x-6)^5*(x+1)^3*(x^2+1) );
  2. factor( % );
  3. factor( x^4-1 );
  4. factor( 2^63-1 );

Pero el comando tiene sus limitaciones...

factor( x^4+1 );

 

indice

Simplificar expresiones racionales

Los dos comandos que siguen sirven para ese propósito. El segundo de ellos es como un reforzamiento del primero, pues en ocasiones es necesario reiterar varias veces el primero hasta conseguir la simplificación óptima, esa es la función que automáticamente realiza el segundo.

  1. ratsimp( (x^4-1)/(x^2 -1) );
  2. ratsimp( (x^(A/2)+1)^2*(x^(A/2)-1)^2/(x^A-1) );
    Para ir más lejos se requiere una nueva actuación
  3. ratsimp( % );
  4. fullratsimp( (x^(A/2)+1)^2*(x^(A/2)-1)^2/(x^A-1) );
    Con este comando se ha conseguido el objetivo en un s&ioacute;lo paso

En el ejemplo siguiente realizamos la derivada de una primitiva y no queda claro que se recupere el valor inicial. Pero fullratsimp zanja la cuestión

  1. diff(integrate(1/(x^3 + 1), x), x);
  2. fullratsimp(%);

Otro ejemplo

  1. kill(all) $ fullratsimp(sqrt(x^2));
  2. kill(all) $ assume (x>0) $ fullratsimp(sqrt(x^2));

 

indice

División entera

El cociente y el resto de una división entera (entre números enteros o entre polinomios) puede obtenerse mediante

El resultado es una lista en la que el primer elemento es el cociente y el segundo el resto. Algunos ejemplos:

  1. divide( 7, 2 );
    El cociente es 3 y el resto 1
  2. divide( (x^2-1), (x-1) );
    El cociente es x+1 y el resto 0
  3. divide( x^3-1, x^2-1 );
  4. Resultado: divide( x^5-2*x^2+x-1, x^2+1 ); cociente:Resultado[1]; resto:Resultado[2]; divisor:x^2+1; cociente*divisor+resto; expand(%);
    En este ejemplo el "Resultado" es una lista con dos elementos: a los que llamamos respectivamente "cociente" y "resto". A continuación efectuamos la comprobación de que "cociente*divisor+resto=cociente*Polinomio2+resto" coincide con "Polinomio1"

 

indice

Simplificar expresiones trigonométricas

El objetivo aquí es justamente el opuesto de desarrollar (expand) expresiones trigonométricas. Es un proceso más complicado y para tratar de llevarlo a cabo, Maxima implementa tres comandos

  1. trigsimp(sin(x)^2 + cos(x)^2);
  2. (1-cos(x))*(1+cos(x)); expand(%); trigsimp(%); trigreduce(%,x);
  3. trigsimp(sin(y) / sqrt( (1-sin(y))*(sin(y)+1) ));
  4. trigsimp(cos(x)^4-sin(x)^4); trigreduce(%); trigrat(%);
  5. trigexpand:false$ trigreduce(cosh(x)^4-sinh(x)^4); expand(%);

 

indice

Simplificar expresiones logarítmicas

Maxima también dispone de herramientas para tratar de hacer el proceso inverso al de transformar en sumas el logaritmo del producto y otros similares

2*(A*log(X) - 3*B*log(Y)); logcontract(%);

Obsérvese que únicamente los enteros 2 y 3 han sido convertidos en potencias, mientras que A y B no lo han sido. Esa es la forma de operar por defecto. Pero podemos conseguir que A y B también se conviertan en potencias declarándolos como enteros (localmente en este caso)

block( declare(A,integer), declare(B,integer), logcontract(2*(A*log(X) - 3*B*log(Y))) );

 

Otros comandos para simplificar

Como hemos ido viendo hay gran variedad de comandos y variables lógicas para desarrollar, contraer o simplificar diferentes tipos de expresiones. En algunos casos no es evidente el significado de "simplificar" y el comando logcontract es un buen ejemplo de ello. A veces el resultado deseado se obtiene tras la utilización de varios comandos. Incluimos aquí un nuevo comando que también puede ser de utilidad para realizar este tipo de transformaciones algebraicas.

Pero el sentido que se asigna a "simplificar" no resulta trasparente, como muestran los ejemplos que siguen y en los que aparecen en la propia ayuda en línea del comando.

  1. kill(all)$ log(%e^2/y); radcan(log(%e^2/y));
  2. log(x^a/y^b); radcan(%);
  3. cos(x+y); radcan(%);
  4. cos(x)*cos(y)-sin(x)*sin(y); radcan(%);
  5. log(1+2*a^x+a^(2*x)) / log(1+a^x); radcan(%);
  6. log(1+2*a^x+a^(2*x)) / log(1+a^x); fullratsimp(%);
  7. diff(sqrt(cos(x)), x, 2); radcan(%);
  8. diff(sqrt(cos(x)), x, 2); fullratsimp(%);
  9. (x^(A/2)+1)^2*(x^(A/2)-1)^2/(x^A-1); radcan(%);
  10. Observe que comportamiento tan curioso, comparando con el precedente.
    (x^(a/2)+1)^2*(x^(a/2)-1)^2/(x^a-1); radcan(%);
  11. (x^(A/2)+1)^2*(x^(A/2)-1)^2/(x^A-1); fullratsimp(%);
  12. radcan((1+x+x^2)^3);
  13. radcan(1+2*x+x^2);

A modo de resumen: hay varios comandos que pueden utilizarse para desarrollar, contraer o simplificar expresiones algebraicas, trigonométricas y logaritmicas, pero dependiendo del objetivo que se pretenda conseguir habrá que experimentar el resultado de la acción de los comandos sobre ellas.

 

Conviene no olvidar que, en algún caso, puede ocurrir que Maxima no haga lo que usted desearía que hiciera. Y los ejemplos que siguen son autoexplicativos

  1. sqrt(a)*sqrt(b); expand(%); ratexpand(%); factor(%); ratsimp(%); fullratsimp(%);
    El resultado siempre es el mismo: sqrt(a) sqrt(b)
  2. sqrt(a*b); ratexpand(%);
    Lo mismo ocurre en este caso: sqrt(a b)
  3. asin( sin(y) ); trigsimp(%); trigreduce(%);

No obstante, en otras ocasiones, el comportamiento de estos comandos resulta más previsible:

(1-cos(x))*(1+cos(x)); expand(%); trigsimp(%); trigreduce(%,x);

La interfaz de wxMaxima tiene implementados en sus menús algunos de los comandos anteriores

 


Ap_DesarrollarSimplificar.wxmx