Programación Científica en Python

Descripción de Proyectos

Para los proyectos descritos a continuación, los tres componentes siguientes serán evaluados con igual ponderación:

  1. Implementación: Código generado para la implementación, usando algunas de las herramientas aprendidas en este curso.
  2. Profiling: Mediciones de la performance de su solución al problema.
  3. Visualización: Visualización de los resultados utilizando Matplotlib.

En cualquier caso usted es libre de diseñar los experimentos, mediciones de performance y de los resultados y gráficos a mostrar.

1.- Cellular Automaton: Conway's Game of Life

El Juego de la Vida es una aplicación de autómatas celulares (conjunto de reglas), para simular la formación de patrones en el crecimiento de colonias de organismos biológicos.

Este juego se representa por medio de un arreglo bi-dimensional de células vivas y células muertas. Las reglas para pasar de una generación a la otras son las siguientes (Existen diferentes variaciones, pero estas son las más comunes):

  • Sobrepoblación: Si una célula viva es rodeada por más de tres células vivas, muere.
  • Estasis: Si una célula viva es rodeada por dos o tres células vivas, sobrevive.
  • Subpoblación: Si una célula viva es rodeada por menos de dos células vivas, muere.
  • Reproduction: Si una célula muerta es rodeada por exáctamente tres células vivas, esta se vuelve una célula viva.

Aquí cada célula es representada como un píxel en una grilla/arreglo bi-dimensional.

Para más información visitar los siguientes links:

2.- Dynamic Systems: N-body Simulation

Este consiste en la simulación numérica de un sistem de N EDOs (Ecuaciones Diferenciales Ordinarias), que representan la dinámica de movimiento de un sistema de N partículas interactuando entre sí, como por ejemplo, en la interacción gravitacional de planetas y estrellas.

Sean un conjunto de $N$ cuerpos con masas $\{m_1, m_2, \ldots, m_N \}$, posiciones (2D) $\{\mathbf{x_1}, \mathbf{x_2}, \ldots, \mathbf{x_N} \}$ y velocidades $\{\mathbf{v_1}, \mathbf{v_2}, \ldots, \mathbf{v_N}\}$, que interactúan gravitacionalmente de acuerdo a la Ley de Gravitación Universal: $$ \mathbf{F_{ij}} = G \frac{m_i m_j}{|| \mathbf{x_j} - \mathbf{x_i} ||^3}(\mathbf{x_j} - \mathbf{x_i}), $$ correspondiente a la fuerza ejercida sobre el cuerpo i, por el cuerpo j. Entonces la dinámica del sistema viene descrita por la siguiente ecuación de movimiento (2da Ley de Newton): $$ m_i \frac{d}{dt} \mathbf{v_i} = m_i \frac{d^2}{dt^2}\mathbf{x_i} = \sum_{j\neq i}^{N} \mathbf{F_{ij}} = \sum_{j \neq i}^{N} G \frac{m_i m_j}{|| \mathbf{x_j} - \mathbf{x_i} ||^3}(\mathbf{x_j} - \mathbf{x_i}) $$

Para el caso 2D: $\mathbf{x_i} = (x_i, y_j)$, $\mathbf{v_i} = (v_{x_i}, v_{y_i})$ y las ecuaciones que describen el movimiento quedan: $$ \frac{d^2}{dt^2}x_i = \frac{d}{dt}v_{x_i} = G \ \sum_{j\neq i}^{N}\frac{m_j}{(x_j-x_i)^2} = H(x_i) $$

$$ \frac{d^2}{dt^2}y_i = \frac{d}{dt}v_{y_i} = G \ \sum_{j\neq i}^{N}\frac{m_j}{(y_j-y_i)^2} = H(y_i) $$

Se requiere resolver numéricamente la EDO para cada partícula del sistema. Para ello en cada componente de $\mathbf{x_i}$ y $\mathbf{v_i}$, se utiliza el método de Euler del siguiente modo ($\Delta t$ time step y $k$ número de iteración): $$ \Rightarrow v_{x_i}^{(k+1)} = H(x_i^{(k)}) \Delta t + v_{x_i}^{(k)} $$ $$ x_i^{(k+1)} = v_{x_i}^{(k+1)} \Delta t + x_i^{(k)} $$

$$ \Rightarrow v_{y_i}^{(k+1)} = H(y_i^{(k)}) \Delta t + v_{y_i}^{(k)} $$$$ y_i^{(k+1)} = v_{y_i}^{(k+1)} \Delta t + y_i^{(k)} $$

(Primero se actualiza la velocidad, luego la posición). Estas dos iteraciones deben llevarse a cabo para todas las partículas del sistema, partiendo de condiciones iniciales $(x_i^0, y_i^0)$ y $(v_{x_i}^0, v_{y_i}^0)$ para todas las partículas.