Story Transcript
Utilización de MATLAB en la solución de ecuaciones diferenciales con una introducción a la modelizacón matematica Muchas de las ecuaciones diferenciales con las cuales nos encontramos no son manejables en forma exacta como se aprende en los cursos sobre ODE. Una herramienta en el análisis de estas ecuaciones es el uso de paquetes de solución numérica de ecuaciones diferenciales. Otras metodologías proporcionan un analisis cualitativo de las soluciones y asi obtenemos alguna información acerca de las soluciones aunque no exista una forma explicita para la misma..Veremos como Matlab puede ser utilizado como una herramienta para encontrar una solución aproximada y así poder dibujarla.
Ecuación diferencial escalar. Primeramente estudiaremos el caso mas simple con una sola variable, la cual tiene la forma general: dz = F (t , z ) dt z (t0 ) = z0 Pensamos a la variable t como el tiempo y z como la variable que describe el estado del sistema. En general uno trata con sistemas ¨autónomos¨ (independientes del tiempo), pero aquí es donde matlab se hace fuerte pudiendo tratar con sistemas mas generales en los cuales el miembro derecho dependa del tiempo y de las variables de estado del sistema. Veamos Matlab puede ser usado para resolver el modelo de Verhulst dN N = rN (1 − ) dt K
(1.1)
N (t0 ) = N 0 La variable de estado es escrita como N en vez de z. Los parámetros r y K son contantes que representan el crecimiento sin obtaculos (por ejemplo sin limitaciones en los recursos o poblaciones pequeñnas o en estado insipiente) y la capacidad de transporte. Supongamos por un momento de cómo se resuelve la ecuación de Verhults por separación de variables. He aquí como Matlab puede evaluar aproximadamente y dibujar sin conocer en forma explícita la formula para la solución exacta. Primero escribimos una Mfile que compute F, el lado derecho de la ecuación diferencial. Para el caso del modelo de Verhults
F = F (t , N ) = rN (1 −
N ) K
A continuación se reproduce el código de la función que resuelve el modelo de Verhulst
function F=verhulst(t,N) % esta funcion devuelve la velocidad de cambio de la poblacion para el % modelo de verhulst % el usuario debe ajustar parametros en la seccion de USER PARAMETERS % % dN/dt=F(N)=r N (1 - N/K) % % Input variables % t=time % N=current population size % % Input parameters (externos): % r=unhitered per capita growth rate of population % N=current population size % output variables % F=velocidad de cambio de la poblacion (dN/dt) % parametros del usuario r=0.55; K=665; % computo principal F=r*(1-N/K)*N; return Hay que hacer notar que aunque F no depende explícitamente del tiempo se ha incluido como argumento en la entrada de la primera linea. Esto es necesario para que el ODE solver pueda trabajar apropiadamente El primer argumento de la función debe ser la variable tiempo, y el segundo argumento de la funcion debe ser la variable de estado, la cual en este caso es llamada N. Matlab por supuesto requiere números específicos para todos los parámetros de entrada, de modo que se deben proporcionar valores para r y K . Es conveniente recolectar todas las constantes de entrada en un lugar como por ejemplo se hizo en la seccion ¨%User parameters¨ de forma que el usuario pueda cambiar los valores con facilidad. Ahora supondremos que queremos resolver el modelo de verhults (1.1) sobre el intervalo de tiempo 0< t < 18 horas (se debe estar alerta hacerca de la consistencia de las unidades tal como horas para t, pero por supuesto que a Matlab no le interesa el sistema de unidades que uno use. Pero si es importante que los cálculos sean consistentes y asi poder interpretar los resultados en termino de resultados del mundo real. Supongamos que en t=0 la población de tamaño N0=9.6 (medida con repecto unidad biomasica del sistema). A continuación se lista el programa que puede llevar a cabo tal tarea en modo comando es >>tspan=[0 18]; >>N0=9.6 >>[t,N]=ode45('verhulst',tspan,N0); >>plot(t,N) >>title('matlab solution of Verhulst model') >>xlabel('t (hours')
>>ylabel('N (biomass)') Las variables t y N son realmente vectores columna que guardan los valores de t y N en cada paso de tiempo que Matlab utiliza para resolver la ecuación diferencial. La grafica de la solucion de la ecuación se muestra en la figura 1. Notemos que la solucion numérica aproximada tiene la misma forma que la solución exacta
Figura 1
Sistemas de ecuaciones diferenciales En muchas ocasiones necesitados describir la evolución de un estado el cual requiere de 2 o mas variables para poderlo describir. Si la velocidad de cambio del sistema puede ser expresada como una funcion instantanea del tiempoy del estado del sistema , entonces se puede modelar matemáticamente como una ecuación diferencial para dicho vector:
dz = F (t , z ) dt
(1.2)
z (t0 ) = z (0)
Donde z es un vector que describe el estado y F es una funcion vectorial del tiempo En componentes esto puede ser escrito como sigue
dz1 = F1 (t , z1 , z2 ,......, zn ) dt dz2 = F2 (t , z1 , z2 ,......, zn ) dt .................................... .................................... dzn = Fn (t , z1 , z2 ,......, zn ) dt Con condiciones iniciales z1 (t0 ) = z1(0) z2 (t0 ) = z2 (0) ............................. zn (t0 ) = zn (0)
Suponemos aquí que el estado requiere de n variables z1 , z2 ,….., zn para su descripción. Como ejemplo se considerará el caso de dos especies que compiten . El estado del sistema está descrito por dos variables x e y las cuales representas las poblaciones de cada una de las especies. El sistema de ecuaciones diferenciales que describen el modelo es: dx = (a − by ) x, dt (1.3) dy = (m − nx) y, dt Donde a,b,m y n son parámetros constantes que necesitan ser especificados externamente al modelo y debemos aportar condiciones iniciales de la forma x(t0 ) = x0 y (t0 ) = y0
(1.4)
No tenemos ninguna solución explicita disponible para este sistema de ecuaciones diferenciales. Pero podemos preguntarle a MATLAB si nos puede proporcionar una solución aproximada con el paquete ODE paquete ode45. Conceptuallmente es mas de lo mismo que en el caso de una sola variable. Pero debemos ser cuidadosos con la notación. El ODE solver de MATLAB espera que se describa el estado del sistema con un vector. Por lo tanto para resolver 2.3 con MATLAB debemos primero describir el estado del sistema con un vector de estado con componentes igual a las variables de estado
⎡z ⎤ z = ⎢ 1⎥, ⎣ z2 ⎦ z1 = x, z2 = y ,
Reescribiendo el sistema de ecuaciones diferenciales 2.3 en término de este vector de estado tenemos: ⎡ (a − bz2 ) z1 ⎤ dz = F (t , z ) = ⎢ ⎥, − ( ) m nz z dt ⎣ 1 2⎦ ⎡x ⎤ z (t0 ) = ⎢ 0 ⎥ , ⎣ y0 ⎦ La cual es de la forma 2-2. Ahora podemos escribir una M-file que calcule el lado derecho del sistema de ecuaciones diferenciales en la forma de un vector F(t,z).
function F=compspec(t,z) % evalua la velocidad de cambio de una poblacion de un modelo simple de % especies en competencia % El usuario debe ajustar los parámetros en la seccion user parameters % dx/dt = a x +b x y % dy/dt = m y -m x y % % Variables de entrada % t= tiempo % z= vector de estado con componentes z(1)=x, z(2)=y, % con x e y represent5ando la poblacion de las especies % Parametros de entrada (externos) % Parametros de entrada % a,m= velocidad de crecimiento aistado per capita de cada especie % parametros de interaccion % variables de salida % F=vector columna con F(1)=dx/dt y F(2)=dy/dt %USER PARAMETERS a=3; b=5/2; m=2; n=1; % traduccion del vector de estado a variables mas convenientes x=z(1); y=z(2); % ajusta de F como un vector columna con dos entradas F=zeros(2,1); % Computo principal F(1)=a*x-b*x*y; f(2)=m*y-n*x*y; return Ahora supondremos que queremos resolver la evolución de la población de especies en competencia sobre el intervalo de tiempo 0=< t =< 2.5, comenzando con poblaciones iniciales x0=0.2 e y0=0.18 (imaginando que el tamaño de la población digamos que está en unidades de millar digamos)
Entonces aquí es como MATLAB puede ser instruido para realizar esta tarea tspan=[0 2.5]; z0=[0.2 0.18]; [t z]=ode45('compspec',tspan,z0); La variable t es nuevamente un vector columna que guarda los valores de t que utilize MATLAB para discretizar el tiempo. La variable z es ahora una matriz. La primera coluna se refiere a los valores de z1 en varios tiempos, y la segunda columna se refiere a los valores de z2 en los distintos tiempos. Hay un número de graficos que pueden utilizar esta información. Quizas estemos interesados en dibujar x versus t fig.2 plot(t,z(:,1)) title('poblacion de la primera especie vs tiempo') xlabel('t') ylabel('x')
Fig.2
O quizas deseemos graficar y versus t (fig.3). Para lo cual corremos el script siguiente tspan=[0 2.5]; z0=[0.2 0.18]; [t z]=ode45('compspec',tspan,z0); plot(t,z(:,2)) title('poblacion de la segunda especie vs tiempo') xlabel('t') ylabel('y')
FIG.3
Y tambien podemos plotear todas las variables de estado simultáneamente como una funcion del tiempo(fig.4) mediante el script. tspan=[0 2.5]; z0=[0.2 0.18]; [t z]=ode45('compspec',tspan,z0); plot(t,z) title('poblacion de la segunda especie vs tiempo') xlabel('t') ylabel('y')
FIG.4
Finalmente para el sistema de dos variables , es frecuentemente interesante haccer un dibujo del espacio de faces de una variable en funcion de la otra(fig.5) cuyo strip es: tspan=[0 2.5]; z0=[0.2 0.18]; [t z]=ode45('compspec',tspan,z0); plot(z(:,1),z(:,2)) title('Ploteo del espacio de estados') xlabel('x') ylabel('y')
Fig.5 : Solucion del modelo de especies en competencia (2.3). Parámetros a=3,b=5/2,m=2,n=1. Condiciones iniciales x0=0.2,y0=0.18