Autor: Roberto Muñoz
E-mail: rmunoz@uc.cl
Python es un lenguaje de programación que fue desarrollado por Guido van Rossum y distribuido como código abierto. Se puede descargar gratuitamente desde internet e instalar en cualquier computador. En este curso usaremos la versión distribuida por Anaconda.
En el lenguaje Python, así como en la mayoría de lenguajes de programación, hay distintos tipos de variables: números enteros ("ints", del inglés integer, o entero), números racionales ("float", del inglés floating point, punto flotante), palabras y cadenas de caracteres ("strings" o cadenas), entre otras. Nosotros usaremos principalmente números, tanto int como float.
En la siguientes líneas vamos a "declarar" una variable, o sea, asignarle un valor, y luego realizaremos operaciones básicas. Las líneas que comienzan con "#" Python las considera como comentarios, y no las ejecuta, pero están ahí para hacer más legible el código. El comando print permite mostrar en pantalla tanto texto como valores de variables, siempre y cuando los elementos a mostrar estén separados por comas. El texto en Python siempre se representa con comillas, simples o dobles.
In [1]:
# primero inicializamos las variables a y b
a = 2
b = 3.5
In [2]:
# verificamos los valores y aplicamos operaciones simples
print("a = ",a)
print("b = ",b)
In [3]:
c = a + b
print(c)
print("suma de a + b = ",c)
d = a * b
print("multiplicación de a * b = ",d)
e = a ** b
# el signo "**" representa "elevar a"
print("a elevado a b = ",e)
f = b / a
print("b dividido por a = ",f)
Otro tipo de variable muy importante son los arreglos, que pueden ser visto como una cadena de variables. Los arreglos se declaran por medio de corchetes, y sus elementos deben ir separados por comas. Por ejemplo, creemos el arreglo con los dígitos del 0 al 9:
In [4]:
a = [0,1,2,3,4,5,6,7,8,9]
print(a)
En vez de usar líneas de código como la anterior, o más largas, podemos usar funciones. Una función es una línea de texto que ejecuta código más largo "detrás de la cortina". Una manera rápida de crear arreglos es por medio de la función range, que acá usamos para generar el arreglo a más rápida y brevemente. En los siguientes ejemplos se muestra como usar esta función para crear listas de números equidistantes:
In [5]:
a=range(10)
b=range(9,20)
c=range(-5,15,2)
print(a)
print(b)
print(c)
Vemos que escribiendo range(10) el resultado es el mismo que [0,1,2,3,4,5,6,7,8,9], pero fuimos mucho más breves. La función range es muy útil, pero no muy versátil. ¿Qué pasa si queremos crear números espaciados por 0.1?
In [6]:
a=range(1,10,0.1)
Vemos que Python lanza un error: la función range no puede correr cuando alguno de sus argumentos (valor que define lo que una función va a hacer) no es entero. Para hacer esto, necesitamos usar pedazos de código que no están incluidos por defecto en Python, los llamados paquetes. La siguiente línea importa uno de los paquetes más famosos y usados de Python: NumPy, que es muy útil para hacer cálculos rápidos, sobre todo con arreglos. Lo que la siguiente línea hace es decir que usaremos todo lo incluido en el paquete numpy bajo el "alias" np, para escribir menos en nuestros códigos.
In [7]:
import numpy as np
La función arange de numpy nos permite hacer lo mismo que range, pero puede recibir números no enteros en cualquiera de sus argumentos. Como esta función está dentro del paquete numpy, debemos llamarla antecediendo "np." (o cualquier alias que hayamos usado) a su nombre. Veamos algunos ejemplos:
In [8]:
a=np.sin(np.pi/2)
print(a)
In [9]:
a=np.arange(1,10,0.1)
b=np.arange(-5,2,1.2)
print(a)
print(b)
Importante recordar: Al igual que range, la función arange no llega hasta el valor "final" dado como argumento en la función.
El paquete numpy contiene todas las operaciones matemáticas que nosotros necesitamos para el curso y para la vida. Cuando estas operaciones son aplicadas a un arreglo, se aplican a todos los elementos de un arreglo. A continuación, algunos ejemplos:
In [10]:
a=np.arange(0,10,0.5)
b=np.sin(a) # seno de a
print(b)
c=np.sqrt(a) # raíz de a, del inglés "square root"
print(c)
d=np.power(a,2) # elevar cada elemento del arreglo a, a la segunda potencia
print(d)
Escribir np.sqrt(a) es mucho más breve que la alternativa: calcular una a una las raíces cuadradas de cada elemento de a. No se preocupe de entender el siguiente código, sólo note que es bastante más complicado que hacerlo con numpy, y se llega al mismo resultado:
In [11]:
c2 = []
for el in a:
c2.append(el**0.5)
print("manera larga = ",c2)
print("con numpy = ",c)
La única diferencia es el número de decimales que se muestran.
¿Cómo verificar gráficamente si numpy está haciendo bien las cosas? Existe otro paquete de python que permite hacer visualización de datos, matplotlib. Estos dos paquetes permiten hacer maravillas. La siguiente línea importa el paquete matplotlib.pyplot (parte dedicada a graficar) con el alias plt, mientras que la segunda permite ver las figuras graficadas dentro de este mismo navegador, en vez de abrirlas en otra ventana.
In [12]:
import matplotlib.pyplot as plt
%matplotlib inline
Para graficar en las dos dimensiones de un plano cartesiano, sólo necesitamos decirle a la función plot de matplotlib los valores de x e y que queremos graficar, muy intuitivo. Por supuesto, estos dos arreglos deben tener la misma dimensión, o sea, el mismo número de elementos. Una vez que el gráfico se genera, no se muestra automáticamente. Para eso, usamos la función show de matplotlib, como muestra el siguiente ejemplo. Como se imaginarán, todos los nombres de funciones están basados en palabras en inglés: plot significa "graficar", show significa "mostrar".
In [13]:
plt.plot(a,10*b, c="blue") # en azul
plt.plot(a,5*c, c="green") # en verde
plt.plot(a,d, c="red") # en rojo
plt.show()
In [ ]:
# escriba el código acá
A continuación, están definidos dos arreglos que contienen información de los ocho planetas del Sistema Solar, desde Mercurio, hasta Neptuno, además de incluir información de Plutón (ahora considerado planetoide en vez de planeta). El primero, p, contiene el periodo de cada planeta en años, mientras que el segundo, a, contiene el tamaño de la órbita en unidades astronómicas. Con estos datos, usted construirá un gráfico en dos dimensiones, como los de los ejemplos superiores, con los que comprobará experimentalmente la 3era ley de Kepler, cuya forma matemática dice $p = a^k$, con $k$ una constante (no necesariamente entera) que ud. debe determinar tras ensayo y error. Para eso, grafique los arreglos entregados, junto con una curva de la forma $y=x^k$ para distinto valores de $k$, y vea cuál es la que más se acerca. ¿Cuál es el valor de $k$ que usted obtiene?
In [ ]:
p = np.array([0.214,0.615,1,1.88,11.9,29.4,83.7,163.7,247.9])
a = np.array([0.387,0.723,1,1.52,5.2,9.58,19.2,30.05,39.48])
# escriba acá el resto del código
In [ ]:
# introduzca estas líneas en el código de la pregunta anterior
plt.xscale('log')
plt.yscale('log')
In [ ]: