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]= g@0.2D -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 Sin@1.27324 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]:= MatrixForm@M.PD 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 sol1@0.0D; y1@t_D = Θ@tD . Flatten sol1@0.0D; ®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 sol1@0.05D; y2@t_D = Θ@tD . Flatten sol1@0.05D; 12 manual.nb In[9]:= In[11]:= x3@t_D = v@tD . Flatten sol1@0.2D; y3@t_D = Θ@tD . Flatten sol1@0.2D; x4@t_D = v@tD . Flatten sol1@0.4D; y4@t_D = Θ@tD . Flatten sol1@0.4D; 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