Empezaremos esta práctica con algo de conocimientos previos de programación. Se que muchos de ustedes no han tenido la oportunidad de utilizar Python como lenguaje de programación y mucho menos Jupyter como ambiente de desarrollo para computo cientifico, asi que el primer objetivo de esta práctica será acostumbrarnos a la sintaxis del lenguaje y a las funciones que hacen especial a Jupyter.
Primero tratemos de evaluar una expresión aritmetica. Para correr el código en la siguiente celda, tan solo tienes que hacer clic en cualquier punto de ella y presionar las teclas Shift + Return.
In [ ]:
2 + 3
In [ ]:
2*3
In [ ]:
2**3
In [ ]:
sin(pi)
Sin embargo no existen funciones trigonométricas cargadas por default. Para esto tenemos que importarlas de la libreria math
:
In [ ]:
from math import sin, pi
sin(pi)
Las variables pueden ser utilizadas en cualquier momento, sin necesidad de declararlas, tan solo usalas!
In [ ]:
a = 10
In [ ]:
a
Ejecuta el siguiente calculo y guardalo en una variable c
:
Nota: Una vez que hayas concluido el calculo y guardado el valor en una variable, despliega el valor de la variable al ejecutar en una celda el nombre de la variable
In [ ]:
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
In [ ]:
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
Ejecuta la prueba de abajo para saber si has creado el codigo correcto
In [ ]:
from nose.tools import assert_equal
assert_equal(_, c)
print("Sin errores")
Las listas son una manera de guardar varios datos en un mismo arreglo. Podemos tener por ejemplo:
In [ ]:
A = [2, 4, 8, 10]
A
Pero si intentamos multiplicar estos datos por un numero, no tendrá el comportamiento esperado.
In [ ]:
A*2
Podemos definir funciones propias de la siguiente manera:
In [ ]:
f = lambda x: x**2 + 1
Esta linea de codigo es equivalente a definir una función matemática de la siguiente manera:
$$ f(x) = x^2 + 1 $$Por lo que si la evaluamos con $x = 2$, obviamente obtendremos como resultado $5$.
In [ ]:
f(2)
Esta notación que introducimos es muy util para funciones matemáticas, pero esto nos obliga a pensar en las definiciones de una manera funcional, lo cual no siempre es la solución (sobre todo en un lenguaje con un paradigma de programación orientado a objetos).
Esta función tambien puede ser escrita de la siguiente manera:
In [ ]:
def g(x):
y = x**2 + 1
return y
Con los mismos resultados:
In [ ]:
g(2)
Define una función que convierta grados Celsius a grados Farenheit, de acuerdo a la siguiente formula:
$$ F = \frac{9}{5} C + 32 $$
In [ ]:
def cel_a_faren(grados_cel):
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
return grados_faren
Y para probar trata de convertir algunos datos:
In [ ]:
cel_a_faren(-1)
In [ ]:
from nose.tools import assert_equal
assert_equal(cel_a_faren(10), 50)
assert_equal(cel_a_faren(50), 122)
print("Sin errores")
Cuando queremos ejecutar código varias veces tenemos varias opciones, vamos a explorar rapidamente el ciclo for.
for paso in pasos:
...
codigo_a_ejecutar(paso)
...
En este caso el codigo se ejecutará tantas veces sean necesarias para usar todos los elementos que hay en pasos.
Por ejemplo, pordemos ejecutar la multiplicacion por 2 en cada uno de los datos:
In [ ]:
for dato in A:
print(dato*2)
ó agregarlo en una lista nueva:
In [ ]:
B = []
for dato in A:
B.append(dato*2)
B
C
con los enteros positivos de un solo digito, es decir: $\left\{ x \in \mathbb{Z} \mid 0 \leq x < 10\right\}$D
con los cuadrados de cada elemento de C
In [ ]:
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
C
In [ ]:
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
D
Ejecuta las pruebas de abajo
In [ ]:
from numpy.testing import assert_array_equal
print("Sin errores")
Para trabajar con matrices el flujo de trabajo es un poco diferente, ya que los arreglos manejan un conjunto diferente de operaciones; afortunadamente la librería numpy
ya tiene definido un objeto de tipo matriz, con el cual podemos hacer las operaciones que queramos:
In [ ]:
from numpy import matrix
In [ ]:
A = matrix([[1, 2], [3, 4]])
A
In [ ]:
v1 = matrix([[1], [2]])
v1
In [ ]:
# Dependiendo de la version de python que exista en tu computadora,
# esta operacion pudiera no funcionar, en dado caso solo hay que
# cambiar @ por *
A@v1
In [ ]:
# La siguiente linea no va a funcionar, porque?
v1@A
rot
, en dos dimensiones con un angulo de 30ºvec
definido como $\begin{pmatrix} 2 \\ 2\end{pmatrix}$
In [ ]:
from numpy import sin, cos, pi
τ = 2*pi
# ESCRIBE TU CODIGO AQUI
raise NotImplementedError
vec_rot
In [ ]:
from numpy.testing import assert_array_equal
assert_array_equal(vec_rot, matrix([[2*(cos(τ/12)-sin(τ/12))], [2*(cos(τ/12)+sin(τ/12))]]))
print("Sin errores")