Curso breve de simulación de ecuaciones diferenciales en MATLAB/GNU Octave

¿Cómo se puede conocer el comportamiento de ecuaciones diferenciales que representan un sistema dinámico? Una forma de hacerlo es simulando numéricamente (obteniendo la solución numérica).

Para quienes no están familiarizados con la programación en MATLAB o en GNU Octave, les presento un minicurso de simulación de ecuaciones diferenciales que preparé en 2006.

Scripts

Los scripts o guiones son archivos que se ejecutan línea a línea y que pueden a su vez llamar a funciones de MATLAB/Octave1 o funciones definidas por el usuario. Considere por ejemplo, hacer el gráfico de la función $\sin(x)$, sin(x)en el intervalo [0 6]. Podemos escribir el código necesario en el archivo primer.m:

Si desde la ventana de comandos de MATLAB se escribe:

>> primer

O desde GNU Octave:

octave:1> primer

se ejecuta el contenido del script primer. Al ejecutar el código anterior se genera la siguiente gráfica:

Gráfica de la función $sin(x)$ en el intervalo $[0,2\pi]$
Gráfica de la función $\sin(x)$ en el intervalo $[0,2\pi]$
Simulación de una ecuación diferencial en MATLAB

El siguiente es un script para MATLAB el cual permite simular la ecuación diferencial $dx/dt = -x$, con condición inicial $x(0) = -1.5$. Recuerde que ésta es una ecuación diferencial de primer orden.

MATLAB usa la función ode23 para calcular numéricamente la solución $x(t)$ de la ecuación diferencial. El tiempo de simulación es entre [0 5] s y la condición inicial es x0.

La ecuación diferencial es simulada mediante el comando ode23. ¿Cómo? Este comando requiere que le pasemos la ecuación diferencial $\dot x = -x$. Esto se hace en el archivo priorden.m que contiene solamente una función, la función function derx = priorden(t,x) donde está escrita la ecuación diferencial:

De nuevo, priorden es el nombre de la función o function donde se define la ecuación diferencial $\dot x = -x$ y asimismo es el nombre del archivo priorden.m. La ecuación diferencial depende de (t,x). La ecuación derx = a*x; representa la ecuación diferencial con coeficiente constante a = -1.

Al ejecutar simu se obtiene la gráfica:

Respuesta de la ecuación diferencial de primer $\dot x = -x$ con condición inicial $x(0) = -1.5$
Respuesta de la ecuación diferencial de primer $\dot x = -x$ con condición inicial $x(0) = -1.5$

La solución analítica, dada por $x(t) = -1.5e^{-t}$, escrita en MATLAB/Octave x(t) = -1.5*exp(-t) la podemos sobreescribir en la gráfica anterior usando el comando hold:

Las opciones 'xr' significan que va a graficar cada punto con una 'x' y en color rojo. El resultado:

Se compara la solución analítica $x(t) = -1.5e^{-t}$  y la solución numérica obtenida usando MATLAB
Se compara la solución analítica $x(t) = -1.5e^{-t}$ y la solución numérica obtenida usando MATLAB

En GNU Octave

El código usado en GNU es equivalente, con las siguientes salvedades

  1. la función priorden posee dos particularidades: se puede incluir dentro del script, el orden de los parámetros de entrada se invierte (x,t),
  2. ahora se usa la función lsode en lugar de ode23 para el cálculo de la solución numérica de la ecuación diferencial,
  3. la función lsode requiere definir de forma precisa el vector de tiempo $t\in [0,5]$, esto se hace con la función linspace, en la cual además se indica el número de puntos que se calcularán2.

O en forma breve (sin hold):

Recuerde que:

  • MATLAB y GNU Octave están basados en vectores.
  • Las funciones definidas por el usuario son estructuras básicas de programación en MATLAB/Octave.
  • Para usar adecuadamente MATLAB/Octave reconozca las funciones básicas que necesita y estúdielas.

Simule en línea en GNU Octave ecuaciones diferenciales:

 

Acerca de Richard Márquez

Ing. de Sistemas con Doctorado en Automática. Enseño circuitos, simulación y teoría de control. Me gusta el modelado de sistemas no lineales y el diseño de leyes de control. Para mi, GNU Octave es un gran herramienta para hacer prototipos y enseñar a pensar.

Un comentario en “Curso breve de simulación de ecuaciones diferenciales en MATLAB/GNU Octave

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.