Documente Academic
Documente Profesional
Documente Cultură
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!
(2.2)
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 la Ecuacin (2.2) 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 la Ecuacin (2.2) 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 print("sin({0:g}) = {1:g} (aproximacin con N = {2:d})". format(x, sumatoria, N)) print("Valor real = {0:g}".format(math.sin(x)))
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
(2.3)
2 a+T a0 = f (t) dt T a ) ( 2 a+T 2nt dt an = f (t) cos T a T ) ( a+T 2 2nt bn = dt f (t) sin T a T
(2.4)
19
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 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.5)
1 3 n f (t) = + [1 (1) ] sin(nt) 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.6)
La sumatoria de la Ecuacin (2.6) es la parte de la expresin que parece ms complicada de entender. Tal vez, la sumatoria pueda parecerte ms fcil de comprender si se reescribe como:
sin [(2n 1)t] n=1
2n 1
sin t
sin 3t
sin 5t
sin 7t
21
Figura 2.4: Primeros tres trminos de la serie de Fourier de la Ecuacin (2.6) y su suma
La Figura 2.4 se obtiene utilizando los primeros 3 trminos de la sumatoria de la ltima expresin para f (t):
22
# Qu es lo que hace cada una de las tres sentencias siguientes? import matplotlib.pyplot as plt import numpy as np from numpy import pi num_puntos = 301 # Qu hace la funcin np.linspace()? # Cuntos valores se almacenan en t? # Cul es el tipo de datos de la variable t? t = np.linspace(-2.0, 4.0, num_puntos) # Qu hace la funcin np.zeros()? # Cuntas dimensiones tiene la variable f? # Cuntos valores puede almacenar f? # De qu manera indexas cada elemento de f? f = np.zeros((3, num_puntos)) # Cuntas iteraciones se realizan en el siguiente bloque for? # Qu es lo que repite cada iteracin del ciclo? for n in range(3): # Cules son los valores que toma la variable impar durante cada iteracin? impar = 2*n + 1 # Cul es el tipo de datos de las variables theta? # Cuntos valores almacena la variable theta? theta = impar*pi*t # Qu indica la notacin f[n]? # Qu tamao tiene f[n] (para cada valor de n)? f[n] = np.sin(theta)/impar # Qu es lo que se est graficando en la siguiente instruccin? # Cuntas grficas se estn haciendo con la siguiente instruccin? plt.plot(t, f[n]) # Qu es lo que hace f.sum(0)? y = 0.5 + 6.0/pi*f.sum(0) # Qu es lo que se est graficando en la siguiente lnea? 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.
23
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:
(2.7)
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 (2.7) es sencillo, pero no es fcil averigar 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 : pV 3 n(RT + bp)V 2 + n2aV n3ab = 0 (2.8) Existe una forma de calcular de manera exacta la solucin a polinomios cbicos, pero aprovecharemos este ejercicio para utilizar un mtodo numrico: el mtodo de Newton-Raphson para encontrar races de ecuaciones no lineales. En palabras simples, si xi es una aproximacin a una raz de f (x) = 0, entonces es posible que una mejor aproximacin est dada por la frmula:
xi+1 = xi
f ( xi ) f ( xi )
(2.9)
donde f (x) denota la derivada de f (x) con respecto a x. En la Ecuacin (2.8), la variable independiente es V (f (V ) = 0), por lo que la iteracin de NewtonRaphson (2.9) est dada por:
Vi+1 = Vi
f (Vi ) f (Vi )
(2.10)
Cul es la derivada f (V )? Utiliza el siguiente cdigo como punto de partida para resolver el problema anterior. Notas: Entradas
24
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 P es la sucesion {pn } completa i es el numero de iteraciones realizadas P[i] es la aproximacion al punto fijo
25
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
26
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
27
28
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. Ayuda: Revisa bien las notas en busca de ejemplos que utilicen la estructura repetitiva while. Estudia dichos ejemplos y ejectalos en el WinPython. Recuerda que debes respetar la indentacin para evitar errores ocasionados por no acomodar bien tu cdigo. Supn que n = 5. Entonces tu programa debera dar como resultado la secuencia de nmeros impares 1, 3, 5. Si n = 10, la secuencia debera ser 1, 3, 5, 7, 9. Cmo calculas mentalmente el siguiente nmero impar en la secuencia? Esa misma operacin es la que la computadora debe efectuar para
29
obtener el siguiente nmero impar. 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. Ayuda: Revisa el segundo ejemplo de la pgina 17. 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. 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
30
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. Ayuda: Revisa un libro de matemticas que te ayude a recordar el concepto de dominio de una funcin. Despus averigua cul es el dominio de la funcin arcsin(x). 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'] c) El ltimo elemento h d) El elemento d
31
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. Ayuda: Estudia el cdigo sustituyendo la expresin interna (una list comprehension) por la lista que genera. 12. Grafique la siguiente funcin utilizando matplotlib
0 x N ( x) = 2x 0
Ayuda: Primero grafica la funcin en tu libreta, para que tengas una idea de cmo debe verse el resultado generado por computadora. Despus estudia el cdigo que se utiliz para producir la Figura 2.3 y utiliza este como base para tu propia grfica.
32
f ( t) =
0, t , 2
si 0 < t < si
2
<t<
4 [ ( n )] 2 n an = 2 (1) cos n 2 bn = 0 a0 =
es decir, la solucin es:
( n )] 2 [ n (1) cos cos(nt) f ( t) = + 8 n=1 n2 2 ( n )] 2 1 [ n = + (1) cos cos(nt) 8 n=1 n2 2
Grafique la serie anterior con 100 trminos. Ayuda: Estudia cuidadosamente el ejemplo de la Seccin 2.6.3. Haz un esfuerzo por responder las preguntas planteadas en el cdigo del ejemplo y despus intenta utilizar dicho cdigo como una base para resolver este problema.
33
a) Resuelva el problema utilizando una comprensin de lista. b) Resuelva el problema utilizando un ciclo for y una estructura de seleccin doble. Ayuda: La salida generada en ambos casos debe ser
[True, True, False, True, True, True]
2. Escriba un programa que imprima: Tarifa menor, si la edad de una persona es mayor que 6 y menor que 16. Tarifa mayor, si la edad de la persona es mayor que 6 pero no menos que 16. Gratis, si la edad de la persona no es mayor que 6. 3. Escriba un programa que reciba como entrada un salario y que determine el impuesto que debe pagar, de acuerdo con las siguientes reglas: Si los ingresos son menores o iguales a $10,000.00 no se pagan impuestos. Si los ingresos son mayores de $10,000.00 pero menores o iguales a $50,000.00 se paga un impuesto de 20 %. Si los ingresos son mayores a $50,000.00, se paga un impuesto de 30 %. 4. Escriba un programa que reciba un nmero del 1 al 7 y que imprima en la pantalla el da correspondiente de la semana (empezando con el Lunes). 5. Escriba un programa que recibe dos enteros positivos, ambos menores o iguales a 10 y que obtiene su producto (multiplicacin) utilizando nicamente sumas. Utilice un ciclo for para resolver el problema. 6. Utilice ciclos for anidados para imprimir en pantalla el siguiente patrn:
A A A A A A A A A A A A A A A A A A A A
34
7. Escriba un programa qpara mostrar en pantalla 10 nmeros aleatorios mediante un ciclo. Use el mtodo random.random() para generar un nmero aleatorio x tal que 0 x < 1.0. 8. Escriba un programa que muestre una tabla de multiplicar, como la que utilizan los nios. Por ejemplo, la tabla para los nmeros del 1 al 6 es: 1 2 3 4 5 6 1 1 2 3 4 5 6 2 2 4 6 8 10 12 3 3 6 9 12 15 18 4 4 8 12 16 20 24 5 5 10 15 20 25 30 6 6 12 18 24 30 36 El programa debe ser capaz de mostrar una tabla de un tamao menor que 20 columnas, especificada mediante un entero.
35