Aritmética real y compleja

 

Para las operaciones aritméticas básicas los símbolos a emplear son

Maxima produce resultados exactos en sus cálculos, que, eventualmente, pueden aparecer escritos en forma simbólica.

  1. 3+5;
  2. 3-5;
  3. 2*55;
  4. 2 . 55;
  5. 6/3;
  6. 2^5;
  7. 2**5;
  8. 4!;
  9. sqrt(64);
  10. 1/3+1/7;
  11. (1+sqrt(2))^9;
  12. A:matrix([1,2],[3,4])$ B:matrix([5,6],[7,8])$ A.B;

 

indice

Valores racionales, decimales y precisión

Aunque Maxima prefiere los valores exactos a los decimales, también puede proporcionar valores numéricos decimales en lugar de números reales exactos. Esto puede conseguirse con ayuda de la variable booleana (sólo toma los valores true y false)

Esta variable toma dos valores: true y false. Al iniciar Maxima el valor es false, para producir resultados exactos. Para obtener decimales en una sentencia concreta cuyo resultado es numérico se añade al final de la misma el código ,numer. Pero si se desea que todos los resultados sean numéricos se asigna el valor true a la variable, pudiendo volver a false cuando se desee.

  1. 1/3+1/7;
  2. numer:true;
  3. 1/3+1/7;
  4. /* el valor por defecto es */ numer:false;
  5. 1/3+1/7;
  6. 1/3+1/7,numer;
  7. (1+sqrt(2))^9;
  8. (1+sqrt(2))^9,numer;

Una forma diferente para obtener valores decimales para alguna función es introducir el argumento de la misma como un decimal.

  1. 2*sqrt(2); devuelve 2^(3/2)
  2. 2*sqrt(2.0); devuelve 2.82842712474619
  3. Si n es un entero positivo random(n) genera aleatoriamente un entero m que es mayor o igual que cero y estrictamente menor que n
    3*random(2);
  4. Si al entero positivo n se le añade .0 (es decir se convierte en decimal) entonces random(n.0) genera aleatoriamente un decimal m que es mayor o igual que cero y estrictamente menor que n
    3*random(2.0);

Como ya hemos dicho, Maxima prefiere los números reales o racionales exactos a los decimales aproximados, hasta el punto de que, en sus operaciones internas, sustituye los números decimales en racionales advirtiendo al usuario y escribiendo en la salida a pantalla cada una de las sustituciones realizadas. Esto puede resultar muy molesto. Pero es posible suprimir esos mensajes de advertencia utilizando la variable booleana ratprint que por defecto tiene asignado el valor true.

Véalo en este ejemplo en el que Maxima calcula el rango de una matriz con asignaciones diferentes en ratprint.

  1. Crear una matriz /* creamos la matriz M */ M:matrix([2,1,1.5,2], [-4,2,-1,1],[5,1,1.5,4])$
    /* calculamos el rango de M */ rank(M);
  2. ratprint:false$
    /* volvemos a calcular el rango de M */ rank(M);

No olvide que cuando a una variable booleana (valores true, false) se le cambia el valor inicial por otro, el nuevo valor permanece activo hasta que se reinicia Maxima, o se vuelve a restituir al valor por defecto, que cuando estas notas se escribieron era ratprint:true. Si prefiere eliminar estos mensajes debe escribir al principio de su sesión ratprint:false

Con la configuración estándar de Maxima se muestran 15 decimales exactos, pero la precisión puede ser arbitraria.

Otros comandos que sirven también para ese propósito son los comandos de un argumento

Veamos unos ejemplos aclaratorios

  1. numer:false$ (1+sqrt(2))^9;
  2. numer:false$ (1+sqrt(2))^9,numer;
  3. numer:false$ float((1+sqrt(2))^9);
  4. numer:false$ bfloat((1+sqrt(2))^9);
  5. numer:false$ float(2/5);
  6. numer:false$ bfloat(2/5);

Analizando los resultados que proporciona Maxima queda claro que b3 significa que el número que aparece hay que multiplicarlo por 1000=10^3 y que b-1 significa que el número que aparece hay que multiplicarlo por 1/10= 10^(-1).

El número de digitos que Maxima utiliza en la aritmética con números decimales de punto flotante grandes (bfloat) se controla con el valor asignado a la variable numérica entera positiva

En los ejemplos que vienen a continuación, en primer lugar conocemos el valor actual de la variable (por defecto es 16) y luego modificamos dicho valor y vemos su efecto sobre float (ninguno) y sobre bfloat.

  1. fpprec;
  2. float(%pi);
  3. sqrt(2); sqrt(2),numer;
  4. %pi; %pi,numer;
  5. fpprintprec:3$ %pi; %pi,numer;
  6. bfloat(%pi);
  7. fpprec:50$ bfloat(%pi);
  8. fpprec:50$ float(%pi);

En el manual de Maxima puede encontrar más información. Concretamente para el tema que nos ocupa podemos ir directamente al apartado correspondiente de http://maxima.sourceforge.net/docs/manual/es/maxima.html. Estando conectado a internet, ésta y otras referencias análogas, funcionaban como debían en el momento de escribir estas notas, pero puede suceder que debido a cambios en el Manual de Maxima ya no funcionen, pero eso no es nunca un inconveniente serio pues buscando en índice de un manual más actualizado el comando "float" encontremos lo que buscamos. Alternativamente, se puede pedir directamente a Maxima la información usando para ello

? float;

Debe tenerse en cuenta que la utilización del comando fpprec establece un nuevo valor de la precisión con caracter global que permanece activa hasta una nueva utilización de dicho comando. Pero existe también la posibilidad de limitar la acción de éste y otros comandos haciendo uso comando block.

  1. fpprec:16$ bfloat(%pi);
  2. block([fpprec:50], bfloat(%pi));
  3. bfloat(%pi);

El comando block es una herramienta muy útil para múltiples propósitos: block. Cuando se escribieron estas notas el enlace era correcto; si ahora no lo es, lea en la terminal de xMaxima el resultado de la ejecución de

?? block;

 

indice

División entera

Además de las divisiones simbólicas y de las expresiones decimales para divisiones enteras es posible obtener cociente entero y el resto de una división entera mediante

Esto se aplica a divisiones numéricas y polinómicas.

  1. quotient(14,4); devuelve 3
  2. remainder(14,4); devuelve 2
  3. quotient(2*x^4-x^2+2*x-1,x^2-1); devuelve 2*x^2+1
  4. remainder(2*x^4-x^2+2*x-1,x^2-1); devuelve 2*x

 

indice

Números complejos

Maxima maneja números complejos escritos en la forma a+b*%i. Generalmente hace cálculo simbólico pero pueden utilizarse comandos específicos para producir los resultados deseados.

Algunas ilustraciones del funcionamiento de los comandos se muestran a continuación:

  1. (1+%i)^7 devuelve (%i+1)^7
  2. expand((1+%i)^7) devuelve 8-8*%i
  3. expand((3+2*%i)*(1+%i)^7) devuelve 40-8*%i
  4. expand(1/(1+%i)) devuelve 1/(%i+1)
  5. rectform(1/(1+%i)) devuelve 1/2-%i/2
  6. realpart(1/(2+%i))+%i*imagpart(3/(1+%i)) devuelve 2/5-(3*%i)/2
  7. polarform(1/(1+%i)) devuelve %e^(-(%i*%pi)/4)/sqrt(2)
  8. abs(1/(1+%i)) devuelve 1/sqrt(2)
  9. carg(1/(1+%i)) devuelve -%pi/4
  10. conjugate(a+b*%i) devuelve 2-%i*b

Vamos a demostrar, con ayuda de Maxima, el teorema del paralelogramo: en un paralelogramo la suma de los cuadrados de las longitudes de sus cuatro lados coincide con la suma de los cuadrados de las longitudes de sus diagonales.

Empezaremos por hacer una gráfica ilustrativa (un poco más complicada de las hasta ahora realizadas)

plot2d( [ [discrete, [ [0,0],[2,1],[3,4],[1,3],[0,0] ]], [discrete, [ [0,0], [3,4] ]], [discrete, [ [2,1], [1,3] ]] ], [legend,"","",""]);

A tal fin tomamos dos complejos genéricos. En el dibujo anterior serían z:2+%i w:1+3*%i

kill(all)$ z : a+b*%i; w : c+d*%i;

Calculamos la siguiente expresión que corresponde con la suma de los cuadrados de las longitudes de las diagonales del paralelogramo
expand( (w+z)*conjugate(z+w) + (w-z)*conjugate(w-z) )

Si ahora sumamos las longitudes al cuadrado de los cuatro lados y comparamos con lo anterior, la prueba está terminada.
(cabs(z))^2+ (cabs(w))^2+(cabs(z))^2+ (cabs(w))^2