Matemáticas con Mathematica

Práctica 2. Variables y constantes. Asignación y asignación diferida.
	      Funciones. Las funciones elementales

Francisco Javier Pérez González
Departamento de Análisis Matemático
Universidad de Granada

Variables y constantes. El comando de asignación ( = )

Lo que realmente distingue a un programa como Mathematica es su capacidad para trabajar simbólicamente; es decir, trabajar con expresiones algebraicas en las que intervienen símbolos que no tienen un valor numérico concreto. Solemos referirnos a estos símbolos como variables.

a^(1/2) a^(1/3)a  +  3  b  +  c^2  + 4 a  +  3 c^2Exp[x] Exp[y]

Para multiplicar números por variables no es preciso dejar un espacio en blanco. Para Mathematica prácticamente cualquier letra o combinación de letras puede ser una variable. Hay excepciones que corresponden a algunos símbolos protegidos como los de las operaciones aritméticas o como la letra E, que siempre indica el número e base de los logaritmos naturales. Sin embargo, todas las letras minúsculas {x, y, z... a, b, c, d...} y sus combinaciones pueden usarse sin problemas para representar variables. No olvides que Mathematica distingue entre mayúsculas y minúsculas.

En Mathematica el símbolo de igualdad (=) es la forma usual de escribir el comando "Set[ ]" (léase atribuye o asigna). Así "expr1=expr2" y "Set[expr1,expr2]" son dos formas de decirle a Mathematica que evalúe inmediatamente expr2 y el resultado de esta operación lo asigne en adelante al símbolo expr1. Mathematica interpreta que una expresión "exp" formada por una letra o una combinación de letras es una variable si no se le ha asignado ningún valor concreto; cuando a "exp" se le asigna un valor concreto, el programa reemplazará cada aparición de "exp" por el valor que le hemos asignado; es decir, tratará "exp" como una constante. Cuando asignes valores a expresiones es muy conveniente que las expresiones que utilices contengan solamente letras minúsculas. Puedes usar como símbolo para una expresión prácticamente cualquier combinación de letras y números. Aquí asigno el valor 5 al símbolo "a" y el valor 7 al símbolo "ab".

a = 5ab = 7

Ahora todas las apariciones de "a" quedan sustituidas por 5 y las de "ab" por 7.

a*ab

Podemos asignar ahora otro valor para "a" y al hacerlo se elimina el valor anterior.

a = 10a*ab

Podemos preguntarle a Mathematica para saber el significado actual de un símbolo.

? a

? ab

Para quitar el valor asignado a una expresión usamos la orden "Clear[exp]".

Clear[a]

a + ab

El comando de asignación diferida ( := )

Es importante distinguir entre el comando de asignación inmediata (=) y el comando de asignación diferida (:=) cuyo nombre es "SetDelayed[ ]". Cuando escribimos "expr1  :=  expr2" le estamos diciendo a Mathematica que asigne "expr1" al valor diferido de "expr2" pero "expr2" no se evalúa inmediatamente sino que para ello hay que llamar a "expr1" y cada vez que lo hacemos "expr2" se evalúa de nuevo. Para que entiendas bien la diferencia, en el siguiente ejemplo uso el comando "Random[ ]" que proporciona un número aleatorio entre 0 y 1. Cada vez que ejecutas el comando obtienes (salvo rara casualidad) un número distinto. Compruébalo.

Random[]Random[]Random[]

Asignamos ahora el símbolo "aleatorio1" a una ejecución inmediata del comando Random[ ]. Dicho comando se ejecutará y el resultado obtenido será en adelante el valor de "aleatorio1".

aleatorio1 = Random[]

aleatorio1

Hacemos ahora una asignación diferida del símbolo "aleatorio2" al comando Random[ ]. El comando Random[ ] no será evaluado. Para evaluarlo deberemos invocar al símbolo "aleatorio2" y cada vez que lo hagamos se ejecutará de nuevo dicho comando por lo que el valor de "aleatorio2" será diferente cada vez que lo llamemos.

aleatorio2 := Random[]

aleatorio2aleatorio2

Habrás observado que cuando se usa el comando de asignación diferida Mathematica no presenta ninguna salida en pantalla. Eso es debido a que dicho comando, al igual que otros, tiene salida Null  que es un símbolo usado por Mathematica para indicar la ausencia de una expresión o resultado como salida en pantalla. Cuando un comando tiene salida Null no se imprime nada en pantalla.

Funciones

En la mayoría de los lenguajes de programación para definir una función es necesario declarar previamente las variables y el tipo de variables. En Mathematica es muy fácil definir funciones. No es preciso declarar las variables ni el tipo de variable. Todo lo que tienes que hacer es definir la función de la forma que voy a explicarte. Lo primero que tienes que tener en cuenta es que las variables de las funciones (que suelen llamarse argumentos de la función) van entre corchetes [ ] nunca entre paréntesis ( ). Los paréntesis ( ) solamente se usan para indicar, cuando es necesario, el orden en que debe evaluarse una expresión. Intentemos ya,  sin tomar más precauciones, definir una función.

f[x] = x^2 (* recuerda :  
            las variables de una función van siempre entre 
              corchetes *)

Si lo que acabamos de definir es una función debe ser posible calcular su valor para distintos valores de la variable. Veamos si esto es así.

f[2]f[y]f[x]

Ya ves que lo que hemos definido no es una función. Lo que hemos hecho ha sido, simplemente, asignar el símbolo f[x] a x^2. Fíjate en que para definir una función las variables deben ser independientes de los símbolos con que las representemos. La función que queremos definir es una regla que a "algo" le asigna "algo^2". Pero ese "algo" no puede identificarse con nada concreto porque unas veces puede ser un número y otras veces puede ser una expresión algebraica o de otro tipo. Lo que necesitamos es proporcionarle a Mathematica un patrón o modelo (pattern en inglés) que pueda ser reemplazado de muy diversas formas. Esto se hace en Mathematica con el operador "Blank[ ]" que se escribe _ (mayúsculas+guión).

Clear[f]f[x_] = x^2

f[2]f[y]f[x]

Mathematica interpreta x_ como un comodín que puede ser reemplazado por cualquier expresión simple.

f[x + y + 2  x*z]f[(Sqrt[x])]

La misma regla sirve para definir funciones de más de una variable. Aquí tienes algunos ejemplos.

g[x_, y_] = (Sqrt[x^2 + y^2 ])  g[1, 2]g[u + v, s + t]Clear[f, g]

Para definir una función puedes usar la asignación inmediata como hemos hecho antes y también la asignación diferida. Muchas veces no tiene mayor importancia cuál de las dos uses pero a veces sí que la tiene. Observa.

f[x_] = N[x, 30]   f[Pi]

Está claro lo que ha pasado. Al definir f[x] con la asignación inmediata se evalúa enseguida el comando N[x,30] y, como x no es una cantidad numérica, Mathematica da como respuesta el propio x que es lo que de aquí en adelante Mathematica interpretará como f["deloquesea"].

Clear[f]f[x_] := N[x, 30]f[Pi]

Ahora hemos definido f[x] con la asignación diferida por lo que el comando N[x,30] no se evalúa hasta que se llama a la función.

Como estrategia general es conveniente usar la asignación diferida para definir funciones pero hay algunos casos importantes (por ejemplo, para definir derivadas) en los que es preferible usar la asignación directa.

No olvides que Mathematica distingue entre mayúsculas y minúsculas. Todos los comandos de Mathematica empiezan con una letra mayúscula, por eso una buena estrategia para representar tus propios comandos y funciones es usar letras minúsculas. La orden "Clear["@"]" elimina todas las constantes y funciones que hayamos representado con letras minúsculas.

Si queremos eliminar todas las constantes y funciones que hemos definido usaremos Clear["Global`*"]  (el acento que hay que usar es el que está a la derecha de la p).

Clear["Global`*"]

Ejercicio 1

Clear[f, g]\(f[x_] = Simplify[x]; 
g[x_] := Simplify[x]; 

    f[Cos[x]\^2 + Sin[x]\^2]\)g[Cos[x]^2 + Sin[x]^2]

Algunos comandos para trabajar con funciones elementales

Los siguientes comandos son útiles para trabajar con funciones polinómicas.

poli = Expand[(x  +  y^2  + z^3)^10]

Lo contrario de desarrollar una potencia es agrupar en factores (cuando se puede).

Factor[poli]

Recuerda que el símbolo "%" se refiere a la salida inmediata anterior.

Expand[(x + y + z) (x^2 + y^3 + z^4 + 2) (1 + x^2)]

Factor[%]

poli2 = Expand[(1 + x + y*x  +  x*z^2)^3]Collect[poli2, x]

Coefficient[poli2, x^3]

\(\(Exponent[poli2, z]
 (*\ 
      nos\ da\ el\ exponente\ máximo\ de\ z, \ es\ decir, \ 
      el\ grado\ de\ poli2\ en\ la\ variable\ z\ *) \)\)

El comando "Simplify[expr]" sirve para simplificar una expresión. Cuando se usa con polinomios trata de presentarlos de la forma más sencilla y para ello puede factorizarlos o no.

Simplify[(1 - x)^4 - (1 + x)^3]

Simplify[(1 - x)^4 + (1 + x)^3]

Un comando más poderoso (y más lento) que Simplify es "FullSimplify[expr]". A veces el primero no da resultado y el segundo sí.

Simplify[
      2^(1/2) + 3^(1/2) - (5 + 2*6^(1/2))^(1/2)]

FullSimplify[
      2^(1/2) + 3^(1/2) - (5 + 2*6^(1/2))^(1/2)]

Los siguientes comandos son útiles para trabajar con funciones racionales.

Numerator[((x^3 + x - 1)/(x^2 - 5))]  Denominator[((x^3 + x - 1)/(x^2 - 5))]

Together[((x^3 + x - 1)/(x^2 - 5)) + ((x - 1)/(x^2 + 1))]

Apart[((x^3 + x - 1)/((x - 5) (x^2 + 1) (x + 2)^2))]

Cancel[((x^3 - 1)/((x - 1) (x^2 + 1)))]

ExpandAll[
      (((x + 1) (1 + x + x^2))/((x - 5) (x + 2)))]

Expand[
      (((x + 1) (1 + x + x^2))/((x - 5) (x + 2)))]

Las principales funciones trigonométricas de Mathematica son Sin[x], Cos[x], Tan[x], ArcSin[x], ArcCos[x], ArcTan[x]. Ya habrás observado que todos los comandos y funciones de Mathematica empiezan por mayúsculas. Por eso es conveniente que las funciones que tú definas tengan nombre en letras minúsculas. Mathematica conoce las identidades trigonométricas y puede usarlas para simplificar expresiones en las que aparezcan dichas funciones. En lugar de Expand[ ] y Factor[ ] se usan los comandos TrigExpand[ ] y TrigFactor[ ].

TrigExpand[Cos[x + y]]

TrigExpand[Sin[2  ArcTan[t]]]

TrigReduce[Sin[a*x]*Cos[b*x]^2]

TrigFactor[%]

La función exponencial de base a (a > 0,  a ≠  1) es la función que a un número x hace corresponder (a^x). La exponencal de base e se llama exponencial natural.

2^(3.14)  
Exp[3.14]

Limit[(1.1)^x, x -> +Infinity]

Limit[(1.1)^x, x -> -Infinity]

Mathematica conoce la propiedad principal de las exponenciales: la exponencial de una suma es el producto de las exponenciales de los sumandos. Observa en la celda siguiente el uso del operador boleano "==" para comprobar que dos expresiones simbólicas son iguales.

(a^(x + y)) == (a^x)*(a^y)

Dado un número positivo a > 0,  a ≠ 1,  y un número real x > 0, se define el logaritmo en base a de x como el único número real y tal que (a^y) = x. Los logaritmos en base e se llaman logaritmos naturales (o neperianos).

Log[10. ]   
          
Log[10, 10. ]

Limit[Log[2, x], x -> +∞]

Limit[Log[2, x], x -> 0]

Ejercicio 2

((sen x)/x),  (( cos x - 1)/(x^2)),  
    (((e^x) - 1)/x),  (( tg x - x)/(x^3)),  
    (( log (1 + x))/x),  (((1 + x))^(1/x))