Manual para empezar

Anuncio
Leve aproximación al programa Mathematica:
Manual para empezar
La idea es que al leer esto te sea más fácil comenzar a usar el programa. Seguramente lo que aquí se incluye corresponde
a un décimo de todo lo que es posible hacer con el software, así que no bases tu manejo solamente en este manual porque
esto es sólo un pequeño muestrario de lo que se puede hacer. Es muy recomendable recurrir al Help siempre que sea
necesario, ya que es una muy buena guía (el mejor Help que se haya visto por ahí) y se aprende mucho al ocuparlo. Por
supuesto que tú debes repetir todo lo que aquí se muestra, porque es la única manera de aprender.
Cristóbal Espinoza, Marzo 2003.
Uso y manejo de funciones definidas por uno mismo
Asignaciones
Muchas veces ocurre que una letra, palabra, o lo que sea, tiene algún valor asociado. Digamos que la letra A vale diez,
entonces la manera de comunicarle eso al sistema es escribirlo en una linea aparte y luego presionar Shift−Enter o Intro.
Esto último es para que el computador se entere de la asignación. Veamos:
In[1]:=
Out[1]=
A = 10
10
El computador nos responde "10", es decir que ha entendido el mensaje. Eso que dice In[1]:= y luego Out[1]:= lo pone el
computador después de hacer Shift−Enter y no tiene mayor importancia por ahora; tú solamente debes escribir la asignación y listo. Si no queremos que el computador nos responda agregamos un ";" (punto y coma) depués de la asignación:
In[2]:=
A = 10;
Si de pronto olvidamos el valor de A y queremos saber cuánto vale podemos averiguarlo poniendo "A" y presionando
Shift−Enter (o Intro):
In[3]:=
Out[3]=
A
10
¿Qué pasará si reasignamos el valor de A ? Digamos
In[4]:=
A = 15;
Lo que ocurre es que simplemente tomará el nuevo valor :
In[5]:=
Out[5]=
A
15
Asignemos un valor a la palabra casa :
In[6]:=
casa = -1  2;
2
manual.nb
Ahora podemos hacer cualquier cosa con las dos asignacones que hemos hecho, por ejemplo digamos que la letra K es
igual a sumarlos y dividirlos por 32:
In[7]:=
Out[7]=
k = Hcasa + AL  32
29
€€€€€€€
64
Si queremos el valor munérico de la fracción usamos la función N[] que entrega el valor numérico de lo que pongamos
dentro.
In[8]:=
Out[8]=
N@kD
0.453125
®Esta función está predefinida, viene con el programa.
Uso de funciones
à Definir una función
Es posible definir funciones analíticas y luego evaluarlas, graficarlas, derivarlas, integrarlas, etc.
Para definir una función debemos asignarle un nombre e indicar su variable. Además debemos ser cuidadosos en la
sintáxis. Por ejemplo definamos una parábola:
In[9]:=
Out[9]=
f@x_D = x ^ 2
x2
Notemos que la variable x lleva un "_". Esto es para que el computador entienda que se trata de una variable muda, es
decir que puede llevar cualquier nombre o valor. Es importante recordar esto para evitar posibles errores, ya que si se
hubiese escrito f[x]=x^2 se habría asignado el valor x^2 al objeto f[x] en vez de a la función f. Por ejemplo,
evaluemos la función f con la variable y:
In[10]:=
Out[10]=
f@yD
y2
Evaluemos ahora en un valor cualquiera :
In[11]:=
Out[11]=
f@2D
4
Además, si no se ha cerrado el programa o borrado el kernel (quit kernel en los menús), el sistema recuerda siempre
las asignaciones anteriores:
In[12]:=
Out[12]=
N ž Hf@AD + f@casaDL
225.25
® El uso del símbolo "@" equivale al uso de los paréntesis cuadrados.
Por supuesto, es posible definir funciones aún más complicadas:
In[13]:=
Out[13]=
g@z1_D = a * Log@z1 * Cos@z1DD + b * Sin@a * b  z1D
ab
a Log@z1 Cos@z1DD + b SinA €€€€€€€€ E
z1
Intentemos evaluar g aún sin haber asignado los valores a y b:
3
manual.nb
In[14]:=
Out[14]=
[email protected]
-1.62957 a + b Sin@5. a bD
®Las funciones como Cos[t], Sin[t],Log[t] y muchas otras vienen predefinidas y sólo hay que escribirlas correctamente (Por ejemplo, empiezan
con mayúscula).
à Graficar funciones
En dos dimensiones
Para graficar utilizamos la función Plot[ ]de la siguiente manera:
In[15]:=
Plot@f@sopaD, 8sopa, -10, 10<D
100
80
60
40
20
-10
Out[15]=
-5
5
10
… Graphics …
Hemos graficado la función f, antes definida, usando la variable sopa. Cambiemos el intervalo en el que estamos
graficando y evitemos que el computador nos responda "− Graphics −":
In[16]:=
Plot@f@uD, 8u, 0, 5<D;
25
20
15
10
5
1
Intentemos graficar g@xD :
2
3
4
5
4
manual.nb
In[17]:=
Plot@g@xD, 8x, 1, 2<D;
Plot::plnr :
g@xD is not a machine-size real number at x = 1.0000000416666666‘.
Plot::plnr :
g@xD is not a machine-size real number at x = 1.0405669915729157‘.
Plot::plnr :
g@xD is not a machine-size real number at x = 1.0848087998593736‘.
General::stop :
Further output of Plot::plnr will be suppressed during this calculation.
1
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
1
¿Qué ha pasado? Es evidente; no han sido asignados los valores a y b. Entonces los asignamos :
In[18]:=
a = 1; b = 3;
Veamos ahora
In[19]:=
Plot@g@xD, 8x, 0.1, 2<D;
Plot::plnr :
g@xD is not a machine-size real number at x = 1.5978730890706745‘.
Plot::plnr :
g@xD is not a machine-size real number at x = 1.5763846111565272‘.
Plot::plnr :
g@xD is not a machine-size real number at x = 1.5718463876796263‘.
General::stop :
Further output of Plot::plnr will be suppressed during this calculation.
2
1
0.25
0.5
0.75
1
1.25
1.5
-1
-2
-3
-4
-5
El problema ahora fue que la función no está definida en x=Π/2. Probemos un intervalo en el que no haya problemas:
5
manual.nb
In[20]:=
Plot@g@xD, 8x, Pi  16, Pi  3<D;
2
1
0.2
0.4
0.6
0.8
-1
-2
-3
-4
En tres dimensiones
Primero es necesario que definamos una función de dos variables. La manera de hacerlo es simple, probemos una
gaussiana:
In[21]:=
H@x_, y_D = Exp@-Hx ^ 2 + y ^ 2LD;
Ahora la graficamos con la función Plot3D[ ]:
In[22]:=
Plot3D@H@x, yD, 8x, -2, 2<, 8y, -2, 2<D;
1
0.75
0.5
0.25
0
-2
2
1
0
-1
-1
0
1
2 -2
Otras operaciones con gráficos
Animaciones
Es posible ver en una especie de película una serie de gráficos. Veamos una cuerda:
Supongamos que está decrita por
In[23]:=
Out[23]=
Cuerda@x_, t_D = Sin@tD * Sin@xD
Sin@tD Sin@xD
Grafiquemos a lo largo de un periodo para tres tiempos distintos (o sea para tres valores de la variable t):
6
manual.nb
In[24]:=
Plot@8Cuerda@x, 2D, Cuerda@x, 1D, Cuerda@x, 3D<, 8x, 0, 2 * Pi<D;
0.75
0.5
0.25
1
2
3
4
5
6
-0.25
-0.5
-0.75
®Para graficar varias funciones al mismo tiempo las ponemos entre llaves y separadas por una coma, o sea un vector de funciones.
Ahora hacemos una tabla de gráficos, cada uno para un tiempo distinto:
lote = Table@
Plot@Cuerda@x, iD, 8x, 0, 2 * Pi<, PlotRange ® 8-1, 1<D, 8i, 0, 6.5, 0.5<D;
®Estamos usando la función Table[ ], que genera una matriz de elementos, ya sea de valores numéricos, o de objetos tipo gráfico, de acuerdo
a la iteración del parámetro i, que varía, en este caso, entre 0 y 6, en intervalos de 0.5
®La opción PlotRange, en la función Plot[], es para indicar el rango vertical en el cual se va agraficar. Existen muchas opciones, que puedes
averiguarlas poniendo ??Plot[ ]. Y de la misma manera para otras funciones.
Al ejecutar este comando (con Shift−Enter o Intro) aparecen todos los gráficos hacia abajo. "lote" es ahora un
conjunto (Tabla) de gráficos. Si se hace doble click sobre alguno de ellos se verá una animación de todos los
gráficos.
Arreglos; disponer gráficos a gusto y placer.
Definamos algunas funciones:
In[25]:=
f1@x_D = Sin@1 * xD  x;
f2@x_D = Sin@2 * xD  x;
f3@x_D = Sin@10 * xD  x;
f4@x_D = Sin@30 * xD  x;
Lo que queremos es graficarlas en un arreglo de manera que aparezcan todos los gráficos ordenados en un mismo
cuadro.
Creamos los gráficos:
In[29]:=
g1 = Plot@f1@xD,
g2 = Plot@f2@xD,
g3 = Plot@f3@xD,
g4 = Plot@f4@xD,
8x,
8x,
8x,
8x,
0.1,
0.1,
0.1,
0.1,
10<,
10<,
10<,
10<,
DisplayFunction ® IdentityD;
DisplayFunction ® IdentityD;
DisplayFunction ® IdentityD;
DisplayFunction ® IdentityD;
®Eso de "DisplayFunction−>Identity"es para que el gráfico no sea mostrado de inmediato.
Y ahora le decimos que los muestre, con la función Show[]:
7
manual.nb
In[33]:=
Show@GraphicsArray@88g1, g2<, 8g3, g4<<DD;
0.6
0.8
0.6
0.4
0.2
0.4
0.2
2
4
6
8
10
-0.2
4
6
8
10
6
8
10
0.75
0.5
0.25
0.75
0.5
0.25
-0.25
-0.5
-0.75
2
-0.2
-0.4
2
4
6
8
10
2
4
-0.25
-0.5
-0.75
®Notar que la función GraphicsArray[ ] recibe como argumento un vector, o una matriz (como en el ejemplo) y es según eso cómo se
dispondrán los diferentes gráficos. Probar con GraphicsArray[{g1,g2,g3,g4}] ó GraphicsArray[{g1},{g2},{g3},{g4}].
à Operar con las funciones
Una vez definida una función es posible realizar con ella todas las operaciones básicas; sumarle algo, ya sea otra
función, un valor, una letra aún no asignada, etc. multiplicarla, restarla y dividirla. Además es posible definir funciones a partir de otras funciones, etc. El programa trae consigo dos importantes funciones: una para derivar y otra para
integrar. Lo relevante es que pueden hacerlo analíticamente.
Derivar
Para esto ocupamos el símbolo de derivar que aparece en la paleta Basic Input (menú: File/Palettes/..) o directamente la función D[]. Existe también la función Derivative[] con sus opciones y mucho más. Hay que mirar el
Help.
Recordemos la función f y derivémosla :
In[34]:=
Out[34]=
In[35]:=
Out[35]=
f@xD
x2
D@f@xD, xD
2x
®La función D[ ] tiene dos argumentos, el primero es el objeto a derivar y el segundo corresponde a la variable de derivación.
Podemos derivar cosas más complicadas. Ocupemos la función g que definimos antes, pero antes borremos los
valores de los parámetros a y b:
In[36]:=
Clear@a, bD
La función es
8
manual.nb
In[37]:=
Out[37]=
g@xD
ab
a Log@x Cos@xDD + b SinA €€€€€€€€ E
x
y su derivada es
In[38]:=
Out[38]=
D@g@xD, xD
ab
a b2 Cos@ €€€€€€
a Sec@xD HCos@xD - x Sin@xDL
x D + €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
- €€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€€€
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€
2
x
x
Podemos simplificar:
In[39]:=
Out[39]=
Simplify@D@g@xD, xDD
ab
2
a Hx - b2 Cos@ €€€€€€
x D - x Tan@xDL
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€€€€€
2
x
... o de otra manera (ver detalles de estas funciones en el Help)
In[40]:=
Out[40]=
FullSimplify@D@g@xD, xDD
ab
a Hx - b2 Cos@ €€€€€€
x €DL
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€
€€€€€€€ - a Tan@xD
2
x
Integrar
Usamos la función Integrate[ ] o los símbolos de la paleta Basic Input.
Veamos si es posible hacer la integral indefinida de g[x]
In[41]:=
Out[41]=
Integrate@g@xD, xD
1
ab
€€€€ ä a x2 - a Jx + b2 CosIntegralA €€€€€€€€ EN - a x Log@1 + ã2 ä x D +
2
x
1
ab
a x Log@x Cos@xDD + €€€€ ä a PolyLog@2, -ã2 ä x D + b x SinA €€€€€€€€ E
2
x
Feo, pero qué le vamos a hacer. Hagamos una integral definida:
In[42]:=
Out[42]=
Integrate@n * Exp@-q * x ^ 2D, 8x, -Infinity, Infinity<D
¥
!!!!
2
Π
n IfARe@qD > 0, €€€€€€€€€
,
ã-q x â xE
à
!!!!
q
-¥
!!!! !!!!
Nos dice que si la parte real de q es mayor que cero entonces la integral es n * I Π ‘ q M , y si no, no sabe hacerlo.
También es posible hacer integrales numéricamente. Probemos hacer la integral de g en algun intervalo razonable.
Para eso hay que darle valores a a y b, entonces, por ejemplo, podemos hacer una función que dependa de estos
valores:
In[43]:=
funcion@a_, b_D := NIntegrate@g@xD, 8x, Pi  6, Pi  3<D
Ahora intentamos evaluar la integral para cualquier valor de a y de b:
9
manual.nb
In[44]:=
Out[44]=
funcion@1, 2D
NIntegrate::inum : Integrand
-0.588138 a + b [email protected] a bD is not numerical at 8x< = 80.785398<.
Π
Π
NIntegrateAg@xD, 9x, €€€€ , €€€€ =E
6
3
No funciona. ¿Por qué? Es porque la dependencia en a y b no está explícita y no la entendió. Creemos una función
g2 que ya tenga como variables a a y b:
In[45]:=
Out[45]=
g2@x_, a_, b_D = g@xD
ab
a Log@x Cos@xDD + b SinA €€€€€€€€ E
x
Entonces ahora sí es posible definir nuestra "función", ya que la dependencia en a y b es explícita:
In[46]:=
funcion@a_, b_D := NIntegrate@g2@x, a, bD, 8x, Pi  6, Pi  3<D
Ahora evaluamos:
In[47]:=
Out[47]=
funcion@1, 2D
0.109469
Podemos hacerlo para otros valores de a y b:
In[48]:=
Out[48]=
funcion@-1, 0D
0.330295
®El símbolo ":=" es más que una asignación. Si te das cuenta, además de servir como asignación hace que la operacion definida no sea
ejecutada inmediatamente sino cuando se le llame más adelante. O sea, es como un pequeño programa que luego será ejecutado.
Uso de vectores y matrices
Vectores
Definamos un par de vectores en tres dimensiones:
In[1]:=
Out[1]=
Out[2]=
v1 = 8a1, b1, c1<
v2 = 8a2, b2, c2<
8a1, b1, c1<
8a2, b2, c2<
®Notar que un vector es tal si los paréntesis que ocupas son del tipo "de llave = { }"
Podemos hacer el producto punto entre ellos:
In[3]:=
Out[3]=
Dot@v1, v2D
a1 a2 + b1 b2 + c1 c2
10
manual.nb
o también, que resulta ser lo mismo
In[4]:=
Out[4]=
v1.v2
a1 a2 + b1 b2 + c1 c2
También el producto cruz:
In[5]:=
Out[5]=
Cross@v1, v2 D
8-b2 c1 + b1 c2, a2 c1 - a1 c2, -a2 b1 + a1 b2<
Y ojo con esta multiplicación:
In[6]:=
Out[6]=
v1 * v2
8a1 a2, b1 b2, c1 c2<
Matrices
Definamos un par de ellas:
In[7]:=
M = 88m11, m12, m13<, 8m21, m22, m23<, 8m31, m32, m33<<;
P = 88p11, p12, p13<, 8p21, p22, p23<, 8p31, p32, p33<<;
® Te das cuenta que es un vector de vectores?
Podemos verlas en el formato tradicional:
In[9]:=
MatrixForm@MD
m11 m12 m13 y
i
z
j
z
j
z
j
z
j
j m21 m22 m23 z
m31
m32
m33
{
k
Out[9]//MatrixForm=
Veamos la multiplicación:
In[10]:=
[email protected]
m11 p11 + m12 p21 + m13 p31 m11 p12 + m12 p22 + m13 p32 m11 p13 + m12 p23 + m13 p33 y
i
z
j
z
j
z
j
j
z
j m21 p11 + m22 p21 + m23 p31 m21 p12 + m22 p22 + m23 p32 m21 p13 + m22 p23 + m23 p33 z
m31
p11
+
m32
p21
+
m33
p31
m31
p12
+
m32
p22
+
m33
p32
m31
p13
+
m32
p23
+
m33
p33
{
k
Out[10]//MatrixForm=
También es posible sacar el determinante, los valores propios, la inversa,etc. Para eso te recomiendo mirar el Help. (List
and Matrices/Vector(Matrix)operation)
®En el programa todo lo que esté escrito entre llaves y separado por comas debidamente es un vector o una mtriz y responderá a las propiedades de
estos.
Además, como es de esperar, podemos multiplicar matrices con vectores y todas las mezclas posibles:
In[11]:=
Out[11]=
8a1 m11 + b1 m12 + c1 m13, a1 m21 + b1 m22 + c1 m23, a1 m31 + b1 m32 + c1 m33<
M.v1
11
manual.nb
Resolución de ecuaciones
Usar funciones Solve[], NSolve[] para ecuaciones (o sistemas de ecuaciones) algebraicas y DSolve[]y
NDSolve[]para ecuaciones (o sistemas de ecuaciones) diferenciales. Lo mejor es ver el Help, aquí solo te muestro un
ejemplo. Ojo, porque no es la única manera de hacer lo mismo.
Ejemplo
à Sistema de ecuaciones diferenciales, dos dimensiones:
Supongamos que hay un planeador que se mueve con con velocidad v[t] y un ángulo Θ[t] con la horizontal. La
interacción con el aire está caracterizada por un parámetro d. El movimiento es modelado por un sistema de ecuaciones diferenciales acopladas:
In[1]:=
Out[1]=
Out[2]=
eq1@d_D = -Sin@Θ@tDD - d v@tD ^ 2 Š D@v@tD, tD
eq2 = -Cos@Θ@tDD + v@tD ^ 2 Š v@tD D@Θ@tD, tD
-Sin@Θ@tDD - d v@tD2 == v¢ @tD
-Cos@Θ@tDD + v@tD2 == v@tD Θ¢ @tD
Lo que se ha hecho es asignarle a cada ecuación un nombre (eq1[d] y eq2); la utilidad de esto es que luego al solo
poner el nombre se está diciendo que hay una igualdad entre dos términos, o sea la ecuación. Mira el Help y verás
que no hay porqué hacerlo de esta manera.
Se ha definido la primera ecuación como función del parámetro d. La igualdad con doble signo igual, en las ecuaciones, es para asignar la igualdad entre los dos términos; es indispensable que así se escriba una ecuación.
La solución del sistema se buscará numéricamente, así que lo que hacemos es, primero, definir el valor máximo de la
variable t, y luego plantear la solución como función del parámetro d (también podría hacerse como función de las
condiciones iniciales, o simplemete con todo ya predefinido):
In[3]:=
tmax = 35;
sol1@d_D :=
NDSolve@8eq1@dD, eq2, v@0D Š 1, Θ@0D Š 1<, 8v@tD, Θ@tD<, 8t, 0, tmax<D
Estamos resolviendo para las funciones v[t] y Θ[t] con t entre cero y tmax y con las condiciones iniciales v[0]=1
y Θ[0]=1. La solución (ambas funciones v[t] y Θ[t]) es función de d y se llama sol1[d].
Ahora creamos un par de soluciones, para d=0.0:
In[5]:=
x1@t_D = v@tD . Flatten ž [email protected];
y1@t_D = Θ@tD . Flatten ž [email protected];
®Lo que se está haciendo es asignar a la función x1[t] la función v[t] bajo la condición d=0.0 y a la función y1[t] se le está
asignando Θ[t] también bajo d=0.0. Entonces tenemos las dos soluciones que queremos para un valor dado de d (en este caso d=0).
®Acerca de la función Flatten[] es mejor que veas el Help. Lo que hace es quitar los paréntesis de más afuera. El símbolo "/." sirve para
asignar.
Hacemos otros tres par de soluciones para diferentes valores de d:
In[7]:=
x2@t_D = v@tD . Flatten ž [email protected];
y2@t_D = Θ@tD . Flatten ž [email protected];
12
manual.nb
In[9]:=
In[11]:=
x3@t_D = v@tD . Flatten ž [email protected];
y3@t_D = Θ@tD . Flatten ž [email protected];
x4@t_D = v@tD . Flatten ž [email protected];
y4@t_D = Θ@tD . Flatten ž [email protected];
y las graficamos en un arreglo:
In[18]:=
In[22]:=
graph1 = ParametricPlot@8x1@tD, y1@tD<, 8t, 0, tmax<,
DisplayFunction ® Identity, PlotLabel ® "d=0.0", AxesLabel ® 8"v", "Θ"<D;
graph2 = ParametricPlot@8x2@tD, y2@tD<, 8t, 0, tmax<,
DisplayFunction ® Identity, PlotLabel ® "d=0.05", AxesLabel ® 8"v", "Θ"<D;
graph3 = ParametricPlot@8x3@tD, y3@tD<, 8t, 0, tmax<,
DisplayFunction ® Identity, PlotLabel ® "d=0.2", AxesLabel ® 8"v", "Θ"<D;
graph4 = ParametricPlot@8x4@tD, y4@tD<, 8t, 0, tmax<,
DisplayFunction ® Identity, PlotLabel ® "d=0.4", AxesLabel ® 8"v", "Θ"<D;
Show@GraphicsArray@88graph1, graph2<, 8graph3, graph4<<DD;
Θ
Θ
d=0.0
1
1
0.5
0.5
v
0.250.50.75 1 1.251.5
0.250.50.75 1 1.251.5
-0.5
-0.5
-1
-1
d=0.2 Θ
Θ
-0.376
-0.14
-0.16
-0.18
0.94 0.96 0.98
-0.22
-0.24
-0.26
d=0.05
d=0.4
-0.378
1.02
v
0.958
-0.382
-0.384
-0.386
v
0.962
0.964
0.966
0.968
v
Descargar