Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 Federico Agazzi, Lucas Bellomo, Franco Bellomo

Trabajo en elaboración. DRAFT

Problemas del curso Python Científico.

Autores:

  • Lic. Federico Agazzi
  • Lucas Bellomo @LucasEBellomo
  • Franco Bellomo @fnbellomo

Todo el material de este curso (teóricos, códigos, data input, etc) se encuentran en https://github.com/fnbellomo/curso_python_cientifico (hay dos _). En particular, los archivos con los datos de entrada estan en el directorio ./data_input/ y el nombre del archivo es datos_ejercicios_NumEjercicio.txt. Además, todas las salidas las guardamos en el directorio ./data_output/.


In [1]:
from __future__ import division
import numpy as np

1A) Cálculo de la molaridad de una solución.

Haciendo uso de Python como una calculadora, calcular la molaridad (M) de una solución de soluto A, a partir de los siguientes datos:

  • m = 5 g
  • ma = 30 g/mol
  • v = 2 L

In [2]:
m = 5
ma = 30
v = 2

molaridad = m/(ma*v)

print 'molaridad', molaridad


molaridad 0.0833333333333
1B) Función molaridad.

Calcular la molaridad de la sustancia con los datos anteriores, pero creando una función.


In [3]:
def molaridad(m, ma, v):
    c = m/(ma*v)
    return c

molaridad(m, ma, v)


Out[3]:
0.08333333333333333
1C) Varios datos iniciales.

Ahora supongamos que tenemos muchos valores de datos iniciales a los cuales les tenemos que calcular su respectiva molaridad. Es decir, que los datos iniciales son vectores de la forma:

  • m = [5, 7, 12, 4, 9, 5, 4, 3, 8, 10]
  • ma = [4, 2, 4, 3, 6, 8, 1, 2, 4, 7]
  • v = [30, 12, 42, 6, 12, 18, 27, 16, 9, 17]

Escribir un código que nos permita calcular todas estas molaridades, y nos imprima en pantalla cual es la máxima con sus respectivos valores iniciales.


In [4]:
#Valores iniciales
m_vector = np.array([5, 7, 12, 4, 9, 5, 4, 3, 8, 10])
ma_vector = np.array([30, 12, 42, 6, 12, 18, 27, 16, 9, 17])
v_vector = np.array([4, 2, 4, 3, 6, 8, 1, 2, 4, 7])
c_vector = np.zeros(10)

for i in range(len(m_vector)):
    c_vector[i] = molaridad(m_vector[i], ma_vector[i], v_vector[i])
    
#Calculo el valor maximo y su posicion
max_c = np.max(c_vector)
max_pos = np.argmax(c_vector)
print 'Valor maximo: %f con valores m = %d, v = %d, ma = %d' %(max_c, 
        m_vector[max_pos], v_vector[max_pos], ma_vector[max_pos])


Valor maximo: 0.291667 con valores m = 7, v = 2, ma = 12
1*) Molaridad y combinaciones

A lo largo del curso nos vamos a encontrar con ejercicos con un *. Esto indinca que son de una dificultad mayor siendo un reto interesante (capaz que hasta divertido!).
Supongamos que tenemos los mismos datos iniciales que en el ejercicio anterior, pero con la diferencia que ahora queremos calcular todas las posibles combinaciones entre ellos, y obtener el valor maximo y la combinanción del mismo.


In [5]:
c_vector = np.zeros((100, 10))
j = 0
for k in range(10):
    for h in range(10):
        for i in range(10):
            c_vector[j, i] = molaridad(m_vector[k], ma_vector[h], v_vector[i])
        j = j + 1
    
max_c = np.max(c_vector)
max_pos = np.argmax(c_vector)
print 'valor maximo: ', max_c, 'y su posición es', max_pos


valor maximo:  2.0 y su posición es 236

2A) Presión de un gas ideal.

Leer los datos de entrada del archivo datos_ejercicio_2A.txt que tiene los siguientes datos: n = 1 mol, T = 298 K, v = 5 L, y calcular la presión de un gas ideal.
Guardar la salida en un archivo de texto.


In [6]:
datos = np.loadtxt('data_input/datos_ejercicio_2A.txt')

def presion_gas_ideal(moles, temperatura, volumen):
    r = 8.314
    return (moles * r * temperatura) / volumen

salida = []
salida.append(presion_gas_ideal(datos[0], datos[1], datos[2]))
np.savetxt('data_output/output_2A.txt', salida, fmt='%.4f', header='La presion en atm es:')
2B) Importando los datos.

Lo mismo que en el caso anteriro, solo que ahora importamos los datos del archivo datos_ejercicio_2B.py


In [7]:
import sys
#Tener en cuenta que este path va a variar en otra máquina
sys.path.append( '/home/franco/MEGAsync/Curso_Python_Cientifico/data_input/' )

In [8]:
from datos_ejercicio_2B import *

print presion_gas_ideal(n, T, v)


495.5144
3A Grafico de P vs V.

Para n y T igual que el problema anterior, calcue la presión para los siguientes volumens V=1, 2, 3, 4 y 5 L. El archivo de entrada debe contener los volumenes. Graficar.


In [9]:
import matplotlib.pyplot as plt
%matplotlib inline

In [10]:
datos = np.loadtxt('./data_input/datos_ejercicio_3A.txt')
volumenes, mole, temperatua = datos[:, :1], datos[:, 1:2], datos[:, 2:3]
presiones = np.zeros_like(volumenes)
presiones[:] = presion_gas_ideal(mole[:], temperatua[:], volumenes[:])

plt.figure(figsize=(10, 8))
plt.plot(presiones, volumenes)
plt.title('Presion vs Volumen', fontsize=20)
plt.xlabel('$Presion$', fontsize=20)
plt.ylabel('$Volumen$', fontsize=20)
plt.grid()


3B Mejores plot

Observar que en el plot anterior, la cantidad de distintos volumenes que tomamos son pocos (5) creando los 'picos' en el plot. Realizar el mismo plot, pero tomando ahora màs de 50 puntos.


In [11]:
volumen = np.linspace(1, 10)
presiones = np.zeros_like(volumen)

presiones[:] = presion_gas_ideal(mole[1], temperatua[1], volumen[:])

plt.figure(figsize=(10, 8))
plt.plot(presiones, volumen)
plt.title('Presion vs Volumen', fontsize=20)
plt.xlabel('$Presion$', fontsize=20)
plt.ylabel('$Volumen$', fontsize=20)
plt.grid()


3* Más Plot

Supongamos ahora que conseguimos varios archivos donde en cada uno estan guardado los valores de presión y volumen para algunas determinadas condiciones. Escribir un código que nos plotee todos estos archivos y ademas nos escriba un archivo de salida que contenga el nombre del archivo leido y el valor máximo del volumen medido.
Los archivos estan en ./data_input/datos_3/*

Trabajando en la solucion en el otro notebook

4 Calculo de pH

Determine el $pH$ y $pOH$ de una solución cuya concentración de $H+$ es $[H+]=1.2\times10^{-4}$. El programa debe:

  • leer $[H+]$ de un archivo
  • calcular el $pH$ y $pOH$
  • escribir el $ph$ y $pOH$ en un archivo

In [12]:
from datos_ejercicio_4 import *

#calcula el pH dada una conc. de protones
def pH(x):
    return -np.log10(x)

#calcula el pOH dada una conc de protones
def pOH(x):
    return 14 - (-np.log10(x))

out = []
out.append( (H,pH(H),pOH(H)) )
np.savetxt( 'data_output/output_4.txt', out, fmt='%.4f' )
5 Ley de Arrhenius

La ley de Arrhenius se expresa como
$$ k(T) = A\exp\left(-\dfrac{E_{a}}{RT}\right) $$ Escriba un programa que permita calcular la constante de Arrhenius para $T=298K, R= 8,31 J(K mol)^{-1}, E_{a}= 1,601 kJ.K(mol)^{-1}, A=3,98\times10^{-3} s^{-1}$


In [13]:
k = lambda T, A, E_a, R: A*np.exp(-E_a/(R*T))

T = 298 #K
R = 8.31 #J/(Kmol)
E_a = 1.601 #klK/mol
A = 3.98*10**(-3) #1/s

print k(T, A, E_a, R)


0.00397742772891
6A Factorial (recursivo).

Escribir la función factorial de forma recursiva, y calcular el $8!$


In [14]:
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
    
factorial(8)


Out[14]:
40320
6B No recursivo.

Volver a escribir la función factorial, pero sin hacer uso de la recursivedad. Calcular el $8!$


In [15]:
#Defino la función factorial
def factorial(n):
    resultado = 1
    for i in range(1, n+1):
        resultado = resultado*i
        
    return resultado
        
print factorial(8)


40320
7 Sumatoria de una serie.
8 Ecuación de Clausius-Clapeyron
10 Dependencia de la FEM de una pila de la temperatura

La FEM de una pila electroquímica varia con la temperatura de acuerdo con la ecuación:
$$ E^{0}(T) = 0.2239 - 6.455\times10^{-3}\times(T - 25) - 3.248\times10^{-6}\times(T - 25)^{2} + 9.948\times10^{-9}\times(T - 25)^{3} $$
donde T es la temperatura en grados centígrados.
Calcule $E^{0}$ en el intervalo de temperatura $0-40^{o}C$ con un incremento de temperatura $\Delta T = 0.1^{o}C$


In [16]:
#Constantes del problema
T0, Tf, delta_T = 0, 40, 0.1  #ºC

#Vector de temperaturas y el de salida
T = np.arange(T0, Tf+delta_T, delta_T)
E0_vector = np.zeros(len(T))

#Cuenta
E0_vector[:] = 0.2239 - 6.455*10**(-3)*(T[:] - 25) - 3.248*10**(-6)*(T[:] - 25)**2 + 9.948*10**(-9)*(T[:] - 25)**3
    
#Plot
plt.figure(figsize=(10,8))
plt.plot(T, E0_vector)
plt.title('Variacion de la FEM en funcion de la temperatura', fontsize=20)
plt.xlabel('$Temperatura(^{o}C)$', fontsize=25)
plt.ylabel('$E^{0}$', fontsize=25)
plt.grid(1)


11 Cinética de reacciones consecutivas

Un mecanismo común en reacciones complejas es el de las reacciones consecutivas. El caso mas sencillo de este mecanismo es $$ A\overset{k_{1}}{\longrightarrow}B\overset{k_{2}}{\longrightarrow}C $$
En este mecanismo, las concentraciones de A, B y C varían en el tiempo de acuerdo con
$$ [A] = [A]_{0}\times e^{-k_{1} t} $$
$$ \left[B\right]=\left\{ \dfrac{k_{1}}{k_{1}-k_{2}}\right\} \left\{ e^{-k_{1}t}-e^{-k_{2}t}\right\} \left[A\right]_{0} $$
$$ [C] = [A]_{0} - [A] - [B] $$
Escriba un código que calcule $[C]$ con los valores $k_{1} =0.1s^{-1}, k_{2}=0.2s^{-1}, [A]_{0} = 5M, t_{f} = 5s, \Delta t = 0.1s$:


In [17]:
A = lambda A0, k1, t: A0*np.exp(-k1*t)
B = lambda A0, k1, k2, t: (k1/(k1- k2))*(np.exp(-k1*t) - np.exp(-k2*t))*A0
C = lambda A0, k1, k2, t: A0 - A(A0, k1, t) - B(A0, k1, k2, t)

t0, tf, delta_t = 0, 5, 0.1
A0, k1, k2 = 5, 0.1, 0.2
t = np.arange(t0, tf, delta_t)

plt.figure(figsize=(10,8))
plt.plot(t, C(A0, k1, k2, t))
plt.xlabel('$tiempo(s)$', fontsize=25)
plt.ylabel('Concentracion de C', fontsize=20)
plt.grid(1)


12 Niveles de energía de una particula en una caja unidimensional

De acuerdo con la mecánica cuantica, los niveles de energía de un electrón confinados en una caja de potencial unidimencional de longuitud l vienen dados por:
$$ E_{n}=\dfrac{h^{2}n^{2}}{8m_{e}l^{2}} $$
Escribir un programa que calcule la energía para $n = (1, 2, 3), h=6.626*10^{-34}Js, m_{e}=9.109*10^{-31}Kg, l = 1*10^{-9}m$


In [18]:
#Función
energia_n = lambda n, h, m_e, l: (h**2*n**2)/(8*m_e*l**2)

#Constantes
h = 6.626*10**(-34) #Js
m_e = 9.109*10**(-31) #Kg
l = 1*10**(-9) #m
n = np.arange(1, 4)

energia = energia_n(n, h, m_e, l)

for i in n:
    print 'E',i-1, '=', energia[i-1], 'J'


E 0 = 6.02479361071e-20 J
E 1 = 2.40991744429e-19 J
E 2 = 5.42231424964e-19 J

In [19]:
#style
from IPython.core.display import HTML
css_file = 'style/style_ipython_notebook.css'
HTML(open(css_file, "r").read())


Out[19]:

In [19]: