Beruflich Dokumente
Kultur Dokumente
1 Introduccin
1.1 Por qu aprender a programar?
Porque es una habilidad que aumenta tus posibilidades de adquirir un mejor empleo. Para realizar clculos intensos, es necesario utilizar una computadora, pues hacerlos a mano sera muy tardado o imposible. Ejemplos de reas en las que puedes aplicar la programacin: Mtodos numricos: Resuelva de manera numrica (utilizando el mtodo de Euler) el sistema masa-resorte dado por la ecuacin diferencial
mu + u + ku = F (t),
(1.1)
Figura 1.1: Sistema masa resorte que se describe mediante la Ecuacin 1.1
Graficacin. La Figura 1.2 muestra un histograma obtenido a partir de una distribucin de probabilidad normal con el siguiente cdigo.
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(1000) plt.hist(x, 20) plt.show()
2 Python bsico
Para iniciar con lo ms bsico, te recomiendo estudiar el Tutorial de Python (no es necesario que revises todo el tutorial, pero si es importante que empieces lo ms pronto posible, y que vayas practicando cada tema que se vea en clase) en http://docs.python.org/3/tutorial/index.html (este tutorial est en ingls, pero es el tutorial adecuado para la versin de Python que estaremos usando en el curso). Tambin puedes apoyarte en una versin del tutorial en espaol disponible en http://docs.python.org.ar/tutorial/3/index.html. Especialmente importantes son las secciones 1 a 5 del tutorial. Asegrate de estudiar al menos estas secciones del tutorial.
(2.1)
Con ayuda del siguiente bloque de cdigo, verifica la posicin de la pelota a los 0.6 segundos de ser lanzada, si la velocidad inicial con que fue lanzada es de 6 m/s:
# Programa para calcular la altura de una # pelota en movimiento vertical v0 = 5 # velocidad inicial g = 9.81 # aceleracion de la gravedad t = 0.6 # tiempo y = v0*t - 0.5*g*t**2 # posicion vertical print(y)
Cules son los operadores que utilizas para la multiplicacin y para la exponenciacin? 2. Considere el movimiento vertical de la pelota dado por la Ecuacin (2.1). Cunto tiempo le toma a la pelota alcanzar la altura yc ? Comprueba que las soluciones estn dadas por las races de la ecuacin
1 2 gt 2
v0 t + y c = 0
Usando la frmula general para encontrar las races de una ecuacin de segundo grado, comprueba que las soluciones son:
( ) 2 t1 = v0 v0 2gyc /g,
( ) 2 t2 = v0 + v0 2gyc /g
Utilizando el siguiente bloque de cdigo, averigua cules son los dos instantes de tiempo en que una pelota est a una altura de 0.3 m, si la velocidad inicial de la pelota es de 6 m/s:
v0 = 5 g = 9.81 yc = 0.2 import math t1 = (v0 - math.sqrt(v0**2 - 2*g*yc))/g t2 = (v0 + math.sqrt(v0**2 - 2*g*yc))/g print("""En t={0:.4f} s y t={1:.4f} s, la altura es {2:.4f} m.""".format(t1, t2, yc))
3. Revisa los siguientes links http://docs.python.org/3/library/numeric.html http://docs.python.org/3/library/math.html 4. Utilizando el siguiente bloque de cdigo, indica cules son los valores que toma la variable v:
import math as m # m is now the name of the math module v = m.sin(m.pi) from math import log as ln v = ln(5) from math import sin as s, cos as c, log as ln v = s(x)*c(x) + ln(x)
5. Con ayuda del siguiente cdigo, calcula las dos races complejas de la ecuacin cuadrtica f (x) = ax2 + bx + c cuando a = 1, b = 2 y c = 100:
>>> a = 1; b = 2; c = 100 # coeficientes polinomiales >>> from numpy.lib.scimath import sqrt >>> r1 = (-b + sqrt(b**2 - 4a*c))/(2*a) >>> r2 = (-b - sqrt(b**2 - 4a*c))/(2*a)
2. Llama la funcin anterior con los argumentos 3 "Hola" Cul es el tipo de estos argumentos? Utiliza la funcin type(). 3. Convierte de metros a unidades de longitud inglesas. Construye un programa que reciba una longitud en metros y que entonces calcule y depliegue la correspondiente longitud en pulgadas, pies y millas. Utiliza las siguientes equivalencias: 1 pulgada = 2.54 cm 1 pie = 12 pulgadas 1 yarda = 3 pies 1 milla inglesa = 1760 yardas Como verificacin puede usar los siguientes datos: 640 m = 25196.85 pulgadas = 2099.74 pies = 699.91 yardas = 0.3977 millas inglesas 4. Modifica (en caso de ser necesario) el programa del ejercicio anterior de modo que utilices funciones para resolver el problema propuesto. 5. Basndote en el siguiente cdigo, calcula el rea de un paralelogramo, de un cuadrado y de un crculo, as como el volumen de un cono utilizando funciones:
10
from math import pi h = 5.0 # altura b = 2.0 # base r = 1.5 # radio area_paralelogramo = h*b print("""El area del paralelogramo es {0:.3f}""". format(area_paralelogramo)) area_cuadrado = b**2 print("""El area del cuadrado es {}""". format(area_cuadrado)) area_circulo = pi*r**2 print("""El area del circulo es {0:.3f}""". format(area_circulo)) volumen_cono = 1.0/3*pi*r**2*h print("""El volumen del cono es {0:.3f}""". format(volumen_cono))
11
Construya un diagrama de flujo (vea la Figura seleccion-simple) tal que dado como dato la calificacin de un alumno en un examen, escriba aprobado en caso de que esa calificacin sea mayor o igual a 70.
12
2.5.2 Ejemplo 2
Construya un diagrama de flujo (vea la Figura seleccion-doble) tal que dado como dato la calificacin de un alumno en un examen, escriba aprobado si su calificacin es mayor o igual a 70 y reprobado en caso contrario.
13
2.5.3 Ejemplo 3
Construya un diagrama de flujo tal que dado como datos la categora y el sueldo de un trabajador, calcule el aumento correspondiente teniendo en cuenta el Cuadro 2.1. Imprima la categora del trabajador y su nuevo sueldo. El siguiente cdigo resuelve el ejemplo:
cat = 2 sue = 1000 if cat == 1: n_sue = sue * 1.15 elif cat == 2: n_sue = sue * 1.10 elif cat == 3: n_sue = sue * 1.08 else: n_sue = sue * 1.07 print("La categoria del trabajador es {}".format(cat)) print("El nuevo sueldo es {}".format(n_sue))
Cul es el salario del trabajador (considerando que el salario actual es de $1000.00) para cada categora?
14
Categora % Aumento 1 2 3 4 15 10 8 7
15
Imprima una tabla de conversin de grados Celsius a grados Fahrenheit. Dicha tabla debe verse como el Cuadro 2.2:
Celsius Fahrenheit -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 -4.0 5.0 14.0 23.0 32.0 41.0 50.0 59.0 68.0 77.0 86.0 95.0 104.0
16
print("------------------") # Encabezado de la tabla C = -20 # valor inicial de C dC = 5 # incremento de C en el ciclo while C <= 40: # mientras C sea menor o igual que 40, hacer F = (9.0/5)*C + 32 print("{0}, {1}".format(C, F)) C = C + dC print("------------------") # Fin de la tabla
List Comprehension
Dado que recorrer una lista elemento a elemento y por cada uno de ellos crear otro nuevo en una lista distinta es una tarea frecuente, Python tiene una sintaxis compacta para hacer esto, llamada list comprehension. La sintaxis general es:
new_list = [E(e) for e in list]
donde E(e) representa una expresin que envuelve al elemento e. A continuacin ponemos varios ejemplos:
Cdegrees = [-5 + i*0.5 for i in range(n)] Fdegrees = [(9.0/5)*C + 32 for C in Cdegrees]
17
Una versin ms pythonica del ciclo anterior se consigue utilizando una list comprehension:
table = [[C, F] for C, F in zip(Cdegrees, Fdegrees)]
Las sumatorias ocurren con frecuencia en las matemticas. Por ejemplo, la funcin sin(x) puede calcularse como un polinomio:
x3 x5 x7 + + sin(x) x 3! 5! 7!
donde 3! = 3 2 1, 5! = 5 4 3 2 1, etc. son factoriales. La expresin k ! puede calcularse con math.factorial(k). Se requiere de un nmero infinito de trminos en el lado derecho de sin-approx para que sea vlido usar el signo de igualdad. Con un nmero finito de trminos, se obtiene una aproximacin de la funcin sin(x). Suponga que es necesario calcular el lado derecho de sin-approx para potencias de hasta N = 25. El clculo de la suma anterior con un ciclo while de Python, utiliza lo siguiente: 1. Un contador k que toma los valores impares desde 1 hasta un algn nmero mximo N. 2. Una variable para la sumatoria, digamos sumatoria, que acumule los trminos, uno a la vez. El propsito de cada iteracin del ciclo es calcular un nuevo trmino y aadirlo a sumatoria. Dado que el signo de cada trmino se alterna, podemos introducir una variable signo que cambie entre 1 y 1 en cada iteracin del ciclo. Las ideas anteriores pueden codificarse en Python de la siguiente manera:
18
x = 1.2 # asignar algn valor N = 25 # maxima potencia en la suma k = 1 sumatoria = x signo = 1.0 import math while k < N: signo = - signo k = k + 2 term = signo * x**k / math.factorial(k) sumatoria = sumatoria + term
Sea f (t) una funcin definida en un intervalo (a, a + T ), donde a R y T > 0 es el periodo de la funcin. f (t) puede escribirse como
) ( )] ( [ a0 2nt 2nt f (t) = + + bn sin an cos 2 T T n=1 2 a+T f (t) dt a0 = T a ) ( 2 a+T 2nt an = dt f (t) cos T a T ) ( 2 a+T 2nt bn = dt f (t) sin T a T
(2.2)
(2.3)
El uso ms frecuente de la serie de Fourier es para representar funciones peridicas. Lo que se hace es definir la funcin para un intervalo (a, a + T ) con una serie
19
de Fourier. El resultado es una funcin definida en todo el eje real. El valor a0 /2 siempre da el valor promedio de la funcin. El valor que da la serie geomtrica de Fourier para los valores en que la funcin presenta discontinuidades es el valor promedio de la funcin. Un desarrollo en serie de Fourier para f (t) definida de acuerdo con la figura
3 2 1 0 1 2 0.0
0.5
1.0
1.5
2.0
20
import matplotlib.pyplot as plt import numpy as np x1 = np.array([0.0, 1.0]) y1 = np.array([2.0, 2.0]) x2 = np.array([1.0, 2.0]) y2 = np.array([-1.0, -1.0]) plt.plot(x1, y1, 'b', x2, y2, 'b') plt.axis([0.0, 2.0, -2.0, 3.0]) plt.grid() plt.show()
a0 = 1 an = 0 3 n bn = [1 (1) ] n T =2
es decir, la solucin es:
(2.4)
1 3 n [1 (1) ] sin(nt) f (t) = + 2 n=1 n 1 6 = + sin [(2n 1)t] 2 n=1 (2n 1) 1 6 sin [(2n 1)t] = + 2 n=1 2n 1
(2.5)
La Figura 2.4 se obtiene utilizando los primeros 3 trminos de la sumatoria de la ltima expresin para f (t):
21
Figura 2.4: Primeros tres trminos de la serie de Fourier de la Ecuacin (2.5) y su suma
22
import matplotlib.pyplot as plt import numpy as np from numpy import pi num_puntos = 301 t = np.linspace(-2.0, 4.0, num_puntos) f = np.zeros((3, num_puntos)) for n in range(3): impar = 2*n + 1 theta = impar*pi*t f[n] = np.sin(theta)/impar plt.plot(t, f[n]) y = 0.5 + 6.0/pi*f.sum(0) plt.plot(t, y) plt.grid() plt.show()
Modifique el programa anterior para visualizar la seal peridica que se obtiene al sumar los primeros diez trminos de la serie. Despus visualize la seal correspondiente a 100 trminos.
2.6.4 Ejemplo 4: Ley de van der Waals
Calcular el volumen ocupado por dos moles de amoniaco que se encuentran a 27 C y a 9.33 atm (realizar el clculo utilizando la ecuacin de Van der Waals). La ecuacin de van der Waals es:
donde p es la presin del gas; V es el volumen; T es la temperatura; n es el nmero de moles; R es la constante universal de los gases ideales (R = 0.0820578 L-atm/mol-K); a y b son constantes que dependen del gas. Despejar la presin o la temperatura de la ecuacin eq-van-der-Waals es sencillo, pero no es fcil averigar
23
el volumen cuando se conocen la temperatura y la presin. Desarrollando las multiplicaciones apropiadas, la ecuacin anterior puede expresarse como el polinomio de tercer grado en V :
xi+1 = xi
f ( xi ) f ( xi )
donde f (x) denota la derivada de f (x) con respecto a x. En la ecuacin eq-vander-Waals-polinomio, la variable independiente es V (f (V ) = 0), por lo que la iteracin de Newton-Raphson est dada por:
Vi+1 = Vi
f (Vi) f (Vi )
Cul es la derivada f (V )? Utiliza el siguiente cdigo como punto de partida para resolver el problema anterior. Notas: Entradas f es la funcion de iteracion df es la derivada de f p0 es la aproximacion inicial a un cero de f delta es la tolerancia para la diferencia entre un valor de la iteracion y el valor de la iteracion anterior epsilon es la tolerancia para los valores de la funcion num_max_iteraciones es el numero maximo de iteraciones Salidas err es la diferencia entre dos terminos consecutivos
24
P es la sucesion {pn } completa i es el numero de iteraciones realizadas P[i] es la aproximacion al punto fijo
import numpy as np def newton_raphson(f, df, p0, delta, epsilon, num_max_iteraciones): P = np.zeros(num_max_iteraciones + 1) P[0] = p0 for i in range(num_max_iteraciones): P[i + 1] = P[i] - f(P[i])/df(P[i]) err = abs(P[i + 1] - P[i]) error_relativo = 2*err/(abs(P[i + 1]) + delta) y = f(P[i + 1]) if (err < delta or error_relativo < delta or abs(y) < epsilon): break if (i == num_max_iteraciones): print('Se ha excedido el numero de iteraciones') return P, i, error_relativo def f(x): return ((2*x - 11.7)*x def df(x): return (6.0*x - 23.4)*x + 17.7 P, i, error_relativo = newton_raphson(f, df, 3.0, 0.001, 0.0001, 10) + 17.7)*x - 5.0
25
def f(x): return ((2*x - 11.7)*x def df(x): return (6.0*x - 23.4)*x + 17.7 from scipy.optimize import newton zero = newton(f, 3.0, df) print(zero) + 17.7)*x - 5.0
26
2.7 Ejercicios
1. Construya un diagrama de flujo tal que dado como dato un nmero entero, determine e imprima si el mismo es positivo, negativo o cero. Utilice la estructura de seleccin multiple. Despus codifique su solucin en Python. 2. En una tienda efectan un descuento a los clientes dependiendo del monto de la compra. El descuento se efecta con base en el siguiente criterio: Si el monto es menor que $500.00, no hay descuento. Si el monto est comprendido entre $500.00 y $1,000.00 (inclusive), 5% de descuento. Si el monto est comprendido entre $1,000.00 y $7,000.00 (inclusive), 7% de descuento. Si el monto est comprendido entre $7,000.00 y $15,000.00 (inclusive), 11% de descuento. Si el monto es mayor a $15,000.00, 18% de descuento. Construya un diagrama de flujo que ilustre la solucin del ejercicio. Despus codifique su solucin en Python. 3. En un estudio se ha hecho un estudio sobre los pacientes registrados durante los ltimos 10 aos, con el objeto de hacer una aproximacin de los costos de internacin por paciente. Se obtuvo un promedio diario segn el tipo de enfermedad que aqueja al paciente. Adems se pudo determinar que en promedio todos los pacientes con edad entre 14 y 22 aos implican un costo adicional del 10%. El Cuadro 2.3 expresa los costos diarios, segn el tipo de enfermedad. Construya un programa en Python que calcule e imprima el costo total que representa un paciente (pista: considere el nmero de das que el paciente permanece internado). 4. Escriba un programa que genere todos los nmeros impares desde 1 hasta n. Fije un valor para n al inicio del programa y use un ciclo while para calcular los nmeros. Asegrese de que si n es un nmero par, el nmero impar ms grande generado es n - 1. Nombre del programa: impar.py
27
Cuadro 2.3: Costos de hospitalizacin por da segn el tipo de enfermedad. 5. Modifique el programa del ejercicio 4 y almacene los nmeros impares generados en una lista. Empiece con una lista vaca y use un ciclo while donde en cada iteracin del ciclo agregue un nuevo elemento a la lista. Finalmente, imprima la lista de elementos en la pantalla. Nombre del programa: lista_impares1.py. 6. Resuelva el ejercicio 5 utilizando una list comprehension (con for y range). Nombre del programa: lista_impares2.py. 7. (Calculo de una sumatoria) Se supone que el siguiente cdigo calcule la suma
s=
M =100 k =1
1 k
Este programa no funciona correctamente. Cules son los tres errores? Si usted intenta ejecutar el programa, nada suceder en la pantalla. Teclee CtrlC, es decir, presione (y deje presionada) la tecla Control (Ctrl) y entonces teclee la letra c, para detener el programa. Escriba un programa correcto. Nombre del programa: suma_while.py.
28
Hay dos formas bsicas de encontrar errores en el programa: a) Lea el programa cuidadosamente y piense en las consecuencias de cada instruccin b) Imprima resultados intermedios y compare con los clculos manuales Primero, intente el mtodo (a) y encuentre tantos errores como pueda. Entonces, intente el mtodo (b) para M = 3 y compare la evolucin de s con sus propios clculos manuales. Nota: Una forma pythonica de resolver este problema es mediante:
print(sum(1.0/k for k in range(1, M+1, 1)))
Suponga que desea calcular la funcin seno inversa: arcsin(x). El mdulo numpy tiene una funcin para calcular dicha funcin, pero cul es el nombre de esta funcin? Grafique esta funcin en el dominio adecuado. 9. Sea:
q = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]
Indexe esta lista para extraer a) La letra a b) La lista ['d', 'e', 'f']
29
c) El ltimo elemento h d) El elemento d e) Explique por qu q[-1][-2] tiene el valor g. Nombre del programa: index_nested_list.py 10. Construya un doble loop sobre una lista anidada. Considere la lista del ejercicio 9. Es posible visitar todos los elementos de q usando el siguiente for loop anidado:
for i in q: for j in range(len(i)): print i[j]
utilizando ciclos estndar for en lugar de list comprehensions. 12. Grafique la siguiente funcin utilizando matplotlib
0 x N ( x) = 2x 0
f ( t) =
0, t , 2
si 0 < t < si
2
<t<
30
4 [ ( n )] 2 n an = 2 (1) cos n 2 bn = 0 a0 =
es decir, la solucin es:
( n )] 2 [ n f ( t) = + (1) cos cos(nt) 8 n=1 n2 2 ( n )] 2 1 [ n (1) cos cos(nt) = + 8 n=1 n2 2
31