You are on page 1of 33

Programacin con Mathematica.

Jos Salvador Cnovas Pea.


Departamento de Matemtica Aplicada y Estadstica.
Universidad Politcnica de Cartagena.
15 de noviembre de 2010
ndice general
1. Introduccin a Mathematica 2
1.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Parntesis, corchetes y llaves . . . . . . . . . . . . . . . . . . . 4
1.3. Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4. Funciones matemticas de inters . . . . . . . . . . . . . . . . 6
1.5. Aprovechando clculos anteriores . . . . . . . . . . . . . . . . 7
1.6. Denicin de variables y funciones . . . . . . . . . . . . . . . . 8
1.7. Derivadas de funciones . . . . . . . . . . . . . . . . . . . . . . 11
1.8. Representacin grca de funciones . . . . . . . . . . . . . . . 12
2. Programacin con Mathematica 14
2.1. Aritmtica de computadora . . . . . . . . . . . . . . . . . . . 15
2.1.1. Aritmtica exacta y aritmtica de redondeo . . . . . . 15
2.1.2. Aritmtica de doble precisin . . . . . . . . . . . . . . 15
2.1.3. Errores de redondeo . . . . . . . . . . . . . . . . . . . 16
2.2. Operaciones y denicin de variables. . . . . . . . . . . . . . . 17
2.2.1. Denicin de variables y funciones . . . . . . . . . . . 17
2.2.2. Funciones vectoriales . . . . . . . . . . . . . . . . . . . 19
2.2.3. Operaciones . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3. Construccin de programas con Mathematica. . . . . . . . . . 22
2.3.1. For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.2. If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4. Programando un mtodo numrico sencillo . . . . . . . . . . . 25
2.5. Presentaciones grcas . . . . . . . . . . . . . . . . . . . . . . 26
1
Captulo 1
Introduccin a Mathematica
Mathematica es un programa que permite hacer clculos matemticos
complicados con gran rapidez. Para entendernos, es como una calculadora
gigante a la que no slo podemos pedirle que haga clculos numricos, sino
que tambin hace derivadas, clculo de primitivas, representacin grca de
curvas y supercies, etctera.
Abordaremos en esta prctica una iniciacin a Mathematica partiendo
desde cero, intentando poner de maniesto su utilidad a la hora de traba-
jar con expresiones matemticas complicadas, bien sean stas numricas o
simblicas, permitiendo hacer operaciones en poco coste de tiempo y con
bastante facilidad.
Pretendemos con esta prctica introducir al alumno en el manejo de este
potente programa que puede servirle de utilidad en futuros clculos que deba
realizar. Esencialmente vamos a aprender a utilizar el programa, por lo que
esta prctica trata de explicar como pedirle a Mathematica que haga aquello
que nosotros deseamos. Adems, el programa puede utilizarse para corregir
los problemas propuestos al alumno en la clase de problemas.
A pesar de la utilidad del programa, debemos hacer hincapi en el hecho
de que es necesario por parte del alumno un conocimiento matemtico terico
de todas las funciones y sentencias que vamos a usar. Por ejemplo, aunque
una calculadora multiplica nmeros con suma facilidad, slo nos percatamos
de su potencia en cuanto conocemos dicha operacin y somos capaces de
realizarla de un modo mucho ms lento. Con Mathematica ocurre lo mismo.
Slo conociendo tericamente las operaciones que Mathematica realiza nos
percataremos de su utilidad.
2
1.1. Preliminares
Cuando se arranca Mathematica, aparece una pantalla blanca vaca. En
ella podemos escribir aquellas operaciones que queremos que realice. Una vez
tecleada la operacin, hemos de pulsar las teclas shift + enter para obtener el
resultado. Por ejemplo, supongamos que queremos hacer la operacin 2 + 2.
Teclearemos entonces
2 + 2
en la pantalla. A continuacin pulsamos maysculas + enter o la tecla intro
en el teclado numrico y a continuacin aparecer en pantalla
In[1] := 2 + 2
Out[1] = 4.
Todas las operaciones realizadas por el programa cuando se pulsan las
teclas maysculas + enter tienen asignadas un nmero de entrada marcado
por In[] y el mismo nmero de salida cuando se realiza la operacin marcado
por Out[]. Podr aparecer nicamente un n mero de entrada, como veremos
posteriormente. Al ir explicando las diferentes operaciones que Mathematica
realiza, iremos escribindolas en la forma en que el programa lo escribe en la
pantalla de ordenador.
Adems de la suma se pueden realizar las siguientes operaciones alge-
braicas como si se tratara de una calculadora:
r + suma de nmeros
r resta de nmeros
r, divisin de nmeros
r r producto de nmeros
r potencia r
j
Cuando Mathematica realiza alguna de las siguientes operaciones, por
ejemplo 1,3+2,7, operar estos nmeros ofreciendo siempre su valor exacto,
es decir, se tiene
In[2] := 1,3 + 2,7
Out[2] =
13
21
.
3
Sin embargo, a veces nos es ms til tener el valor de este nmero expre-
sado con cifras decimales. Para ello se tienen las sentencias
r,,N N[r]
N[r. :].
Las primeras escriben el nmero r con seis cifras signicativas, mientras que
la segunda escribe dicho nmero con un nmero : de cifras signicativas que
nosotros prejamos (en la versin 4.0 del programa y posteriores esta ltima
sentencia no siempre funciona del modo deseado). Por ejemplo, si escribimos
In[3] := 1,3 + 2,7 ,,N
Out[3] = 0.619048.
obtendremos el resultado con 6 cifras signicativas. Si por el contrario es-
cribimos
In[4] := `[1,3 + 2,7. 10]
Out[4] = 0.619047619
lo obtendremos con un nmero 10 cifras signicativas.
En caso de las operaciones numricas tambin tendremos una valor numri-
co aproximado con seis cifras signicativas si en la operacin escribimos algn
nmero en forma decimal. As, al teclear
In[5] := 1.,3 + 2,7
Out[5] = 0.619048.
Mathematica distingue as entre operaciones algebraicas exactas y opera-
ciones numricas aproximadas.
1.2. Parntesis, corchetes y llaves
Mathematica distingue entre parntesis, corchetes y llaves. Cada uno de
estos elementos realiza una labor bien diferenciada en la estructura interna
del programa. A grosso modo podemos indicar las siguientes generalidades:
4
Los parntesis se usan en las operaciones algebraicas para indicar la
preferencia a la hora de hacer las operaciones. As el parntesis de
In[6] := (1 + 3),7
Out[6] =
4
7
se usa para indicar que primero hacemos la suma 1+3 y luego dividimos
entre 7. Hemos de sealar que Mathematica sigue el orden conocido de
preferencia sobre las operaciones. Asi por ejemplo, si escribimos
In[7] := 1 + 3,7
Out[7] =
10
7
vemos como el resultado cambia notablemente al realizarse en primer
lugar la divisin y posteriormente la suma.
Los corchetes [] se usan para escribir el argumento de una funcin bien
sea matemtica, bien sea una operacin especca del programa. Por
ejemplo la funcin sinr se escribe Sin[x], y para escribir un nmero r
real con seis cifras signicativas escribimos N[x].
Las llaves {} se utilizan para asignar valores numricos a las variables,
por ejemplo a la hora de calcular lmites de funciones. Tambin se usan
para construir conjuntos o listas de objetos matemticos, como por
ejemplo matrices o vectores.
En general es conveniente tener claro en qu momento se han de emplear
los parntesis, los corchetes y las llaves, ya que si confundimos su uso y
escribimos por ejemplo Sin{x} o Sin(x) en lugar de Sin[x], el programa nos
lo har saber mandndonos un mensaje de error de color azul.
1.3. Errores
Puede ocurrir que al teclear una operacin en Mathematica y pulsar las
teclas mayscular + enter, el programa nos devuelva una salida conteniendo
frases de color azul. Esto ocurre cuando hay algn tipo de error o problema
que el programa detecta. Estos errores pueden ser bsicamente de dos tipos:
5
Errores en la sintaxis de una sentencia. Por ejemplo al escribir [1+2] 3
en vez de (1 + 2) 3 o N(:) en vez de N[:].
Errores producidos porque la expresin matemtica o la operacin re-
alizada tiene algn problema, aunque est bien escrita. Por ejemplo, si
intentsemos calcular el determinante de una matriz no cuadrada.
Otras veces, el programa puede devolver un resultado errneo aunque no
nos escriba frases azules. Es decir el programa no detecta ningn error a
pesar de que ste existe. Por sto es necesario saber qu estamos esperando
de la operacin que hemos pedido que el programa nos haga para as criticar
el resultado y valorarlo en su justa medida. No debeis nunca de olvidar que
el programa calcula rpidamente, pero es tonto.
1.4. Funciones matemticas de inters
Mathematica posee una serie de funciones matemticas predenidas que
se escriben del siguiente modo:
Sqrt[r] =

r Exp[r] = c
a
Log[r] = log r Log[/. r] = log
b
r
Sin[r] = sin r Cos[r] = cos r
ArcSin[r] = arcsinr ArcCos[r] = arc cos r
Tan[r] = tan r ArcTan[r] = arctanr
:! = factorial de : Round[r] = jc:tc c:tc:c dc r
Abs[r] = |r| FactorInteger[:] = ,ccto:c: j:i:o: dc :
Es importante destacar que hemos de escribir las funciones tal y como
se detalla en la anterior tabla, respetando la sintaxis totalmente. Mathe-
matica distingue entre letras maysculas y minsculas, y todas las funciones
6
empiezan con letra mayscula. Entonces podemos calcular
In[7] := Sqrt[16]
Out[7] = 4
In[8] := Sqrt[2]
Out[8] =

2
In[9] := Sqrt[2] ,,`
Out[9] = 1.41421
In[10] := N[Sqrt[7]. 10]
Out[10] = 2.6457513111.
Las constantes matemticas ms interesantes son:
Pi = : ' 3.14159
E = c ' 2.71828
Innity =
I = i =

1
Degree = co:c::i o: dc q:cdo: c :cdic:c:
Por ejemplo, para calcular el seno de 20 grados escribiramos
In[11] := Sin[20 Degree] ,,N
Out[11] = 0.34202.
Si quisiramos mayor precisin en las anteriores constantes, debemos escribir
In[12] := N[Pi,10]
Out[12] = 3.1415926536.
que nos proporciona un valor del nmero : con diez cifras decimales.
1.5. Aprovechando clculos anteriores
A veces es posible que tengamos que hacer una sucesin de clculos con-
secutivos de manera que cada nueva operacin se base en la anterior. Parece
necesaria entonces una sentencia que nos remita a resultados anteriores sin
7
tener que escribir la operacin de nuevo. Dicha sentencia es %. Por ejemp-
lo, si queremos calcular cos (sin20

) tendramos que calcular primero sin20

.
para despus calcular el coseno de dicha cantidad. Esta operacin podramos
hacerla del modo siguiente:
In[13] := Sin[20 Degree] ,,N
Out[13] = 0.34202
In[14] := Cos[ %]
Out[14] = 0.942079.
Aqu Cos[ %] nos calcula el coseno del resultado obtenido en la salida 13. Para
remitirnos a un resultado obtenido dos pasos antes debemos escribir %%, y
para resultados obtenidos k pasos antes escribiremos k smbolos %. Para re-
mitirnos a un resultado obtenido en la salida n podemos tambin escribir %n.
Por ejemplo Cos[ %13] tambin nos remite a la salida 13.
1.6. Denicin de variables y funciones
Supongamos que tenemos que hacer una serie de clculos en los cuales
interviene repetidamente una constante, como por ejemplo la constante de la
gravitacin universal, o al estudiar valores particulares de la funcin , (r) =
(1.45)
a
+sin r. Es til entonces denir variables con estos valores y funciones
nuevas para minimizar el tiempo de escritura y hacer las operaciones de forma
ms gil.
Las variables pueden ser designadas por letras o por sucesiones de letras.
Supongamos que queremos denir la constante de la gravitacin universal
G = 6.67 10
11
con Mathematica. Entonces deberamos hacer
In[15] := G = 6.67 10 11
Out[15] = 6.67 10
11
Si ahora tenemos dos cuerpos de masa 3 kilogramos separados a una distancia
de 10 metros, la fuerza con la que se atraen dichos cuerpos se calcula
In[16] := G 32,(102)
Out[16] = 6.003 10
12
.
Para desposeer a G de su valor debemos teclear
In[17] := G = .
8
o bien
In[18] := Clear[G].
Algunas letras estn asignadas ya por defecto por Mathematica y no
pueden ser utilizadas para denir variables. Una de ellas es N. Si intentsemos
escribir N=2, el programa devolver una sentencia azul de error.
A la hora de trabajar con variables en Mathematica, hemos de tener en
cuenta las siguientes reglas. Si r e son dos variables que hemos denido con
anterioridad, entonces
r representar el producto r .
r es una nueva variable formada por dos letras.
5r es el producto de 5 por r..
r2 es el producto r
2
y no r
2j
.
Por otra parte, si en una misma lnea queremos denir varias variables, o
escribir varias expresiones debemos separar estas con ;. Por ejemplo
In[19] := r = 1; = 2; . = r +
Out[19] = 3.
ha asignado el valor 1 a x, 2 a y y 3 a z, y slo ha escrito el ltimo valor. Si al
nal de la ltima expresin ponemos tambin ; la operacin no proporciona
ninguna salida, es decir la expresin
In[20] := r = 1; = 2; . = r + ;
no proporciona a continuacin un Out[20] al pulsar maysculas + enter y
asigna los mismos valores que en la sentencia anterior.
Para denir nuevas funciones hemos de usar la siguiente estructura:
nombrefuncin[r
1
_. r
2
_. .... r
a
_] := expresin.
El smbolo _ se usa para indicar que la letra que lo antecede es una variable
de la funcin. Por ejemplo, para denir la funcin , (r) = (1.45)
a
+ sinr
debemos escribir
In[21] := ,[r_] := 1.45r + Sin[r].
9
Entonces si tecleamos
In[22] := ,[1]
Out[22] := 3.18975.
obtenemos el valor de dicha funcin en 1. Para eliminar la funcin debemos
escribir
In[23] := Clear[,. r]
indicando tanto la variable como el nombre de la funcin.
Hemos visto como introducir funciones escalares, pero a menudo es nece-
sario trabajar con funciones vectoriales, por ejemplo la funcin
,(r. . .) = (r. rsin .).
que como vemos es una funcin , : R
3
R
2
. Para ello denimos la funcin
como
In[24] := ,[r_. _. ._] := {r . r Sin[.]}.
Si tecleamos ahora
In[25] := ,[1. 1. 1i]
Out[25] := {1. 0}
obtenemos un vector del plano. Para obtener las funciones coordenadas debe-
mos escribir
In[26] := ,[1. 1. 1i][[1]]
Out[26] := 1
o
In[27] := ,[1. 1. 1i][[2]]
Out[27] := 0
segn queramos trabajar con la primera o segunda coordenada.
10
1.7. Derivadas de funciones
Supongamos que tenemos una funcin de una variable real , (r
1
. r
2
. .... r
a
)
a la que queremos calcular su derivada o derivada parcial respecto de alguna
de sus variables. El comando que realiza ese clculo con Mathematica es
D[,. r] D[,. r
i
].
Por ejemplo si queremos calcular la derivada de , (r) = sin r escribiremos
In[24] := D[Sin[r]. r]
Out[24] = Cos[r].
especicando tanto la funcin como la variable respecto de la cual vamos a
derivar. Para calcular la derivada parcial con respecto a la variable de la
funcin ,(r. ) = sin(r + ) debemos escribir
In[25] := D[Sin[r + ]. ]
Out[25] = Cos[r + ].
Para calcular la derivada :sima de , (r) . hemos de proceder con el
comando
D[,. {r. :}].
As la segunda derivada de , (r) = sin r se calcula tecleando
In[26] := D[Sin[r]. {r. 2}]
Out[26] = Sin[r]
y
0
3
)
0j
3
de la funcin ,(r. ) = sin(r + ) sera
In[27] := D[Sin[r + ]. {. 3}]
Out[27] = Cos[r + ].
Si ahora queremos calcular derivadas parciales de funciones respecto de
diferentes variables hemos de indicarlo del modo siguiente
D[,. r
1
. r
2
. .... r
a
].
As por ejemplo
J
2
,
JrJ
de la funcin ,(r. ) = sin(r+) se calcula escribiendo
In[28] := D[Sin[r + ]. r. ]
Out[28] = Sin[r + ].
11
1.8. Representacin grca de funciones
Mathematica permite hacer representaciones grcas de funciones de una
y varias variables. Para ello hemos de darle tanto la funcin, como el dominio
de denicin de sta.
Para la representacin grca de funciones reales de variable real, tenemos
el comando
Plot[,[r]. {r. r
0
. r
1
}],
donde indicamos la funcin, la variable de la funcin, y un intervalo [r
0
. r
1
]
donde hacer la representacin. As, para representar la funcin , (r) = sinr
en el dominio [0. 2:] escribimos
In[30] := Plot[Sin[r]. {r. 0. 2Pi}].
1 2 3 4 5 6
-1
-0.5
0.5
1
Para representar varias funciones a la vez hemos de escribir todas las
funciones que deseemos representar entre llaves y separadas por comas, es
decir
Plot[{,
1
[r]. ,
2
[r]. .... ,
a
[r]}. {r. r
0
. r
1
}].
Si escribimos entonces
In[31] := Plot[{Sin[r]. Sin[2r]}. {r. 0. 21i}]
12
1 2 3 4 5 6
-1
-0.5
0.5
1
generaremos una representacin grca simultnea de las funciones sinr y
sin2r.
Para volver a representar grca una funcin ya representada previamente
tenemos el comando
Show[ %:].
As, si escribimos
In[33] := Show[ %31].
1 2 3 4 5 6
-1
-0.5
0.5
1
obtenemos una nueva representacin grca simultnea de las funciones sinr
y sin2r.
13
Captulo 2
Programacin con Mathematica
A continuacin vamos a explicar algunas sentencias que se utilizan para
hacer programas con Mathematica. Las principales herramientas que vamos
a necesitar para hacer los programas son las siguientes:
Cmo establecer comunicacin entre el ordenador y quien ejecuta el
programa?
Cmo contruir bucles con Mathematica?
Cmo denir funciones y variables?
Cmo interrumpir la ejecucin de un programa cuando ste est blo-
queado?
Vamos a explicar como hacer cada una de estas cosas, para poder construir
nuestro programa. En primer lugar, vamos a contestar a la primera pregunta:
para interrumpir un programa o una evaluacin de Mathematica basta con
pulsar las teclas
Alt + coma.
Para las otras cuestiones, se necesita una explicacin ms amplia que a con-
tinuacin desarrollamos.
2.1. Aritmtica de computadora
Esta seccin ha sido desarrollada a partir de los programas del profesor
David Lpez.
14
2.1.1. Aritmtica exacta y aritmtica de redondeo
La aritmtica de redondeo es mucho ms rpida que la exacta, y por eso se
utiliza en Clculo Numrico. Para ilustrar esta diferencia veamos el siguiente
experimeto para el cual necesitaremos la funcin Timing, que mide el tiempo
de CPU que se tarda en realizar la suma
a
X
i=1
1
i
2
.
Para ello, escribimos
1i:i:q[on:[1,i2. {i. 1. :}]; ]
y
1i:i:q[on:[1.,i2. {i. 1. :}]]
y damos valores a :. En el primer valor se trabaja con precisin infnita y da
la salida
{t. `n||}.
donde t es el tiempo que se tarda en realizar la operacin. La segunda ex-
presin se trabaja con aproximaciones (observar el punto detrs del 1) y
de nuevo t es el tiempo empleado en hacer los clculos. Puede verse como
a medida que aumentamos : aumenta mucho ms el tiempo empleado con
precisin innita.
2.1.2. Aritmtica de doble precisin
Cualquier calculadora u ordenador expresa los nmeros reales con no-
tacin exponencial, habitualmente utilizando base 2. Al ser nitos los recur-
sos de los que se disponen tambin han de serlo el nmero de cifras que se
pueden utilizar. Se llama epsilon de la mquina al menor nmero positivo
que sumado a uno es distinto de uno. En caso de Mathematica, el epsilon de
la maquina ($MachineEpsilon) es 2.220446049250313 10
16
. Por ejemplo,
si consideramos la desigualdad
1 + 2
a
1.
sta siempre se cumple cuando trabajamos en precisn innita. Pero si es-
cribimos
1. + 2
a
.
15
y trabajamos con precisin nita, se tiene que a partir de : = 53, la operacin
anterior nos dar el valor 0, mientras que para : = 52 obtenemos el epsin
de la mquina, que equivalen a 16 cifras signicativas en base 10. Esto no
quiere decir en absoluto que no se pudan manejar nmeros menores que 10
16
o mayores que 10
16
, puesto que tenemos bits disponibles para el exponente.
Esto nos da los siguientes nmeros mnimo ($MinMachineNumber) y mximo
($MaxMachineNumber):
2.2250738585072014 10
308
y
1.7976931348623157 10
308
.
As pues, el rango de nmeros admisibles est entre 10
308
y 10
308
. Cualquier
nmero que sea mayor que el admisible producir un .
o
verow"(error de des-
bordamiento), mientras que un nmero positivo menor que el admisible es
tratado como 0, lo que se conoce como nderow"(error de subdesbordamien-
to).
2.1.3. Errores de redondeo
La utilizacin de una aritmtica nita puede producir un error al no poder
contar con el nmero suciente de cifras para representar un nmero. Este
error, conocido como de redondeo, puede ser debido a diferentes causas. Al-
gunos nmeros no pueden ser representados con un nmero nito de cifras
decimales, entrando en esta categora los racionales peridicos y los irra-
cionales. Por ejemplo,

2.
2
2 debera valer cero, pero si lo ejecutamos
obtenemos el valor
4.44089 10
16
.
Los errores de redondeo tambin pueden producirse porque fracciones
decimales exactas pueden ser fracciones binarias peridicas. En esta categora
entran los racionales en cuyo denominador aparezcan potencias de 5 y (tal
vez) de 2. El ejemplo ms destacable es el de 1/10, fraccin claramente exacta
en aritmtica decimal, pero que no lo es en aritmtica binaria. Para observar
este error de redondeo realizaremos un bucle en el que se mostrarn los
resultados obtenidos al ir aadiendo sucesivamente la cantidad 1/10. Por
ejemplo, si escribimos
on:[1,10. {:. 1. :}] on:[1.,10. {:. 1. :}].
16
vemos que para : = 1 obtenemos cero, pero para : = 10 ya se aprecian
errores de redondeo.
2.2. Operaciones y denicin de variables.
2.2.1. Denicin de variables y funciones
Como sabemos, para denir una variable numrica basta con tomar una
letra o conjunto de letras e igualarlas al valor deseado. Por ejemplo, si quer-
emos asignar a la letra el valor 6.5, escribiremos en la pantalla
= 6.5
los que producir la siguiente respuesta en la pantalla del ordenador
In[1] := = 6.5
Out[1] = 6.5
Si lo que queremos es denir una funcin, hemos de hacerlo indicando la
variable entre corchetes segn el siguiente esquema:
Nombre[var_] := funcion.
As, para denir la funcin ,(r) = c
a
cos r hemos de escribir
In[2] := f[x_] := Exp[r] Cos[r]
Out[2] = Exp[r] Cos[r].
Otro tipo de variables bastante interesantes son las vectoriales. Podemos
denir una variable vectorial, por ejemplo de dimensin tres haciendo la
siguiente operacin
In[3] := c[1] = 5
Out[3] = 5
In[4] := c[2] = 2
Out[4] = 2
17
In[5] := c[1] = 9
Out[5] = 9
y habremos introducido el vector (5. 2. 9). Si queremos saber el valor de la
variable c hemos de escribir
In[6] := ?c
G|o/c|
0
c
c[1] = 5
c[2] = 2
c[3] = 9
o bien
In[7] := Table[c[i]. {i. 3}]
Out[7] = {5. 2. 9}.
Podemos dejar sin asignar valores al vector. Si hacemos
In[8] := Clear[c[2]]
y
In[7] := Table[c[i]. {i. 3}]
Out[7] = {5. c[2]. 9}
dejando el valor de c[2] vacio.
Para borrar las variables o las funciones utilizaremos la sentencia Clear[var
o func]. Escribiendo
Clear[]
desposeemos a del valor 6.5 asignado anteriormente.
2.2.2. Funciones vectoriales
Las funciones pueden ser tanto escalares como vectoriales. Anteriormente
hemos visto como denir funciones reales de variable real, pero se pueden
denir funciones vectoriales de varias variables reales, como por ejemplo
,(r. . .) = (c
aj
.. 2r).
18
La sintaxis es anloga al caso unidimensional, es decir, dicha funcin se
denira como
,[r_. _. ._] := {1rj[r ] .. 2 r }.
donde las variables se separan por comas y las llaves se utilizan para denir
el vector de R
2
. Una vez introducida la funcin, si tecleamos por ejemplo
,[1. 1. 0]
obtendramos como salida
Cnt[1] := {0. 2}.
que se corresponde con el vector (0. 1). La funcin anterior tiene dos funciones
coordenadas
,
1
(r. . .) = c
aj
..
,
2
(r. . .) = 2r.
y si queremos trabajar con ellas individualmente no es necesario volverlas a
introducir. Una vez ,[r. . .] ha sido introducida en el programa, podemos
utilizar las funciones coordenadas anteriores con la sintaxis
,[r. . .][[1]]
para la primera y
,[r. . .][[2]]
para la segunda. Por ejemplo, en el caso anterior, si tecleamos
,[1. 1. 0][[1]]
obtendramos como salida
Cnt[2] := 0.
2.2.3. Operaciones
Como sabemos las cuatro operaciones bsicas que tenemos son
+ Suma
Resta
Multiplicacin
, Divisin
19
junto con el smbolo =. Podemos combinar esta operaciones para obtener
otros tipos de operaciones y estructuras lgicas muy usadas en programacin.
Como las ms interesantes resumimos las siguientes:
Operaciones de Test
== Igual
! = Distinto
< Menor que
Mayor que
<= Menor o igual que
= Mayor o igual que
Operaciones Lgicas
! o Not Negacin
&& Y
|| O
True Verdad
False Falsedad
Por ejemplo, si escribimos 10 < 8, aparecer en pantalla
In[1] := 10 < 8
Out[1] = False
indicando la falsedad de la armacin. Si escribimos 7 4 y 26= 3 aparecer
In[2] := 7 4 && 2 ! = 3
Out[2] = True
indicando que las dos sentencias son verdaderas. Si ponemos una verdadera
y una falsa y escribimos
In[3] := 7 4 && 2 = 3
Out[3] = False
mientras que
In[4] := 7 4 || 2 = 3
Out[4] = True
20
Finalmente
In[5] := Not[7 < 4]
Out[5] = True
dado que lo contrario de 7 < 4 es 7 4, que es verdadero.
Otras combinaciones de smbolos que pueden resultar tiles son las sigu-
ientes:
r + + Aumenta el valor de r una unidad
r Disminuye el valor de r una unidad
+ + r Preincrementa r una unidad
r Predisminuye r una unidad
r+ = / Aumenta el valor de r / unidades
r = / Disminuye el valor de r / unidades
r = / Multiplica r por /
r, = / Divide r por /
Por ejemplo, si hacemos r = 7 y realizamos las siguientes operaciones, obten-
emos
In[6] := r + +
Out[6] = 7
donde el valor de r ahora es 8, pero en pantalla se escribe su antiguo valor.
Si hubiramos escrito
In[6] := + + r
Out[6] = 8
ahora el valor de r sigue siendo 8 y el programa escribe el valor actual. De
un modo parecido funciona con . Si escribimos
In[6] := r+ = 2
Out[6] = 9
el valor de r ser 9, igual que el que aparece en pantalla.
21
2.3. Construccin de programas con Mathe-
matica.
Uno de los temas centrales en los programas que vamos a realizar es la
construccin de bucles o procesos iterativos, los cuales han de ejecutarse un
nmero de terminado de veces. Para la una correcta creacin de bucles suele
bastar con la sentencia For, que a continuacin pasamos a explicar. Tambin
puede resultar de utilidad la sentncia If cuando se quieren poner condiciones
a la hora de elegir entre diferentes opciones. Existen ms sentencias para pro-
gramar en Mathematica que puede encontrarse en las ayudas del programa.
2.3.1. For
Tomemos por ejemplo un proceso iterativo de orden uno r
a+1
= ,(r
a
) de
los que aparecen al aplicar un mtodo numrico de orden uno. Imaginemos
por ejemplo que se trata de
r
a+1
=

r
a
+ 1.
y que partimos de la condicin inicial r
0
= 1. Por alguna razn, estamos
interesados en saber el valor de esta sucesin en 1000, esto es r
1000
. Esto
supone hacer 1000 iteraciones del proceso iterativo, que como vamos a ver
puede programarse con relativa facilidad en Mathematica con el comando
For.
La sintaxis de For es la siguiente:
For[inicio. test. incremento. expresion].
que partiendo de un valor inicial, evala la expresin a la vez que incrementa
el valor inicial hasta que el test falla. En particular, el clculo de r
1000
puede
hacerse con el siguiente programa:
r = 1.; For[: = 1. : < 1001. : + +. r = Sqrt[r] + 1]
Es preciso notar lo siguiente en el ejemplo anterior:
Hemos escrito "r = 1. y no "r = 1". El punto al nal del uno indica
que estamos trabajando con aproximaciones y no con precisin inni-
ta. Esto hace que los tiempos de computacin sean muy diferentes.
22
Mathematica puede trabajar con precisin innita, pero el tiempo que
puede tardar en hacer los clculos puede ser enorme, e incluso puede
que dichos clculos no puedan realizarse.
El For ejecuta desde 1 a 1000 el anterior proceso iterativo.
Si se ejecuta el anterior programa, ste no devuelve ninguna salida.
El For no escribe nada en pantalla. Para ello necesitamos el comando
Print. Si al programa anterior le aadimos la sentencia
Print[1| c|o: c: 1000 c: iqnc| c. r]
es decir ejecutamos el programa
r = 1.; For[: = 1. : < 1001. : + +. r = Sqrt[r] + 1];
Print[1| c|o: c: 1000 c: iqnc| c . r]
Obtenemos la salida
Cnt[1] = 1| c|o: c: 1000 c: iqnc| c 2.61803
Ntese en la sintaxis del Print el papel jugado por las comilla, que
sirven para escribir el texto, y la coma, que sirve para separar el texto
del valor numrico a la hora de que Print se ejecute.
Si ahora nos pregruntamos por el valor de r
100
, nos damos cuenta de que
debemos ejecutar de nuevo el programa, ya que ste se ha perdido durante
la ejecucin. Es decir, el valos r
100
se calcul en el paso 100, pero se borr al
ejecutar el 101. Podemos almacenar todos los valores en un vector o Array,
cuya sintaxis es la siguiente
Array[c:. :]
o
Array[c:. :. :]
donde c: es el nombre de la variable que vamos a usar, : es el nmero de
datos o longitud del vector y, en la segunda sentencia, : es el ordinal del
dato inicial. Por defecto en la primera sentencia : toma el valor 1. Para
obtener un valor concreto del vector, por ejemplo el /simo, escribimos
23
c:[/]. Modicamos el programa anterior para almacenar todos los valores
obtenidos hasta llegar a 1000 de la siguiente manera
r0 = 1.; Array[r. 1000];
For[: = 1. : < 1001. : + +. r[:] = Sqrt[r0] + 1. r0 = r[:]];
Print[1| c|o: c: 1000 c: iqnc| c . r0]
o bien
Array[r. 0. 1001]; r[0] = 1.;
For[: = 1. : < 1001. : + +. r[:] = Sqrt[r[: 1]] + 1];
Print[1| c|o: c: 1000 c: iqnc| c . r[1000]]
En cualquiera de los dos casos, para obtener r
100
bastar con ejecutar r[100].
Finalmente, si queremos modica bien el proceso iterativo o bien la condi-
cin inicial, con el anterior programa tendramos que modicarlos sobre el
mismo. Estas variables y funciones suele ser ms util denirlas al principio,
de manera que si queremos cambiarlas se pueda hace fcilmente y de forma
global. As, el programa anterior se podra renar como:
,[r_] := Sqrt[r] + 1;
: = 1000; Array[r. 0. : + 1]; r[0] = 1.;
For[i = 1. i < : + 1. i + +. r[i] = Sqrt[r[i 1]] + 1];
Print[1| c|o: c: 1000 c: iqnc| c . r[:]]
2.3.2. If
La sentencia If se emplea para establecer elementos condicionantes en
un programa. Las diferentes sintaxis con las que puede manejarse son las
siguientes.
If[condicion. ,].
Si la condicin es verdadera el programa ejecutar ,, y si es falsa no har
nada. Por ejemplo,
In[1] := If[2 1. 2 + 2]
Out[1] = 4
24
pero si escribimos
In[2] := If[2 1. 2 + 2]
no se obtendr ninguna salida. Otro tipo de expresin es la siguiente
If[condicion. ,
1
. ,
2
].
Ahora, si la condicin es cierta el programa ejecutar ,
1
y si es falsa ejecutar
,
2
. Por ejemplo
In[3] := If[1 2. 2 + 1. 2 + 2]
Out[3] = 4.
2.4. Programando un mtodo numrico sen-
cillo
Vamos a disear un programa que aproxime numricamente mediante el
mtodo de Euler la solucin del problema de condiciones iniciales


0
= t.
(t
0
) =
0
.
introduciendo las condiciones iniciales t
0
e
0
, el instante nal t
)
en el quer-
emos conocer el valor de la solucin, y el nmero de pasos : con el que este
valor se aproxima. Una posible programacin es la siguiente
f[t_. _] := t ;
: = 100; Array[. 0. :]; [0] = 1.; t0 = 0.; t, = 10.;
/ = (t, t0),:;
For[i = 1. i < : + 1. i + +. [i] = [i 1] + / f[t0 + (i 1) /. [i 1]]];
Print[El valor aproximado es [:]];
obtenindose la salida
Out[1] = El valor aproximado es 1.64762
25
2.5. Presentaciones grcas
A menudo, aparte de los datos numricos en s, es interesante tener una
representacin grca de los mismos. En el caso de la aproximacin numrica
de soluciones de ecuaciones diferenciales, stos son dados en forma de sucesin
de nmeros reales
a
, con : variando de 1 a un valor `, de manera que
.
es la aproximacin a la solucin para el tiempo t
)
que hemos elegido. En
el caso de sistemas de ecuaciones diferenciales, tendremos una sucesin de
vectores de los cuales, cada coordenada se corresponde con la aproximacin
de la funcin solucin en el instante de tiempo dado. En cualquiera de los
dos casos, es conveniente tener una manera de presentar los datos obtenidos
mediante la integracin numrica de una manera grca.
En general, el comando ListPlot permite hacer tales presentaciones me-
diante la estructura, pero previamente, tenemos que tener una manera de
introducir en Mathematica las sucesiones con las que deseamos trabajar.
Dada una sucesin de nmeros reales
a
, sta se puede introducir en
Mathematica de dos maneras. La primera es hacerlo como una lista en una
variable, que se hara con la sintaxis
1:[1] := 1 = {
1
.
2
. ....
a
}
Cnt[1] = {
1
.
2
. ....
a
}
No obstante, si tenemos muchos datos, digamos 1000, no es operativo intro-
ducirlos de esta manera. Para ello tenemos la sentencia Append, que tiene la
sintaxis
Append[1.
a+1
]
que agrega el dato
a+1
al nal de la lista 1 . Veamos cmo:
1:[1] := 1 = {2. 5. 6}
Cnt[1] = {2. 5. 6}
1:[2] := Append[1. 8]
Cnt[2] = {2. 5. 6. 8}
Supongamos ahora que deseamos introducir los mil primeros trminos de
la sucesin dada por la recurrencia
a+1
=
a
+ 2, donde
1
= 1, es decir,

a
= (1. 3. 5. 7. ...). Escribimos el siguiente programa
1 = {1}; r0 = 1; For[i = 1. i < 1000. i + +. r1 = r0 + 2;
2 = Append[1. r1]; r0 = r1; 1 = 2]
26
Una vez ejecutamos el programa, almacenaremos en 1 el valor de la sucesin.
Una manera alternativa de introducir dicha sucesin es mediante los ar-
rays, que en dimensin uno se escriben como
Array[1. :].
Esta sentencia genera automticamente un vector que tiene por coordenadas
1 [1],1 [2],...,1 [:], que en principio estar vaco de contenido. Para introducir
la sucesin anterior escribiramos el programa
Array[1. 1000]; r0 = 1; For[i = 1. i < 1001.
i + +. 1 [i] = r0; r1 = r0 + 2; r0 = r1]
Si deseamos que en el array anterior el ndice empiece a contar de cero,
debemos usar la forma
Array[1. :. 0].
Diferentes alternativas para estas sentencias pueden consultarse en la ayu-
da del programa. Pasemos a ver cmo representar grcamente la informacin
con el comando ListPlot, que tiene cualquiera de las siguientes estructuras
ListPlot[1 ]

ListPlot[Array[1. 1000]]
segn hallamos introducido la sucesin de una u otra manera. As, tanto el
programa
1 = {1}; r0 = 1; For[i = 1. i < 1000. i + +. r1 = r0 + 2;
2 = Append[1. r1]; r0 = r1; 1 = 2]; ListPlot[1 ]
como su alternativa
Array[1. 1000]; r0 = 1; For[i = 1. i < 1001. i + +. 1 [i] = r0;
r1 = r0 + 2; r0 = r1]; ListPlot[Array[1. 1000]]
nos devuelven la grca dada en la gura 2.1.
27
Figura 2.1: Representacin grca proporcionada por la salida del comando
ListPlot.
El comando ListPlot tiene la opcin de unir dos puntos consecutivos con
una recta. Tendra la sintaxis
ListPlot[1. PlotJoined True]

ListPlot[Array[1. :]. PlotJoined True]


Veamos como obtener una informacin grca de de aproximacin que ob-
tuvimos del problema de condiciones iniciales generado a partir de la ecuacin

0
= t. Para ello, basta modicar el programa anterior segn se indica
f[t_. _] := t ;
: = 100; Array[. 0. :]; [0] = 1.; t0 = 0.; t, = 10.;
/ = (t, t0),:;
For[i = 1. i < : + 1. i + +. [i] = [i 1] + / f[t0 + (i 1) /. [i 1]]];
ListPlot[Array[. :. 0]. PlotJoined True];
obtenemos la gura 2.2 como aproximacin de la solucin con condicin ini-
cial (0) = 1, donde el tiempo nal es 10 y el nmero de pasos 1000.
Como puede apreciarse en la grca 2.2, en el eje r aparecen datos hasta
100, que se corresponden con el nmero de pasos. Si hubisemos elegido 1000
pasos, aparecera obviamente 1000 al ser stos en nmero de elementos en la
28
Figura 2.2: Aproximacin de la solucin del problema de condiciones inciales.
sucesin generada. Podemos hacer una representacin grca donde el eje r
recorra el intervalo de denicin de la funcin solucin de la siguiente manera
f[t_. _] := t ;
: = 100; Array[. 0. :]; [0] = 1.; t0 = 0.; t, = 10.;
/ = (t, t0),:; : = {{t0. [0]}};
For[i = 1. i < : + 1. i + +. [i] = [i 1] + / f[t0 + (i 1) /. [i 1]];
:1 = Append[:. {t0 + i /. [i]}]; : = :1];
ListPlot[:. PlotJoined True];
es decir, deniendo una sucesin : de vectores del plano, y representando
sta como muestra la gura 2.3
A veces, es necesario tener que representar a la vez dos sucesiones. Por
ejemplo, las soluciones aproximadas y exacta de una ecuacin diferencial para
conocer o estimar la bondad de la aproximacin. Por ejemplo, la solucin del
problema


0
= t.
(0) = 1.
es
(t) = c
t
2
2
.
Supongamos que queremos ver una representacin grca conjunta de dicha
funcin y su aproximacin en el intervalo [0. 1] mediante 100 pasos. Para
29
Figura 2.3: Representacin de la solucin en el dominio de denicin.
ello, generamos los valores de la solucin exacta en los 100 puntos donde
obtenemos la aproximacin numrica con el programa
q[t_] := Exp[t2,2]; t0 = 0.; t, = 1; : = 100; / = (t, t0),:;
q:c, = {{t0. q[t0]}}; 1o:[i = 1. i < 101. i + +. t1 = t0 + /; t0 = t1;
q:c,1 = Append[q:c,. {t0. q[t0]}]. q:c, = q:c,1]
Igualmente, ejecutamos el programa anterior para obtener la solucin aprox-
imada almacenada en la variable :. Sin embargo, para representar ambas
funciones a la vez hemos de activar un paquete especial de Mathematica
tecleando
<< GraphicsMultipleListPlot
A continuacin utilizamos la sentencia MultipleListPlot, que permite repre-
sentar varias sucesiones con la siguiente sintaxis
MultipleListPlot[{:. q:c,}. PlotJoined True]
que da lugar a la grca 2.4. Otras opciones para esta sentencia pueden verse
en el manual del programa.
30
Figura 2.4: Representacin conjunta de las soluciones aproximada y exacta
del problema de condiciones iniciales.
31
Bibliografa
[1] M.L. Abell y J.P. Braselton, Dierential Equations with Mathematica,
Ed. AP Proessional.
[2] Stephen Wolfram, The Mathematica Book, Wolfram Media, Cambridge
University Press.
[3] E. Castillo y otros, Mathematica, Ed. Paraninfo.
32

You might also like