## Algunas cuentas con funciones conocidas

sqrt(3),numer; 
entier(sqrt(3));
entier(-sqrt(3));
round(sqrt(3)); 
abs(1+%i); 
abs(entier(-sqrt(3)));
random(6);          /* puede producir cualquier entero entre 0 y 6 */
random(10.0);       /* puede producir cualquier número decimal entre 0 y 10 */
sqrt(x^2);
factor(120);
divisors(120);
polarform(1/2+\sqrt(3)/2*%i);
rectform(%e^(%pi*%i/3));
sin(%pi/6);

## Algunas cuentas con polinomios

load(functs);

gcd( (x+1)*(x-1)^2*(x^2+1),   x^2+2*x+1);    /* Máximo común divisor */

lcm( (x+1)*(x-1)^2*(x^2+1),   x^2+2*x+1 );   /* Mínimo común múltiplo */

divide( x^4-x^3+7*x^2-1,   x^2+2*x+1, x );   /* División entera */;

## Definir y utilizar nuevas funciones

F1(x):=x^2+1;

F1(3);

wxplot2d(F1(x),[x,-1,1]);

kill(F2)$ F2(x,y):=x^2-y^2;

wxplot3d(F2(x,y),[x,-1,1],[y,-1,1]);

### Hay otras formas de definir funciones:
parecen equivalentes, pero no lo son

kill(f,g,h,k)$          /* matamos las funciones a definir, por seguridad */

expr : cos(y) - sin(x); /* esto es una asignación */
    
f(x,y):=expr;

f(%pi/2,%pi);

Como se aprecia,  f(x,y):=expr   no interpreta la asignación.
No obtenemos lo que pensábamos que obtendríamos    

define(g(x,y),expr);

g(%pi/2,%pi);

Ahora sí hemos obtenido lo esperado.
También lo obtenemos si no utilizamos el intermediario  expr  
o si forzamos el que se evalue expr  

h(x,y):=cos(y) - sin(x); 
    
h(%pi/2,%pi);
    

k(x,y):=ev(expr); 
    
k(%pi/2,%pi);

kill(all)$
f(x):=cos(x);
g(x):=diff(f(x),x);
g(x);
g(0);

kill(all)$
f(x):=cos(x);
define(g(x),diff(f(x),x));
g(x);
g(0);

## Maxima a veces hace preguntas para poder decidir
cual es la respuesta adecuada.
Pero también es posible preveer sus preguntas 
y responderlas previamente

integrate(exp(a*x),x,0,inf);

integrate(exp(a*x),x,0,inf);

En la nueva celda le aclaramos de antemano con 
assume
las condiciones que ha de tener en cuenta

assume(0<a,a<1)$
integrate(1/x^a,x,0,1);

facts();
forget(a<1);
facts();

integrate(1/x^a,x,0,1);

## Ilustrar el comando  block

Hacemos una asignación con carácter global (a:3 b:5)
y luego la cambiamos dentro de un bloque   (a:30, b:10)

Las cuentas dentro del bloque atienden a los definidos dentro del bloque,
pero al salir del bloque se recuperan los valores originales.

kill(a,b)$
a:3$ b:5$ a*b;

block([a,b], a:30, b:10, a*b);

a*b;

## Un primer contacto con los condicionales: if, else

Un ejemplo de condicional anidado

F(x):=if x<0 then x 
      else (if x<1 then x^2 else 1) ;
wxplot2d( F(x), [x,-1,2], [y,-1,2] );