Sistema de hombre en la isla (así juego a los Sims jaja)

Monday, February 6th, 2012

Todo empezó por estar pensando en qué tanta energía consumiría pensar intensamente jaja.

Imaginé una situación donde una persona estuviera en un lugar con recursos alimenticios limitados (una isla), requiriera pensar para conseguirlos, pero a la vez el pensar le hiciera consumir la energía de esos recursos…

Aprovechando la clase de Modelación de Sistemas Fisiológicos, me sonó que podía modelar esa situación con un sistema de ecuaciones diferenciales y simularla jaja…

Planteo tres variables:

  • A: Cantidad de comida almacenada en la casa (o refugio) de la persona. Es la que puede consumir inmediatamente.
  • B: Cantidad de comida disponible en la isla. Hay que recolectarla
  • C: Cantidad de “conocimiento” de la persona (jaja)

Luego planteo algunas condiciones:

  • La cantidad de conocimiento va a crecer proporcionalmente a la cantidad de comida almacenada (se motiva, no sé jaja).
  • La cantidad de comida disponible en la isla va a decrecer proporcionalmente a la cantidad de conocimiento de la persona, pero también entre menos comida haya más difícil será obtenerla.
  • La cantidad de comida almacenada en la casa se consumirá a una razón proporcional a la cantidad de conocimiento de la persona (entre más sabe y más piensa más tiene que comer) y crecerá conforme se obtenga comida de la isla.

En ecuaciones diferenciales, quedaría así:

  • dC/dt = k1*A
  • dB/dt = -k2*C + k3/B
  • dA/dt = -k4*C – dB/dt

Y pues ya, como vimos en clase, usé la función de MATLAB/Octave “ode45” para simular y jugar con el sistema, cambiando las condiciones iniciales y los diferentes factores, estuvo entretenido jaja. Aquí hay una de las gráficas resultantes:

(Sí, ahí el hombre no dura mucho en la isla jajaja)

Claramente el modelo está incompleto (¿qué pasa con la conciencia ambiental y propia conforme el conocimiento crece? ¿qué otras motivaciones habrían para el crecimiento de este conocimiento? ¿cómo trata el ambiente a la comida almacenada? etc…) pero bueno, solo quería resolverme la duda de si podía aplicar lo visto en clase en esta situación “propia”.

Y bueno, lo importante, aquí están los archivos de MATLAB/Octave (yo usé Octave, para MATLAB habrá que revisar que la sintaxis sí sirva así como está). Hay que ejecutar el que se llama “simulacion”, el otro lo que hace es definir las ecuaciones para que la función ode45 (o cualquier otra de la familia) pueda resolverlas numéricamente.

SimHombreIslaComidaConocimiento

Debería haber usado este tiempo en resolver el examen de esa materia… pero bueno

😛

Convolución – Ejercicio 2 Proyecto 2 de TE2004.1 201013

Monday, September 13th, 2010

Seré breve, escribo esto para los que me han preguntado. Por lo tanto ya están en el contexto de la materia

Se tiene el siguiente problema:

Genera un script de Matlab que se llame convo.m. Crea un vector h que contenga la respuesta al impulso de un filtro pasabajas ideal utilizando la función sinc (función matemática, no de Matlab). La función sinc es la siguiente: k sin(2π fc x)/x. La frecuencia de corte fc está definida como un porcentaje de la frecuencia de muestreo, así que su valor sólo puede estar entre 0 y 0.5 (ya que 0.5 nos da la frecuencia máxima representable en el muestreo). A pesar de que la respuesta al impulso de este filtro es infinita estamos limitados a tomar un número finito de muestras de la misma, así que nuestro vector x tendrá un valor de -20 a 20. La constante k se escoge para hacer que la sumatoria de todas las muestras del vector sea igual a 1. Esto es para hacer que el filtro tenga ganancia unitaria. Por lo tanto k se calcula (y se multiplica por todas las muestras) después de evaluar la función sin(2π fc x)/x para los valores de x ya mencionados. Una función útil de Matlab para hacer esto es sum(). Grafica el vector h. Carga el sonido Handel con el comando load y programa la sumatoria de convolución del mismo con el vector h. Guarda el resultado en un vector llamado s. Tu vector de salida deberá de tener un tamaño de m+n-1 donde m y n son los números de muestras de tus dos vectores de entrada. Reproduce el sonido original y el sonido convolucionado para escuchar la diferencia (usa el comando pause() para que no se reproduzcan simultáneamente). Puedes corroborar que tu algoritmo de convolución esté correcto comparando su salida con la salida de la función conv() de Matlab que lleva a cabo esta tarea. *fc = .5/3 y para x=0 utiliza f(x) = 2*pi*fc.

Lo complicado es hacer el algoritmo de la convolución.

La convolución discreta la tenemos definida como la sumatoria de k=0 a m de h(k)f(t-k), donde m es el número de muestras que tiene el vector h.

Visto de otra forma, estamos sumando en un vector R (el resultado) a la multiplicación del primer elemento de h con todo el vector f, más la multiplicación del segundo elemento de h con todo el vector f recorrido un espacio a la derecha, más el tercer elemento de h por todo el vector f recorrido dos espacios a la derecha, y así sucesivamente.

A continuación presento un algoritmo más o menos generalizado a cualquier lenguaje de programación. Usando el manejo de vectores de MATLAB, esto puede quedar mucho más elegante 🙂

(Se asume que se tiene un vector h y un vector f a ser convolucionados. Los guiones antes de las instrucciones son para escribir la indentación)

r = zeros(1,length(h)+length(f)-1) %Creamos el vector donde se va a guardar el resultado de la convolución

for i= 1:length(h) %se va a recorrer todo el vector h

—for j=1:length(f) %se recorre todo el vector f

——r(i + j – 1) += h(i) * f( j ) ;  %Iniciando desde la posicion i y hasta recorrer todo el vector f, se guarda en orden la multiplicacion de h(i) por el elemento  correspondiente de f. Notese que conforme i crece, avanza la posicion donde se empieza a sumar el vector f multiplicado

—end

end

Con lo demás no debería haber problema 🙂

¡Saludos!