Anda di halaman 1dari 12

Sesión 2: Temas avanzados de

programación en Mathematica
Agenda
2.1.- Manipulación de listas.

2.2.- Funciones puras y Mapeos sobre listas.

2.3.- Parallelize: Programación en paralelo.

2.4.- Manipulate: diseño de aplicaciones iterativas y dinámicas.

2.1 Manipulación de listas.


Las listas son colecciones de objetos que son tratados como una entidad y constituyen una de las
estructuras más importantes de Mathematica.
Para definir una lista, se deben indicar sus elementos entre llaves, separadas por comas.
Los elementos de una lista no son necesariamente dle mismo tipo, y puede estar formada por otras
listas.
Existen funciones para crear listas, entre ellas: Range[ ], Table[ ], Array[ ].

Range[...] genera una secuencia aritmética:


Range[imax]
Range[imin, imax]
Range[imin, imax, di]
Para generar una lista más general usando una función:
Array[f, {n1, n2, ...}]

Range[100]
Range[10, 200, 3]

f[x_] = x ^ 2;
Array[f, 5]

Array[#1 ^ 2 &, 5]

Hablaremos más acerca de & un poco más abajo.

Funciones para contar elementos en listas:


Length[list] Número de elementos
Count[list, elem] Cuenta cuántos elem hay en list
Dimensions[list] Es la lista de las dimensiones de list
2 Funciones
| Seminario para
de Wolfram contar elementos
Mathematica Avanzado en listas:
Length[list] Número de elementos
Count[list, elem] Cuenta cuántos elem hay en list
Dimensions[list] Es la lista de las dimensiones de list

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.

Funciones muy usadas para manipular listas:


Select[list, elem] Selecciona de lista los elementos que cumplen el
criterio
Insert[list, elem, {i, j, ...}]
Append[list, elem]
AppendTo[list, elem]
Delete[list, {i, j, ...}]
Transpose[list]
Flatten[list] Aplana listas anidadas
Join[list1, list2, ...] Concatena listas
Union[list1, list2, ...] Concatena listas, las ordena, y elimina los duplica-
dos
Intersection[list1, list2, ...]
Complement[list1, list2] list1-list2

Seleccione los números impares que están contenidos en una lista

? EvenQ
Select[{1, 2, 3, 4, 5, 6}, EvenQ]

2.2 Funciones puras y Mapeos sobre listas.


Funciones Puras
Una función pura reduce los riesgos de usar las funciones tradicionales, variables de programación
y reduce significativamente el tiempo de procesamiento.
Function[{x1, x2, ...}, cuerpo] define una función pura con parámetros formales x1, x2, ...
Function[{x1, x2, ...}, cuerpo][{arg1, arg2, ...}] evalua la función pura en arg1, arg2, ...

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, ...

Exp[#1 + #2] &[x, y]

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:

FERNANDO SANDOYA, Ph.D.


SESIÓN 2 | 3

Select[{1, a, x ^ 2, 3, 5, 1 + x, 7, 12, 15, 2, 0, 3, 11, 4}, # > 4 &]

a = {{2, 3}, {3, 0}, {5, 2}, {6, 8}, {9, 4}};
Sort[a, #1[[2]] < #2[[2]] &]

Se pueden definir funciones de manera más eficiente:


1
1+x
q[x_] :=

Nest[q, x, 4]

&, x, 4 (* NO NECESITAMOS DEFINIR LA FUNCIÓN q *)


1
1+#
Nest

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

Bucles de índices o variables


Hay varias formas de cambiar los valores de índices o variables:
x++ (* retorna el viejo valor *)
++x (* retorna el nuevo valor *)
x--
--x
x+=dx (* returning the new value *)
x-=dx
x*=dx
x/=dx
{x,y}={y,x} (* intercambia los valores *)
PrependTo[s, elem]
AppendTo[s, elem]
x+=dx (* returning the new value *)
x-=dx
4 x*=dx Mathematica Avanzado
| Seminario de Wolfram

x/=dx
{x,y}={y,x} (* intercambia los valores *)
PrependTo[s, elem]
AppendTo[s, elem]

2.3 Parallelize: Programación en paralelo.


Paralelizar cálculos
Normalmente un programa que se implementa realiza todas las instrucciones de manera secuen-
cial, lo cual podría resultar en un tiempo excesivo de ejecución y no se usan los recursos de hard-
ware disponibles de la tecnología multicore, ParallelDo[“cuerpo”,{itermax},Method”método”]
realiza iteraciones paralelas, utilizando los diferentes núcleos físicos de la máquina con el fin de
ejecutar más rápidamente un procedimiento.
Las variables que se usan dentro de ParallelDo son locales, es decir no hay una iteración de los
valores de las mismas entre los diferentes núcleos que desarrollan el procesamiento, pero se
pueden definir variable sglobales, que reportan sus valores al procesador central, el mismo que
puede comunicar sus valroes a cada núcleo para su consideración. Estas variables se definen
antes de invocar a ParallelDo con la instrucción SetSharedVariable[“nombres de las variables”];

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

2.4 Manipulate: diseño de aplicaciones iterativas y


dinámicas.
Con Manipulate se pueden generar aplicaciones interactivas y dinámicas de gran calidad de una
manera sencilla.

definedImageSize = {900, 300};


determineMaximumNumberOfTrabajos[Trabajo2_, Trabajo3_, Trabajo4_, Trabajo5_] :=
Complement[Range[5], Trabajo2 ⋃ Trabajo3 ⋃ Trabajo4 ⋃ Trabajo5]
determineMinimumNumberOfTrabajos[Trabajo2_, Trabajo3_, Trabajo4_, Trabajo5_] :=
Complement[Range[5], If[Trabajo2 ≠ {}, {2}, {}], If[Trabajo3 ≠ {}, {3}, {}],
If[Trabajo4 ≠ {}, {4}, {}], If[Trabajo5 ≠ {}, {5}, {}]];
EmptyQ[list_] := If[Length[list]  0, True, False];
IsTrabajoCritical[criticalTrabajos_, Trabajo_] :=
If[MemberQ[criticalTrabajos, Trabajo], "SI", "NO"];
PlotGanttChart[earlyStarts_, TrabajoDurations_, slackTimes_,
TrabajoLabels_, projectDuration_, imageSize_] := Graphics
{Table[{White, Rectangle[{0, i - 0.5}, {earlyStarts〚i〛, i + 0.5}], Red, Rectangle[
{earlyStarts〚i〛, i - 0.5}, {earlyStarts〚i〛 + TrabajoDurations〚i〛, i + 0.5}],
LightRed, Rectangle[{earlyStarts〚i〛 + TrabajoDurations〚i〛, i - 0.5},
]},

, , ,
FERNANDO SANDOYA, Ph.D.
SESIÓN 2 | 5

{earlyStarts〚i〛 + slackTimes〚i〛 + TrabajoDurations〚i〛, i + 0.5}]},

{i, Length[earlyStarts]}]}, AspectRatio  , ImageSize  imageSize,


1

Frame  {{True, True}, {True, True}}, FrameTicks  {{Transpose[


GoldenRatio

{Table[i, {i, Length[TrabajoLabels]}], TrabajoLabels}], None}, {Table[i,


{i, 0, projectDuration, 2}], Table[i, {i, 0, projectDuration, 2}]}};
Manipulate
Trabajo2 = If[Trabajo1PrecedesTrabajo2, {1}, {}];
Trabajo3 = Join[If[Trabajo1PrecedesTrabajo3, {1}, {}],
If[Trabajo2PrecedesTrabajo3, {2}, {}]];
Trabajo4 = Join[If[Trabajo1PrecedesTrabajo4, {1}, {}], If[
Trabajo2PrecedesTrabajo4, {2}, {}], If[Trabajo3PrecedesTrabajo4, {3}, {}]];
Trabajo5 = Join[If[Trabajo1PrecedesTrabajo5, {1}, {}],
If[Trabajo2PrecedesTrabajo5, {2}, {}], If[Trabajo3PrecedesTrabajo5, {3}, {}],
If[Trabajo4PrecedesTrabajo5, {4}, {}]];
Trabajos = Flatten[Join[{"INICIO"  #} & /@
determineMinimumNumberOfTrabajos[Trabajo2, Trabajo3, Trabajo4, Trabajo5],
{#  2} & /@ Trabajo2, {#  3} & /@ Trabajo3, {#  4} & /@ Trabajo4,
{#  5} & /@ Trabajo5, {#  "FIN"} & /@ determineMaximumNumberOfTrabajos[
Trabajo2, Trabajo3, Trabajo4, Trabajo5]]];
TrabajosDurations = {Trabajo1Duration, Trabajo2Duration,
Trabajo3Duration, Trabajo4Duration, Trabajo5Duration};
activeTrabajos = {1, 2, 3, 4, 5};
earlyStartTrabajo2 =
If[EmptyQ[Trabajo2], 0, Total[Part[TrabajosDurations, Trabajo2]]];
earlyStartTrabajo3 = If[EmptyQ[Union[Trabajo2, Trabajo3]], 0,
Max[If[MemberQ[Trabajo3, 2], earlyStartTrabajo2 + Trabajo2Duration, 0],
If[MemberQ[Trabajo3, 1], Trabajo1Duration, 0]]];
earlyStartTrabajo4 = If[EmptyQ[Union[Trabajo2, Trabajo3, Trabajo4]], 0,
Max[If[MemberQ[Trabajo4, 3], earlyStartTrabajo3 + Trabajo3Duration, 0],
If[MemberQ[Trabajo4, 2], earlyStartTrabajo2 + Trabajo2Duration, 0],
If[MemberQ[Trabajo4, 1], Trabajo1Duration, 0]]];
earlyStartTrabajo5 = If[EmptyQ[Union[Trabajo2, Trabajo3, Trabajo4, Trabajo5]],
0, Max[If[MemberQ[Trabajo5, 4], earlyStartTrabajo4 + Trabajo4Duration, 0],
If[MemberQ[Trabajo5, 3], earlyStartTrabajo3 + Trabajo3Duration, 0],
If[MemberQ[Trabajo5, 2], earlyStartTrabajo2 + Trabajo2Duration, 0],
If[MemberQ[Trabajo5, 1], Trabajo1Duration, 0]]];
earlyFinishTrabajo1 = Trabajo1Duration;
earlyFinishTrabajo2 = earlyStartTrabajo2 + Trabajo2Duration;
earlyFinishTrabajo3 = earlyStartTrabajo3 + Trabajo3Duration;
earlyFinishTrabajo4 = earlyStartTrabajo4 + Trabajo4Duration;
earlyFinishTrabajo5 = earlyStartTrabajo5 + Trabajo5Duration;
projectDuration = Max[Trabajo1Duration, earlyFinishTrabajo2,
earlyFinishTrabajo3, earlyFinishTrabajo4, earlyFinishTrabajo5];
lateStartTrabajo5 = earlyFinishTrabajo5 - Trabajo5Duration;
lateStartTrabajo4 = earlyFinishTrabajo4 - Trabajo4Duration;
;
6 | Seminario de Wolfram Mathematica Avanzado

lateStartTrabajo3 = earlyFinishTrabajo3 - Trabajo3Duration;


lateStartTrabajo2 = earlyFinishTrabajo2 - Trabajo2Duration;
lateStartTrabajo1 = earlyFinishTrabajo1 - Trabajo1Duration;
lateFinishTrabajo5 = If[MemberQ[activeTrabajos, 5],
Min[Join[If[MemberQ[Trabajo5, 5], {lateStartTrabajo5}, {}],
If[MemberQ[Trabajo4, 5], {lateStartTrabajo4}, {}],
If[MemberQ[Trabajo3, 5], {lateStartTrabajo3}, {}],
If[MemberQ[Trabajo2, 5], {lateStartTrabajo2}, {}]]], earlyFinishTrabajo5];
lateFinishTrabajo4 = If[MemberQ[activeTrabajos, 4],
Min[Join[If[MemberQ[Trabajo5, 4], {lateStartTrabajo5}, {}],
If[MemberQ[Trabajo4, 4], {lateStartTrabajo4}, {}],
If[MemberQ[Trabajo3, 4], {lateStartTrabajo3}, {}],
If[MemberQ[Trabajo2, 4], {lateStartTrabajo2}, {}]]], earlyFinishTrabajo4];
lateFinishTrabajo3 = If[MemberQ[activeTrabajos, 3],
Min[Join[If[MemberQ[Trabajo5, 3], {lateStartTrabajo5}, {}],
If[MemberQ[Trabajo4, 3], {lateStartTrabajo4}, {}],
If[MemberQ[Trabajo3, 3], {lateStartTrabajo3}, {}],
If[MemberQ[Trabajo2, 3], {lateStartTrabajo2}, {}]]], earlyFinishTrabajo3];
lateFinishTrabajo2 = If[MemberQ[activeTrabajos, 2],
Min[Join[If[MemberQ[Trabajo5, 2], {lateStartTrabajo5}, {}],
If[MemberQ[Trabajo4, 2], {lateStartTrabajo4}, {}],
If[MemberQ[Trabajo3, 2], {lateStartTrabajo3}, {}],
If[MemberQ[Trabajo2, 2], {lateStartTrabajo2}, {}]]], earlyFinishTrabajo2];
lateFinishTrabajo1 = If[MemberQ[activeTrabajos, 1],
Min[Join[If[MemberQ[Trabajo5, 1], {lateStartTrabajo5}, {}],
If[MemberQ[Trabajo4, 1], {lateStartTrabajo4}, {}],
If[MemberQ[Trabajo3, 1], {lateStartTrabajo3}, {}],
If[MemberQ[Trabajo2, 1], {lateStartTrabajo2}, {}]]], earlyFinishTrabajo1];
lateFinishTrabajo5 = If[lateFinishTrabajo5 ≠ ∞,
lateFinishTrabajo5, projectDuration];
lateFinishTrabajo4 = If[lateFinishTrabajo4 ≠ ∞,
lateFinishTrabajo4, projectDuration];
lateFinishTrabajo3 = If[lateFinishTrabajo3 ≠ ∞,
lateFinishTrabajo3, projectDuration];
lateFinishTrabajo2 = If[lateFinishTrabajo2 ≠ ∞,
lateFinishTrabajo2, projectDuration];
lateFinishTrabajo1 = If[lateFinishTrabajo1 ≠ ∞,
lateFinishTrabajo1, projectDuration];
lateStartTrabajo5 = lateFinishTrabajo5 - Trabajo5Duration;
lateStartTrabajo4 = lateFinishTrabajo4 - Trabajo4Duration;
lateStartTrabajo3 = lateFinishTrabajo3 - Trabajo3Duration;
lateStartTrabajo2 = lateFinishTrabajo2 - Trabajo2Duration;
lateStartTrabajo1 = lateFinishTrabajo1 - Trabajo1Duration;
slackTrabajo5 = lateFinishTrabajo5 - earlyFinishTrabajo5;
slackTrabajo4 = lateFinishTrabajo4 - earlyFinishTrabajo4;
slackTrabajo3 = lateFinishTrabajo3 - earlyFinishTrabajo3;
;

FERNANDO SANDOYA, Ph.D.


SESIÓN 2 | 7

slackTrabajo2 = lateFinishTrabajo2 - earlyFinishTrabajo2;


slackTrabajo1 = lateFinishTrabajo1 - earlyFinishTrabajo1;
slackTrabajos = Reverse[{slackTrabajo1,
slackTrabajo2, slackTrabajo3, slackTrabajo4, slackTrabajo5}];
earlyStarts = Reverse[{0, earlyStartTrabajo2, earlyStartTrabajo3,
earlyStartTrabajo4, earlyStartTrabajo5}];
TrabajoDurations = Reverse[{Trabajo1Duration, Trabajo2Duration,
Trabajo3Duration, Trabajo4Duration, Trabajo5Duration}];
criticalTrabajos = Join[If[slackTrabajo1  0, {1}, {}],
If[slackTrabajo2  0, {2}, {}], If[slackTrabajo3  0, {3}, {}],
If[slackTrabajo4  0, {4}, {}], If[slackTrabajo5  0, {5}, {}]];
ganttChart = PlotGanttChart[earlyStarts, TrabajoDurations, slackTrabajos,
StringJoin["Trabajo ", ToString[#]] & /@ Reverse[activeTrabajos],
projectDuration, definedImageSize];
If[Visualizar  "Diagrama de Red",
GraphPlot[Trabajos, DirectedEdges  True, VertexLabeling  True,
ImageSize  definedImageSize, Method  SpringEmbedding],
If[Visualizar  "Indicadores",
Pane[
Text @
Grid[{{"Trabajo", "Trabajo crítico?", "inicio/temprano", "inicio/tarde",
"fin temprano", "fin con retraso", "duración", "holgura"},
{"Trabajo 1", IsTrabajoCritical[criticalTrabajos, 1],
0, lateStartTrabajo1, earlyFinishTrabajo1,
lateFinishTrabajo1, Trabajo1Duration, slackTrabajo1},
{"Trabajo 2", IsTrabajoCritical[criticalTrabajos, 2],
earlyStartTrabajo2, lateStartTrabajo2, earlyFinishTrabajo2,
lateFinishTrabajo2, Trabajo2Duration, slackTrabajo2},
{"Trabajo 3", IsTrabajoCritical[criticalTrabajos, 3],
earlyStartTrabajo3, lateStartTrabajo3, earlyFinishTrabajo3,
lateFinishTrabajo3, Trabajo3Duration, slackTrabajo3},
{"Trabajo 4", IsTrabajoCritical[criticalTrabajos, 4],
earlyStartTrabajo4, lateStartTrabajo4, earlyFinishTrabajo4,
lateFinishTrabajo4, Trabajo4Duration, slackTrabajo4},
{"Trabajo 5", IsTrabajoCritical[criticalTrabajos, 5],
earlyStartTrabajo5, lateStartTrabajo5, earlyFinishTrabajo5,
lateFinishTrabajo5, Trabajo5Duration, slackTrabajo5}},
Frame  All], definedImageSize], ganttChart]],
Style["Duración de Trabajos", Bold],
{{Trabajo1Duration, 5, "Trabajo 1"}, 1, 10, 1,
ImageSize  Tiny, Enabled  ! (Visualizar  "Diagrama de Red")},
{{Trabajo2Duration, 5, "Trabajo 2"}, 1, 10, 1, ImageSize  Tiny,
Enabled  ! (Visualizar  "Diagrama de Red")},
{{Trabajo3Duration, 5, "Trabajo 3"}, 1, 10, 1, ImageSize  Tiny,
Enabled  ! (Visualizar  "Diagrama de Red")},
{{Trabajo4Duration, 5, "Trabajo 4"}, 1, 10, 1, ImageSize  Tiny,
},
8 | Seminario de Wolfram Mathematica Avanzado

Enabled  ! (Visualizar  "Diagrama de Red")},


{{Trabajo5Duration, 5, "Trabajo 5"}, 1, 10, 1, ImageSize  Tiny,
Enabled  ! (Visualizar  "Diagrama de Red")},
Style[""],
Style["Lista de precedencias", Bold],
Item["predecesores del Trabajo 2", Alignment  Center],
{{Trabajo1PrecedesTrabajo2, True, "Trabajo 1"},
{True, False}, ImageSize  Tiny},
Item["predecesores del Trabajo 3", Alignment  Center],
{{Trabajo1PrecedesTrabajo3, True, "Trabajo 1"},
{True, False}, ImageSize  Tiny},
{{Trabajo2PrecedesTrabajo3, True, "Trabajo 2"},
{True, False}, ImageSize  Tiny},
Item["predecesores del Trabajo 4", Alignment  Center],
{{Trabajo1PrecedesTrabajo4, True, "Trabajo 1"},
{True, False}, ImageSize  Tiny},
{{Trabajo2PrecedesTrabajo4, False, "Trabajo 2"},
{True, False}, ImageSize  Tiny},
{{Trabajo3PrecedesTrabajo4, True, "Trabajo 3"},
{True, False}, ImageSize  Tiny},
Item["predecesores del Trabajo 5", Alignment  Center],
{{Trabajo1PrecedesTrabajo5, True, "Trabajo 1"},
{True, False}, ImageSize  Tiny},
{{Trabajo2PrecedesTrabajo5, False, "Trabajo 2"},
{True, False}, ImageSize  Tiny},
{{Trabajo3PrecedesTrabajo5, False, "Trabajo 3"},
{True, False}, ImageSize  Tiny},
{{Trabajo4PrecedesTrabajo5, True, "Trabajo 4"},
{True, False}, ImageSize  Tiny},
Style[""],
Style["Opciones a visualizar", Bold],
{{Visualizar, "Indicadores"},
{"Indicadores", "Diagrama de Gantt", "Diagrama de Red"}, MenuStyle  9,
ControlType  PopupMenu}, SaveDefinitions  True, ControlPlacement  Left,
TrackedSymbols  Manipulate, AutorunSequencing  {16}, FrameLabel 
Style"SCHEDULING CON ENTORNO DE TRABAJO DE UNA MAQUINA, SEMINARIO ESPOL "

"", Medium, Darker[Red], 16, Background  LightRed

FERNANDO SANDOYA, Ph.D.


SESIÓN 2 | 9

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

SCHEDULING CON ENTORNO DE TRABAJO DE UNA MAQUINA

Manipulaciones interactivas o gráficas


Manipulate[expr, {u, umin, umax}] genera una versión de expr con controles que permiten la manipu-
lación de u.
10 | Seminario de Wolfram Mathematica Avanzado

Manipulate[Plot[Cos[x], {x, - 2 Pi, n}], {n, 0.1, 2 Pi}]

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.

FERNANDO SANDOYA, Ph.D.


SESIÓN 2 | 11

Manipulate[g1 = ListPlot[RandomInteger[{1, 100}, {n, 2}], PlotStyle  Blue];


g2 = ListPlot[RandomInteger[{1, 100}, {m, 2}], PlotStyle  Red];
Show[g1, g2], {n, 10, 100, 1}, {m, 5, 20, 1}]

100

80

60

40

20

20 40 60 80 100

2.5 Ejercicios sesión 2.


1 - x2 para valores desde -1 a 2
3
1. Utiliza Manipulate para evaluar la expresión
2. Utiliza Manipulate para mostrar un punto del plano (pareja ordenada {x,y}, variando desde
el punto {1,2} hasta el punto {11,9}.
3. Graphics[{ Arrow[{{x1,y1},{x2,y2}}], Arrow[{{z1,w1},{z2,w2}}] }] grafica un par de flechas
con extremos dados. Grafique un par de flechas con orígen en {0,0} y extremos en {2,5} y
{8,3}
4. Combine 2. y 3. para lograr un gráfico que manipule los extremos de lso dos vectores.
5. Implemente una aplicación que permita generar una tabla de capitalización para una
inversión de capital inicial c, depósitos anuales de c1, tasa de interés i, a n años y que le
de la opción de visualizar el incremento del capital en el tiempo. Las tasas de interés
posibles son de 4%, 5%, 6%, 7 %, 8% (PopupMenu), el capital inicial cualquier valor entre
1,000 y 100,000, los depósitos anuales entre 1,000 y 10,000 (con saltos de 500$) y los
años posibles de 1 a 10. Utilice un CheckBox para decidir si se quiere tabla o gráfico.
6. Se tienen 20 individuos identificados con pesos, edades y nivel socioeconómico:
{{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}}
a. Clasificarlos en grupos homogéneos usando la función FindClusters[ ]

c. Clasificarlas indicando sus posiciones en la lista de datos: FindClusters[datos →


b. Clasificarlos en 3 grupos (usar la función FindClusters[datos,n] )

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[ ]

c. Clasificarlas indicando sus posiciones en la lista de datos: FindClusters[datos →


b. Clasificarlos en 3 grupos (usar la función FindClusters[datos,n] )

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.

FERNANDO SANDOYA, Ph.D.

Anda mungkin juga menyukai