GIIT_AMA_1415_Tutorial

1112 days ago by trinidad1415

Tutorial de programación en Sage

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

Si queremos saber cuál es el último elemento, utilizamos la orden len

len(L) 
       
8
8

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:

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

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

c) Calcula el seno de los números anteriores

 
       

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:

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

 
       

Programación en Sage

El lenguaje de programación de Sage por defecto es Python. Según Wikipedia:

"Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis muy limpia y que favorezca un código legible.

Se trata de un lenguaje de programación multiparadigma, ya que soporta orientación a objetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, usa tipado dinámico y es multiplataforma.

Es administrado por la Python Software Foundation. Posee una licencia de código abierto, denominada Python Software Foundation License,1 que es compatible con la Licencia pública general de GNU a partir de la versión 2.1.1, e incompatible en ciertas versiones anteriores."

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): return x*y 
       

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

g(1,3) 
       

Las funciones pueden recibir listas como parámetros y devolver listas en el return.

def sumaCuadrados(v): return sum([k^2 for k in v]) 
       
sumaCuadrados([1,3..9]) 
       
def primos(n): return [k for k in [1..n] if is_prime(k)] 
       
primos(1000) 
       

Como parámetro de entrada y salida vale cualquier tipo de objeto de Sage:

def graficaDerivada(f,x): return plot(f(x),(x,-1,1))+plot(f.diff(x)(x),(x,-1,1),color="green") 
       
f(x)=exp(x)-x graficaDerivada(f,x) 
       

También podemos utilizar una función dentro de otra.

def sumaPrimos(n): return sum(primos(n)) 
       
sumaPrimos(10) 
       

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

Selección -  If

La estructura de selección condicional if nos permite elegir ejecutar o no un bloque de instrucciones. La sintaxis es:

if condición:

   instrucciones a ejecutar (1 o varias)

También se puede elegir ejecutar otras instrucciones en el caso en el que no se cumpla la condición:

if condición:

   instrucciones a ejecutar (1 o varias)

else:

   instrucciones a ejecutar (1 o varias)

Por ejemplo, vamos a calcular el valor absoluto de un número.

a=-5 if a<0: a=-a; a 
       

Usando else ejecutamos una instrucción cuando no se comple la condición.

a=pi/2 if a>3: show( latex(a)+ latex(' es mayor que 3')) else: show( latex(a)+ latex(' es menor que 3')) 
       

Podemos combinar varias condiciones con los operadores and y or.

a=pi/2 if a>1 and a<3: show( latex(a)+ latex(' está entre 1 y 5')) else: show( latex(a)+ latex(' no está entre 1 y 5')) 
       

Repetición - While

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

while condición:

  instrucciones a ejecutar

Por ejemplo, para encontrar un número en una lista:

lista=[1,2,3,5,3,4,7] i=0; # Este bucle busca en la lista hasta que encuentra el 7 (es decir, mientras i está en la lista y lista[i] no es 7) while i<len(lista) and lista[i] != 7: i=i+1; # Hacemos que la salida sea explicativa if i<len(lista): print "El número ",lista[i]," está en la posición",i+1 else: print "No he encontrado el número" 
       

Repetición - For

Si queremos repetir una instrucción para cada elemento de un vector, podemos usar un bucle for. La sintaxis es:

for variable in lista:

  instrucciones a ejecutar

Vamos a mostrar por pantalla todos los cuadrados del 0 al 4.

for i in [0..4]: print i^2 
       

Y vamos a poner en mayúscula la primera letra de cada cadena de texto de una lista.

for str in ["juan","mario","eva","laura"]: print str.capitalize() 
       

En el siguiente ejemplo, se recibe una lista de cotas equiespaciadas (por ejemplo, la altura en metros de una carretera, medida cada kilómetro) y se calcula la pendiente.

cotas=[323,301,298,302,312,333,340,352,367] distanciaHorizontal=1000 pendiente=[] # comienzo en una lista vacía for k in range(len(cotas)-1): pendiente.append((cotas[k+1]-cotas[k])/distanciaHorizontal) pendiente 
       

Ejercicios

1. Crea una función que reciba los coeficientes $a,b,c$ del polinomio $ax^2+bx+c$ y devuelva las dos raíces del polinomio.

2. Crea una función que reciba dos números y devuelva el mayor de ellos.

3. Crea una función que reciba tres números y devuelva $1$ si son iguales y $0$ si alguno es distinto a los demás.

4. Crea una función que reciba una lista de números y devuelva la posición del primer elemento positivo

5. Crea una función que reciba una lista de números $l$ y un valor $M$ y devuelva el primer número $k$ tal que $l[0]+l[1]+...+l[k]>M$.

6. Crea una función que reciba una lista y sume todos los elementos.

7. Crea una función que reciba una lista de cotas medidas en intervalos equiespaciados y la distancia entre dos intervalos y devuelva el valor de la mayor pendiente.