programación en Mathematica
Agenda
2.1.- Manipulación de listas.
Range[100]
Range[10, 200, 3]
f[x_] = x ^ 2;
Array[f, 5]
Array[#1 ^ 2 &, 5]
Existen muchas funciones para seleccionar, extraer, encontrar, añadir, etc. elementos dentro de
una lista; entre ellas están las funciones Select, Insert, Delete, etc.
? EvenQ
Select[{1, 2, 3, 4, 5, 6}, EvenQ]
Function[var, Exp[var]][x + y]
Ya que los nombres de los parámetros formales son irrelevantes, Mathematica permite usarlos de
dos formas cortas:
Function[body]
body & (* & es el signo ampersand *)
En estas formas de describir una función, el parámetro formal es #.
En los casos de múltiples parámetros, se los expresa como #1, #2, ...
3 #1 ^ #2 &[x, y]
Por ejemplo la función Select[...] puede ser usada como una función pura para implementar un
código más eficiente:
a = {{2, 3}, {3, 0}, {5, 2}, {6, 8}, {9, 4}};
Sort[a, #1[[2]] < #2[[2]] &]
Nest[q, x, 4]
Múltiples definiciones
Una función puede tener múltiples deficiones. Estas definiciones deben estar ordenadas de
acuerdo a que tan específicas son cada definición (desde lo mas general a lo mas específico).
Clear[f]
f[y_] := 3 y (* más general *)
f[x_Integer] := x ^ 2 (* un poco más específico *)
f[5] := 1 25 (* mucho más específico *)
?f
f[5]
f[6]
f[6.1]
Condicionales
If[condición, t] Da t si la condición es verdadera, Nada en cualquier otro caso
If[condición, t, f] Da t si la condición es verdadera y f si es falsa, nada en cualquier
otro caso
If[condición, t, f, u] Da t si la condición es verdadera y f si es falsa, u en cualquier otro
caso
Which[cond1, t1, cond2, t2, ... cond n, tn] Da t1 si cond1 es verdadera, t2 si cond2 es ver-
dadera,...
If[Random[] > 0.5, res = "Buen día", res = "Mal día"]; res
x/=dx
{x,y}={y,x} (* intercambia los valores *)
PrependTo[s, elem]
AppendTo[s, elem]
Ejemplo:
a. Generar 50 puntos en un cuadrado 100x100 (pueden ser ubicaciones aleatorias),
b. Calcular la matriz de distancias de Manhattan de estos puntos,
c. Construir una función que calcule la distancia total recorrida de una ruta dada,
d. Generar aleatoriamente una ruta, con ParallelDo seleccionar la mejor ruta de entre 1000
generadas aleatoriamente
, , ,
FERNANDO SANDOYA, Ph.D.
SESIÓN 2 | 5
Duración de Trabajos
Trabajo 1
Trabajo 2
Trabajo 3
Trabajo 4
Trabajo 5
Lista de precedencias Trabajo Trabajo crítico? inicio/temprano inicio/tarde fin temprano fin con retraso
predecesores del Trabajo 2
Trabajo 1 SI 0 0 5 5
Trabajo 1 Trabajo 2 SI 5 5 10 10
predecesores del Trabajo 3 Trabajo 3 SI 10 10 15 15
Trabajo 4 SI 15 15 20 20
Trabajo 1
Trabajo 5 SI 20 20 25 25
Trabajo 2
predecesores del Trabajo 4
Trabajo 1
Trabajo 2
Trabajo 3
predecesores del Trabajo 5
Trabajo 1
Trabajo 2
Trabajo 3
Trabajo 4
Opciones a visualizar
Visualizar Indicadores
1.0
0.5
-6 -4 -2 2 4
-0.5
-1.0
Una forma general de utilizar Manipulate[expr, {{u, u0, ulabel}, umin, umax, uinc}], donde u0 es el
valor inicial, ulabel es su etiqueta, y uinc es el incremental.
Manipulate[Plot[Evaluate[
x[t] /. NDSolve[{x ''[t] + β x '[t] + x[t] 0, x[0] 1, x '[0] 0}, x, {t, 0, 20}]],
{t, 0, 20}, AxesLabel {"tiempo", "amplitud"}, PlotRange {- 1, 1}],
{{β, 0, "coeficiente de roce"}, 0, 4, 0.1}]
coeficiente de roce
amplitud
1.0
0.5
tiempo
5 10 15 20
-0.5
-1.0
Más de una variable pueden ser consideradas, incluyendo más listas como argumentos adicionales.
100
80
60
40
20
20 40 60 80 100
Range[Length[datos]]]
d. Graficar los objetos agrupados respecto a todas sus características ( use la función
ListPointPlot3D[ ] )
e. Utilizar Manipulate para generar una aplicación que controle el número de grupos
,45,2},{290,35,1},{216,30,1},{110,30,0},{95,28,1},{130,56,1},{189,67,2},{180,31,1},{110,17,2
},{109,25,2},{89,20,2},{136,22,1}}
12 | Seminario de Wolfram Mathematica
a. Clasificarlos Avanzado
en grupos homogéneos usando la función FindClusters[ ]
Range[Length[datos]]]
d. Graficar los objetos agrupados respecto a todas sus características ( use la función
ListPointPlot3D[ ] )
e. Utilizar Manipulate para generar una aplicación que controle el número de grupos
datos = {{190, 30, 1}, {150, 29, 0}, {135, 26, 2}, {99, 18, 0}, {100, 67, 2},
{220, 36, 2}, {235, 50, 1}, {167, 42, 2}, {184, 45, 2}, {290, 35, 1},
{216, 30, 1}, {110, 30, 0}, {95, 28, 1}, {130, 56, 1}, {189, 67, 2},
{180, 31, 1}, {110, 17, 2}, {109, 25, 2}, {89, 20, 2}, {136, 22, 1}};
aa = FindClusters[datos, 3];
ListPointPlot3D[aa, PlotStyle PointSize[0.04]];
Manipulate[ListPointPlot3D[FindClusters[datos, n],
PlotStyle PointSize[0.04]], {n, 1, 5, 1}]
2.0
1.5
1.0 60
0.5
0.0
100 40
150
200
250 20
6.