GIIT_AMA_1314_Tutorial_con_programacion

1534 days ago by trinidad

Introducción a Sage

0. Usando la interfaz

Para introducir la operación que se desea evaluar, hay que mover el cursor hasta que aparezca una línea azul. Pulsando el botón izquierdo nos aparecerá un cuadro (celda) como el siguiente:

 
       

Ejercicio 1. Pulsa con el ratón para crear una celda a continuación de este texto.

 
       

Dentro de las celdas se escribe la operación que se desea evaluar y se pulsa el enlace evaluate o <shift>+<Intro>. (Para evaluar una celda tienes que estar dentro de ella, si no no verás el botón de evaluar).

1+1 
       
2
2

Ejercicio 2. Crea una celda a continuación de este texto y calcula cuanto es 2+2.

 

 
       

Si lo que queremos es un cuadro de texto, para escribir explicaciones, responder preguntas, etc, debemos pulsar <shift> a la vez que el botón izquierdo del ratón. Para guardar lo que hemos escrito, hay que pulsar "Save changes".

Ejercicio 3. Crea una celda de texto, escribe "hola mundo" y guárdalo.

 
       

Podemos guardar el documento con el que estamos trabajando pulsando "Save" en el menú superior. También podemos hacer una copia en el disco duro usando el menú:

file->Save workshet to a file

Esto nos creará un archivo que podemos recuperar más tarde (por ejemplo si hemos borrado algo por equivocación y luego lo hemos salvado).

Ejercicio 4. Guarda este documento. Después salva una copia en el disco duro.

 
       

Para buscar ayuda sobre como se utiliza una función, podemos usar la función "help". Por ejemplo, si queremos conocer cómo funciona la orden "plot", obtendríamos información así:

help(plot) 
       

1. Sage como una calculadora

Podemos utilizar Sage como cualquier (potente) calculadora científica

2+34 
       
42*34 
       
5-5*3 
       
32.23/234.1 
       
2^10 
       
exp(4.5) 
       
90.0171313005218
90.0171313005218
sqrt(2.4) 
       

Las funciones trigonométricas reciben los ángulos en radianes.

sin(90.0) 
       
cos(90.0) 
       
sin(3.1416) 
       
-7.34641020664359e-6
-7.34641020664359e-6

Una diferencia importante es que Sage trata de trabajar siempre sin redondeos. Así, por ejemplo, si usamos fracciones, no las escribirá como número real.

1/2+1/3 
       
5/6
5/6
(2/4)^23 
       
1/8388608
1/8388608

Algo similar ocurre con el número pi y el número e.

2+pi 
       
pi + 2
pi + 2
e^3 
       
sin(pi/3) 
       

Para trabajar con el número pi numéricamente, debemos escribir pi.n(). Análogamente, e.n().

pi.n() 
       
sin(pi.n()) 
       
e.n() 
       

Ejercicio 5. Calcula el resultado de las siguientes operaciones:


$2+5*6$,     $\dfrac{1+3^2}{1-2^3}$,     $e^{4-\dfrac{1}{2}}$,     $\cos(\pi/3)$

 
       

2. Tipos de datos y variables

Para utilizar posteriormente el resultado de un cálculo, podemos guardarlo en una variable:

b=2.0^4+1.0/5+exp(3.0) 
       

Para ver el contenido de la variable, basta escribir su nombre y ejecutar la celda:

       
36.2855369231877
36.2855369231877

Si el resultado no es un número, Sage también lo guarda en la variable, pero ahora tendremos que utilizar n() para ver su valor.

c=2^4+1/5+exp(3) 
       
       
e^3 + 81/5
e^3 + 81/5
c.n() 
       
36.2855369231877
36.2855369231877

Utilizar una variable es equivalente a escribir lo que tiene almacenado.

d=0.1 d 
       
0.100000000000000
0.100000000000000
h=d/10 h 
       
0.0100000000000000
0.0100000000000000

Si asignamos un nuevo contenido a una variable, perdemos su valor anterior.

d=0.2 d 
       
0.200000000000000
0.200000000000000

Podemos hacer las dos operaciones a la vez. Utilizar su valor y guardarlo de nuevo con el mismo nombre.

d=d+d^2 d 
       
0.240000000000000
0.240000000000000

Ejercicio 6. Crea una variable llamada n. Asígnale el valor 1. Ahora calcula n+1 y asígnalo de nuevo a n. Ejecuta la sentencia anterior varias veces para ver cómo va contando.

 
       

Sage también puede guardar vectores y matrices dentro de una variable.

v = vector([1,-1,1,1]); v 
       
(1, -1, 1, 1)
(1, -1, 1, 1)
A = matrix([[1, 12, 123, 1234],[2, 23, 234, 2341],[3, 34, 341, 3412], [4, 41, 412, 4123]]); A 
       
[   1   12  123 1234]
[   2   23  234 2341]
[   3   34  341 3412]
[   4   41  412 4123]
[   1   12  123 1234]
[   2   23  234 2341]
[   3   34  341 3412]
[   4   41  412 4123]

Además, podemos operar con las variables anteriores:

v*A 
       
A*v 
       
det(A) 
       

3. Trabajando con funciones (matemáticas)

Podemos definir una función como lo haríamos en clase:

f(x)=x^3+x^2+3 
       

Sage nos indicará que f guarda una función que asigna a cada x el polinomio anterior:

       
x |--> x^3 + x^2 + 3
x |--> x^3 + x^2 + 3

Para evaluar la función en un punto, basta sustituir el valor.

f(0); f(3); f(3.2); f(pi) 
       
3
39
46.0080000000000
pi^3 + pi^2 + 3
3
39
46.0080000000000
pi^3 + pi^2 + 3

Tambien podemos calcular derivadas y primitivas de la función, que a su vez son funciones:

f.diff(x) 
       
x |--> 3*x^2 + 2*x
x |--> 3*x^2 + 2*x
f.diff(x)(1) 
       
5
5
f.integrate(x) 
       
x |--> 1/4*x^4 + 1/3*x^3 + 3*x
x |--> 1/4*x^4 + 1/3*x^3 + 3*x

Para ver todas las operaciones que podemos hacer con una función, podemos escribir f. y pulsar el tabulador.

f. 
       
Traceback (click to the left of this block for traceback)
...
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_10.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("Zi4="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmptAIcaV/___code___.py", line 2
    f.
     ^
SyntaxError: invalid syntax

Si queremos que una función dependa de un parámetro, debemos declarar el parámetro con el comando "var".

a=var('a') g(x)=a*x^3+4*a g(3) 
       
31*a
31*a
g.diff(x) 
       
x |--> 3*a*x^2
x |--> 3*a*x^2

Ejercicio 7: Dada la función f(x)=sin(x)^3, calcula su valor en x=pi, su derivada, el valor de su derivada en x=pi y la integral entre x=0 y x=pi/2.

 
       

4. Representación gráfica

Dibujemos la función f(x)=sen(x) para x entre -pi y pi.

f(x)=sin(x) p = plot(f(x), (x, -pi/2, pi/2)) p.show() 
       

Podemos cambiar el color y nombrar los ejes:

p = plot(f(x), (x,-pi/2, pi/2), axes_labels=['x','sin(x)'], color='purple') p.show 
       

O cambiar el grosor y el tipo de línea:

p = plot(f(x),(x,-pi/2,pi/2), linestyle='--', thickness=3) p.show 
       

Para representar varias funciones en la misma gráfica, se "suman":

f(x) = sin(x) g(x) = cos(x) p = plot(f(x),(x,-pi/2,pi/2), color='black') q = plot(g(x), (x,-pi/2, pi/2), color='red') r = p + q r.show() 
       

Ejercicio 8: Representa las siguientes funciones en la misma gráfica y en el intervalo [0,1], cada una con un estilo diferente:

sin(pi x), exp(x), 1/(1+x)

 

 
       

Listas, bucles y y bucles en listas

Un tipo de datos muy importante en Sage son las listas. Vamos a ver cómo crear, modificar y seleccionar elementos de ellas.

Una lista no es más que una colección ordenada de elementos. Cada elemento de la lista puede ser cualquier tipo de objeto. Para crear una lista se pone entre corchetes la lista de los elementos, separados por comas.

L = [2,3,5,7,11,13,17,2] 
       

Para acceder a un elemento se pone el nombre de la lista, seguido de corchetes y entre corchetes el número de elemento al que queremos acceder. El primer elemento se numera con 0.

L[0] 
       
L[0]=3;L 
       

También podemos comenzar contando desde el último elmento usando índices negativos. Así el último elemento está numerado con -1, el penúltimo con -2, etc

L[-2] 
       

Podemos seleccionar un segmento de la lista con el operador :, siguiendo la convención nombreDeLista[primerElemento:ultimoElemento].

L[2:5] 
       

Si el último elemento que queremos elegir es el último elemento de la lista, no es necesario ponerlo.

L[2:] 
       
L[:-2] 
       

Recordemos que los elementos de una lista pueden ser de distinto tipo, aunque no es usual emplearlas de este modo.

Lista_rara=[1,"Hola",[1,2,3]];Lista_rara 
       

Podemos añadir un elemento al final de una lista con append, añadir una lista con extend o símplemente unir varias listas con la operación +.

L.append(4) 
       
L.extend([10,11,12]) 
       
[1,3,5]+[2,4,6]+[100] 
       

Creación de listas

Python permite crear de modo sencillo una lista de elementos equiespaciados. En Sage esta utilidad está extendida también para trabajar de modo simbólico.

[1..7] 
       
[2,4..10] 
       
[pi,4*pi..32] 
       
show([x^2,3*x^2/2..2*pi*x^2]) 
       

Operando con listas

Sage soporta muchas operaciones directamente sobre listas. Como ejemplo, vamos a sumar los elementos de una lista, vamos a agrupar dos listas en una uniendo el elemento k de la primera con el k de la segunda, y por último map que aplica una función a cada elemento de una lista.

sum([1..100]) 
       
zip([1,2,3,4],['a','b','c','d'] ) 
       
map( cos, [0, pi/4, pi/2, 3*pi/4, pi] ) 
       

Ejercicio 9:

a) Crea una lista con los cuadrados de los números (naturales) del 4 al 25

b) Crea una lista con los cuadrados de los números pares del 4 al 25

c) Calcula el seno de los números anteriores

 
       

Estructuras de control

Las estructuras de control seleccionan cuál es la siguiente sentencia a ejecutar (selección -- if) o hacen que una sentencia se ejecute repetidamente (iteración -- while o for).

 

En Python, la selección tiene la siguiente sintaxis:

n=12343; if n%2 == 0: print n/2 else: print (n+1)/2 
       

Notese que la indentación es esencial: todas las sentencias que queremos que se ejecuten han de tener la misma identación.

Para repetir una sentencia un número indeterminado de veces, podemos usar un bucle while, con sintaxis:

i=0; while i < 5: i=i+1; print i^2 
       

Finalmente, el bucle for repite una instrucción para cada elemento de una lista:

for i in [0..4]: print i^2 
       
for str in ["juan","mario","eva","laura"]: print str.capitalize() 
       

Ejercicio 10:

a) Suma con un bucle los números del 1 al 1000

b) Suma con un bucle los números positivos del siguiente vector:

v=[random()-1/2 for i in [1..100]];v 
       
[0.43041922997782867, 0.3317053590895901, 0.22819942764989942,
-0.2527449672021136, 0.3605354608818734, 0.039305558236153004,
0.28092372695150625, -0.2925022817336186, 0.46385784822052345,
0.1777649576423308, -0.33201519396840873, 0.03344017587740011,
-0.14154498888801903, 0.027781827388227875, 0.42225831879286235,
-0.3807922030419313, -0.43268036411924904, 0.2505570825644702,
0.39512599045679886, -0.48388734452919036, 0.013379118133091783,
0.3001430764154053, -0.2557918932131953, -0.4971083514049013,
-0.36406057955683047, -0.28958363070215987, 0.13826534427787207,
-0.4038770987017445, -0.08205248123839548, -0.3850792875200477,
-0.31595143100171663, -0.20525772155256716, 0.1966727937313888,
-0.4455765213248942, 0.41344367322464637, -0.15095036310511956,
0.46618044672670944, 0.16891551670903515, -0.3120161230113271,
0.11072445602565795, 0.3277828567593223, -0.1676467271114186,
0.4625396768919906, 0.1514808855134493, 0.4903530652490804,
-0.38092604960497134, -0.17964973678442708, -0.05749795326781992,
0.42797928200179614, -0.2547093611565948, -0.18045495578888648,
-0.4573090246804674, -0.13831294252694093, -0.3995813930266239,
0.3746920917761126, 0.35669566662248187, 0.47167583318899287,
0.4707975440892883, -0.09321812502487759, 0.3493975302212299,
-0.4830176527612118, -0.4921446799939564, -0.25102315569081823,
-0.4773262337440868, -0.28307337238169195, 0.2164753157287871,
0.2984375439052681, -0.027082238494137045, 0.3168689305291068,
-0.30182892466358713, 0.3905461779322783, -0.38253167634895635,
-0.042029358416913576, -0.3161896614324665, -0.3154678127842825,
-0.3648835955635169, -0.4634239486887981, 0.1923158329338417,
0.08266168803843965, 0.16357033360008932, 0.2469657778540436,
0.3164882968633732, 0.41641008996392226, -0.17661526885167844,
-0.11338815984280626, -0.07692612742586202, -0.16300747041317032,
-0.37368468061389737, 0.4616561609703087, 0.4474272548185647,
-0.11158878799215488, 0.22381473398987206, -0.3226592051576638,
-0.3546381995023502, -0.2536351193880224, -0.47461922907329335,
-0.35205951891346576, 0.2879316873254656, -0.37129282689657384,
0.27646055251233903]
[0.43041922997782867, 0.3317053590895901, 0.22819942764989942, -0.2527449672021136, 0.3605354608818734, 0.039305558236153004, 0.28092372695150625, -0.2925022817336186, 0.46385784822052345, 0.1777649576423308, -0.33201519396840873, 0.03344017587740011, -0.14154498888801903, 0.027781827388227875, 0.42225831879286235, -0.3807922030419313, -0.43268036411924904, 0.2505570825644702, 0.39512599045679886, -0.48388734452919036, 0.013379118133091783, 0.3001430764154053, -0.2557918932131953, -0.4971083514049013, -0.36406057955683047, -0.28958363070215987, 0.13826534427787207, -0.4038770987017445, -0.08205248123839548, -0.3850792875200477, -0.31595143100171663, -0.20525772155256716, 0.1966727937313888, -0.4455765213248942, 0.41344367322464637, -0.15095036310511956, 0.46618044672670944, 0.16891551670903515, -0.3120161230113271, 0.11072445602565795, 0.3277828567593223, -0.1676467271114186, 0.4625396768919906, 0.1514808855134493, 0.4903530652490804, -0.38092604960497134, -0.17964973678442708, -0.05749795326781992, 0.42797928200179614, -0.2547093611565948, -0.18045495578888648, -0.4573090246804674, -0.13831294252694093, -0.3995813930266239, 0.3746920917761126, 0.35669566662248187, 0.47167583318899287, 0.4707975440892883, -0.09321812502487759, 0.3493975302212299, -0.4830176527612118, -0.4921446799939564, -0.25102315569081823, -0.4773262337440868, -0.28307337238169195, 0.2164753157287871, 0.2984375439052681, -0.027082238494137045, 0.3168689305291068, -0.30182892466358713, 0.3905461779322783, -0.38253167634895635, -0.042029358416913576, -0.3161896614324665, -0.3154678127842825, -0.3648835955635169, -0.4634239486887981, 0.1923158329338417, 0.08266168803843965, 0.16357033360008932, 0.2469657778540436, 0.3164882968633732, 0.41641008996392226, -0.17661526885167844, -0.11338815984280626, -0.07692612742586202, -0.16300747041317032, -0.37368468061389737, 0.4616561609703087, 0.4474272548185647, -0.11158878799215488, 0.22381473398987206, -0.3226592051576638, -0.3546381995023502, -0.2536351193880224, -0.47461922907329335, -0.35205951891346576, 0.2879316873254656, -0.37129282689657384, 0.27646055251233903]
 
       

Listas por comprensión

Python permite definir listas por comprensión. Es una manera rápida de crear una lista a partir de otra. La sintasis es [ expresión for indice in lista]. Devuelve una lista resultado de evaluar la expresión (que dependerá de la variable denominada índice) aplicada a cada uno de los elementos de la lista.

[ 2*k for k in [0..10] ] 
       
[ cos(x) for x in [pi/4, pi/2..2*pi]] 
       

Además se puede filtrar el resultado de la salida:

U = [ k for k in [1..19] if gcd(k,20) == 1]; U 
       

Y se pueden anidar bucles:

[ (a,b) for a in U for b in U ] 
       

Por último, la expresión inicial también puede contener condicionales:

[ 'prime' if x.is_prime() else 'not prime' for x in U] 
       

Ejercicio 11:

a) Crea una lista con los cuadrados de los números (naturales) del 4 al 25

b) Crea una lista con los cuadrados de los números pares del 4 al 25

c) Crea una lista con los múltiplos de pi entre 4 y 25

 
       
 
       
 
       

Funciones

Para definir una función (programación) en Sage/Python, usamos la palabra clave def, seguida del nombre de la función, las variables de entrada entre paréntesis y dos puntos. En las siguientes líneas se escriben los comandos que queremos que evalúe la función.La identación es muy importante en Python: todo lo que esté con la misma identación será el cuerpo de la función, para terminar la función basta escribir sin identación. Por último, el valor que devuelve la función se determina por la palabra clave return.

def g(x,y): x=x+1; y=y+2; return x*y 
       

Podemos usar la función igual que usamos cualquier función matemática.

g(1,3) 
       

Ejercicio 12: Crea una función que reciba dos números y devuelva el mayor de ambos

 
       
 
       
 
       

Ejercicio final: Rellena el siguiente cuadro (haciendo doble "clic"), guarda el "worksheet" como NOMBRESAGE_p0, compártelo con tu profesor, imprime la práctica como pdf según las instrucciones en el fichero "Registro en Sage.pdf" y súbela al campus virtual. Recuerda que NOMBRESAGE debe ser tu nombre de usuario en Sage, con la información de la titulación, asignatura y curso académico.

Alumno: 

Asignatura: