4. Programación en Mathematica

Ejemplos con Mathematica

1. Expresiones lógicas

Ejemplo 4.1.

Si queremos comprobar si un valor x pertenece al intervalo  [1, 4[, lo haremos escribiendo:

x = 3;
1 <= x < 4

Ejemplo 4.2.

Si queremos comprobar si un valor x pertenece al intervalo  [1, 400[ y es un número primo, lo haremos escribiendo:

x = 31;
1 <= x < 400 && PrimeQ[x]

O bien:

x = 31;
And[1 ≤ x < 400, PrimeQ[x]]

2. Ordenes condicionales

2.1. El condicional If

Ejemplo 4.3.

En este sencillo ejemplo se comprueba si la variable a pertenece al intervalo ]0, 3[ o la variable b es igual a 10, devolviendo “verdadero” en caso afirmativo o “falso” en caso contrario.

a = 1;
b = 1;
If[(0 < a < 3) || (b == 10), Print["verdadero"], 
      Print["falso"]]

a = 4;
b = 1;
If[(0 < a < 3) || (b == 10), Print["verdadero"], 
      Print["falso"]]

Ejemplo 4.4.

Determinar si x es natural o entero.

x = 2;
If[IntegerQ[x],  Print["Es entero"]]
If[IntegerQ[x] && x < 0, , Print["Es natural"]]

2.2. El condicional Which

Ejemplo 4.5.

Se puede usar para definir funciones a trozos, por ejemplo:

f[x_] := 
      Which[0 <= x <= 1, x^2, 1 <= x <= 2, 2 - x^2, True, 0]
f[0.5]
f[3]

3. Bucles

Ejemplo 4.6.

Observemos como funciona i++,

\(\(\(\(i = 7;\)

    \(i++\)

    i\)\(	\)\)\)

Por otra parte, ++i,

i = 7;
++i
i

3.1. El bucle Do

Ejemplo 4.7.

Este bucle comienza con el contador j en el valor inicial 1, incrementa j en dos unidades en cada ciclo, hasta que j alcanza el valor final 7, por tanto el cuerpo lo ejecutará cuatro veces y en cada ciclo calcula e imprime el valor de j2.

Do[Print[j^2], {j, 1, 7, 2}]

Ejemplo 4.8.

Evaluar la función f(x, y) = x2 + y2 en todos los pares de valores enteros (x, y) tales que 4 ≤ x ≤ 8 y 0 ≤ y ≤ 2.

f[x_, y_] := x^2 + y^2
Do[Do[Print[f[i, j]], {j, 0, 2}], {i, 4, 8}]

3.2. El bucle For

Ejemplo 4.9.

Este bucle comienza con j = 1. Parará cuando j sea mayor o igual a 8 e incrementa j una unidad en cada ciclo, luego repetirá la ejecución del cuerpo siete veces y en cada ciclo suma a t, 2 unidades, mostrando en pantalla el valor de t.

t = 0;
For[j = 1, j < 8, j++, t = t + 2; Print[t]];

Ejemplo 4.10.

Calcular todos los números primos comprendidos entre 50 y 100.

For[j = 50, j < 100, j++, If[PrimeQ[j], Print[j]]];

3.3. El bucle While

Ejemplo 4.11.

Este bucle comienza con n = 500 y termina cuando n sea mayor o igual a 1000, el contador n se incrementa 50 unidades en cada ciclo, imprimiendo en pantalla el valor de la variable contador en cada ciclo.

n = 500;
While[n < 1000, n = n + 50; Print[n]]

Ejemplo 4.12.

Calcular el menor número primo mayor que 200.

a = 200;
While[! PrimeQ[a], a++]; a

3.4. La instrucción Break[]

Ejemplo 4.13.

Si llamamos t al producto de los n primeros enteros pares positivos. ¿Cuál será el mayor valor de n verificando que t < 1000? Utilizar los tres bucles vistos para calcularlo y la instrucción Break[].

t = 1;
n = 0;
Do[t = t*i; 
        If[t ≥ 1000, Break[], n++], {i, 2, 1000, 
          2}];
Print["n es: ", n]

t = 1;
n = 0;
For[i = 2, True, i = i + 2, t = t*i; 
        If[t ≥ 1000, Break[], n++]];
Print["n es: ", n]

t = 1;
n = 0;
i = 0;
While[True, i = i + 2; t = t*i; 
        If[t ≥ 1000, Break[], n++]];
Print["n es: ", n]

La función Break[], en realidad, no es de uso estrictamente necesario y siempre que queramos podemos evitarla, los ejemplos anteriores podríamos rescribirlos como sigue:

t = 1;
n = 0;
Do[t = t*i; 
        If[t ≥ 1000, i = 1000, n++], {i, 2, 1000, 
          2}];
Print["n es: ", n]

t = 1;
n = -1;
For[i = 2, t < 1000, i = i + 2, t = t*i; n++];
Print["n es: ", n]

t = 1;
n = -1;
i = 0;
While[t < 1000, i = i + 2; t = t*i; n++];
Print["n es: ", n]

4. Representaciones gráficas

Ejemplo 4.14.

Dibujar la representación analógica de la hora de un reloj.

<< Graphics`Arrow`
hora = 7;
minuto = 16;
hora = 3 - (hora + minuto/60);
minuto = 15 - minuto;
reloj = {};
Do[
        AppendTo[reloj, Point[{Sin[j], Cos[j]}]], {j, -Pi, Pi, 
          2*Pi/12}];
AppendTo[reloj, 
        Arrow[{0, 0}, {Cos[(2*Pi)*(hora/12)]* .8, 
            Sin[(2*Pi)*(hora/12)]* .8}]];
AppendTo[reloj, 
        Arrow[{0, 0}, {Cos[(2*Pi)*(minuto/60)], 
            Sin[(2*Pi)*(minuto/60)]}]];
Show[Graphics[reloj]]

Podemos observar que la esfera del reloj no es dibujada como una circunferencia, esto es debido a que la relación de aspecto entre altura y anchura no es la idónea, podemos solucionarlo así:

<< Graphics`Arrow`
hora = 7;
minuto = 16;
hora = 3 - (hora + minuto/60);
minuto = 15 - minuto;
reloj = {};
Do[
        AppendTo[reloj, Point[{Sin[j], Cos[j]}]], {j, -Pi, Pi, 
          2*Pi/12}];
AppendTo[reloj, 
        Arrow[{0, 0}, {Cos[(2*Pi)*(hora/12)]* .8, 
            Sin[(2*Pi)*(hora/12)]* .8}]];
AppendTo[reloj, 
        Arrow[{0, 0}, {Cos[(2*Pi)*(minuto/60)], 
            Sin[(2*Pi)*(minuto/60)]}]];
Show[Graphics[reloj, AspectRatio -> Automatic]]

5. Procedimientos: Module

Ejemplo 4.15.

Definir una función cuyos argumentos sean la hora expresada en horas y minutos y dibuje la representación analógica como en el ejemplo 4.14.

<< Graphics`Arrow`
\(RJ[hora_, minuto_] := 
      Module[{reloj = {}, j}, 
hora2 = 
          3 - \((hora + minuto/60)\); 
\ \ \ \ \ minuto2 = 15 - minuto; 
\ 
        Do[AppendTo[reloj, Point[{Sin[j], Cos[j]}]], {j, \(-Pi\), Pi, 
            2*Pi/12}]; 

        AppendTo[reloj, 
          Arrow[{0, 0}, {Cos[\((2*Pi)\)*\((hora2/12)\)]* .8, 
              Sin[\((2*Pi)\)*\((hora2/12)\)]* .8}]]; 

        AppendTo[reloj, 
          Arrow[{0, 0}, {Cos[\((2*Pi)\)*\((minuto2/60)\)], 
              Sin[\((2*Pi)\)*\((minuto2/60)\)]}]]; 

        Show[Graphics[reloj]]
	]\)

RJ[5, 34]

6. Ejercicios

Ejercicio 4.6.

n = 30;
radio = 2;
circulos = {};
Do[
        AppendTo[circulos, Circle[{Sin[j], Cos[j]}, radio]], {j, -Pi, Pi, 
          2*Pi/n}];
Show[Graphics[circulos], AspectRatio -> Automatic]

Ejercicio 4.9.

Las funciones cuyas entradas son las tres coordenadas de un punto tridimensional y cuyas salidas, respectivas, son la coordenada x e y de su representación en el plano son:

CoorX[x_, y_, z_] := x - ((z/2.5)*Sin[Pi/3])
CoorY[x_, y_, z_] := y - ((z/2.5)*Cos[Pi/3])

Sabiendo que la ecuación de una esfera de centro (0, 0, 0) y radio r es x\(TraditionalForm\`\^2\) + y\(TraditionalForm\`\^2\) + z\(TraditionalForm\`\^2\) = r\(TraditionalForm\`\^2\). Usamos las funciones anteriores para representar un número suficiente de puntos de la esfera de radio 3 que nos permita distinguir su forma.

puntos = {};
x = 0; y = 0; z = 0;
Do[Do[If[9 - (z^2 + x^2) > 0, 
                y = Sqrt[9 - (z^2 + x^2)]; 
AppendTo[
                  puntos, 
                  Point[{CoorX[x, y, z], 
                      CoorY[x, y, z]}]]; 
AppendTo[puntos, 
                  Point[{CoorX[x, -y, z], 
                      CoorY[x, -y, z]}]]];, {x, -3, 
              3,  .1}];, {z, -3, 3,  .1}];
Show[Graphics[puntos], AspectRatio -> Automatic];
Print["Número de puntos usados: ", 
        Length[puntos]];

puntos = {};
graficos = {};
Do[
        puntos = {}; 
Do[If[
              9 - (z^2 + x^2) ≥ 0, 
              y = Sqrt[9 - (z^2 + x^2)]; 
AppendTo[
                puntos, {CoorX[x, y, z], CoorY[x, y, z]}]];, {x, -3, 
            3,  .1}]; 
Do[If[
              9 - (z^2 + x^2) ≥ 0, 
              y = -Sqrt[9 - (z^2 + x^2)]; 
AppendTo[
                puntos, {CoorX[x, y, z], CoorY[x, y, z]}]];, {x, 
            3, -3, - .1}]; 
If[Length[puntos] > 0, 
          AppendTo[puntos, puntos[[1]]]]; 
AppendTo[
          graficos, Line[puntos]], {z, -3, 3,  .1}];
Show[Graphics[graficos], 
        AspectRatio -> Automatic];

De la misma forma podemos representar cualquier superficie, por ejemplo: z\(TraditionalForm\`\^2\) – x\(TraditionalForm\`\(\(\^2\)\(\ \)\(=\)\)\)y.

puntos = {};
x = 0; y = 0; z = 0;
Do[Do[
            y = (z^2 - x^2); 
AppendTo[puntos, 
              Point[{CoorX[x, y, z], CoorY[x, y, z]}]];, {x, -5, 
              5,  .2}];, {z, -4, 4,  .2}];
Show[Graphics[puntos]];
Print["Número de puntos usados: ", 
        Length[puntos]];

puntos = {};
graficos = {};
Do[
        puntos = {}; 
Do[
          y = (z^2 - x^2); 
AppendTo[
            puntos, {CoorX[x, y, z], CoorY[x, y, z]}];, {x, -1, 
            1,  .03}]; 
AppendTo[graficos, 
          Line[puntos]];, {z, -1, 1,  .03}];
Do[
        puntos = {}; 
Do[
          y = (z^2 - x^2); 
AppendTo[
            puntos, {CoorX[x, y, z], CoorY[x, y, z]}];, {z, -1, 
            1,  .03}]; 
AppendTo[graficos, 
          Line[puntos]];, {x, -1, 1,  .03}];
Show[Graphics[graficos], 
        AspectRatio -> Automatic];