Você está na página 1de 13

Ejemplos de Solucin de ODES con MATLAB o

Prof. Ivn Huerta a Revisin: Octubre 2002 (MATLAB 6) o

Introduccin o
En este documento mostramos ejemplos sencillos de resolucin numrica de o e ecuaciones diferenciales ordinaras con Matlab 6. Previo a estos ejemplos presentamos una pequea introduccin a M-archivos, cuyo manejo es requerido n o en los ejemplos presentados.

Iniciando Matlab
Al realizar un doble-click sobre el cono para ejecutar Matlab, se abre una ventana con varias sub-ventanas. como la siguiente

El cursor queda en la linea de comandos que tiene al inicio >>. All Ud. escribe comandos matlab los que se ejecutan al presionar la tecla [RETURN]. Una sesin muy sencilla que calcula la inversa de la matriz A es la siguiente o >> A= [ 1 2 3; 2 1 -1; 2 1 2] A = 1 2 2 >> inv(A) ans = -0.3333 0.6667 0 0.1111 0.4444 -0.3333 0.5556 -0.7778 0.3333 2 1 1 3 -1 2

Sin embargo, no es conveniente escribir los comandos que realizan los clculos a directamente en la l nea de comandos, si no es mejor escribirlos en un Marchivo y luego ejecutarlo en la l nea de comandos. Esto permite desarrollar los clculos en forma incremental, l a nea a l nea, y adems permite repetir el a conjunto completo de clculos en forma directa y sencilla. a

M-Archivos
Los aspectos ms relevantes de los M-archivos son los siguientes: a Los archivos que contienen cdigo Matlab son los M-archivos. o Matlab reconoce los M-archivos porque tienen extensin .m o Un M-archivo puede denir una funcin con ciertos parmetros como o a INPUT y produce su valor como OUTPUT, o bin puede ser un archivo e script que ejecuta una serie de comandos. 2

Ud. crea un archivo .m con un editor de texto como Notepad, Wordpad, emacs, etc.. Desde las versiones 5.0 en adelante, Matlab trae su propio editor, que es ms bin un ambiente de programacin con a e o debugger. Para crear un archivo .m con este editor seleccione File>New->M-le en el men de Matlab. u La siguiente tabla compara los M-archivos usados para denir un script o una function.

Script
No tiene argumentos de INPUT o OUTPUT Las variables de trabajo son las globales Util para automatizar una serie comandos que se desea repetir.

Function
Puede aceptar argumentos de INPUT o OUTPUT Las variables internas son locales por defecto Util para agregar a Matlab las funciones que Ud. desee.

La mayor de las personas no escribe cdigo Matlab directamente en la a o l nea de comandos, si no que trabaja sobre un archivo tipo SCRIPT, al que se le agregan las l neas en forma incremental. Este archivo se ejecuta desde la l nea de comandos tipeando su nombre.

Ejemplo de archivo Script


Suponga que Ud. crea el archivo graficos.m con un editor de su eleccin o en el directorio C:\work con las siguientes l neas. x= [0:0.1:pi]; y(:,1)= sin(x); y(:,2) = cos(x); y(:,3)= x.^2-2*x; for j=1:3 plot(x,y(:,j)); pause end; Para ejecutar los comandos en el archivo graficos.m ud. debe primero asegurarse que el directorio C:\work est en el PATH de matlab. Para ello e Ud. puede ejecutar el comando 3

>> cd c:\work O bien >> addpath c:\work Luego se ejecuta >> graficos Para ver los 3 grcos presione [RETURN] para avanzar cada pausa. a

Ejemplo de una funcin o


Ud. puede extender la funcionalidad de Matlab agregando sus propias funciones o procedimientos. Por ejemplo, con su editor preferido cree el archivo func.m en un directorio de su eleccin. Asegrese de que este directorio est o u e en el PATH de Matlab (use los comandos cd o addpath a conveniencia) function Y=func(X) %INPUT matriz X %OUTPUT la matriz que resulta de aplicar f(x) = sin(x^2)/(1+x^2) %a cada elemento de X Y= sin(X.^2)./ (1+X.^2); Note que en Matlab un escalar es una matriz de 1x1. Por lo tanto, la funcin o se puede usar, por ejemplo, para evaluar func(3.5). El inicio de un comentario se indica con un %. Para gracar (en rojo) la funcin y = f unc(x) en o el intervalo [0, 4] escribimos el siguiente script plotfunc.m x= [0:0.1:4]; y=func(x); plot(x,y,r) title(Grafico de y=sin(x^2)/(1+x^2)) Ejecutando este script en la ventana de comandos de matlab se obtiene el siguiente grco: a >> plotfunc

0.5

Grafico de y=sin(x2)/(1+x2)

0.4

0.3

0.2

0.1

0.1

0.2

0.5

1.5

2.5

3.5

Solucin de ODES o
Matlab 6 dispone de varios algoritmos de resolucin numrica de EDOS: o e ode45, ode23, ode113, ode15s, ode23s. Este conjunto de rutinas puede variar de versin en versin de Matlab. Vea el manual de su versin de Matlab para o o o determinar las que Ud. tiene disponibles. La rutina ode45 corresponde a una implementacin de un mtodo de o e Runga Kutta de paso variable, y es la rutina que usamos en nuestros ejemplos. Las otras rutinas siguen la misma convencin de uso. La seleccin de la rutina o o ms adecuada para su problema depende de ste y de la precisin que Ud. a e o desee (vea el manual de Matlab para mayores detalles)

Problema 1
Considere la ecuacin diferencial y = 0.1y + 1/(1 + t2 ) sin(t), t [0, 10] o con condiciones iniciales y(0) = y0 , con y0 en el intervalo [0, 20]. a) Graque la solucin con condiciones iniciales y(0) = 3 o

b) Graque soluciones de la EDO para valores de y0 [0, 20]. c) Determine aproximadamente el valor mximo de la solucin obtenida a o en a). Solucin o a) La ecuacin se escribe como y = f (t, y) y(0) = y0 donde f (t, y) = o 0.1 y + 10/(1 + t2 ) sin(t). Usamos la subrutina ODE45 de matlab para obtener los valores de y(t) en una particin del intervalo [0, 10] o para la condicin inicial y(t) = 3. Primero denimos la funcin f(t,y) o o en el archivo f.m de la siguiente manera function z=f(t,y) z=-0.1*y +10/(1+t^2)*sin(t); Escribimos en el archivo scrpt1a.m los siguientes comandos matlab y0=3 %condicion inicial odeset(RelTol,1e-4,AbsTol,[1e-5]); %Definimos el error relativo % y absoluto deseados en la integracion [t,y]=ode45(@f,[0 10],y0); plot(t, y) Ejecutando el comando >scrpt1a en matlab obtenemos el grco dea seado

10

b) Escribimos en el archivo scrpt1b.m los siguientes comandos matlab % y0 vector con los diferentes valores de condiciones iniciales y0vec=[0:1:20] %y0=[0;1;2;3;....;20] odeset(RelTol,1e-4,AbsTol,[1e-5]); for y0=y0vec [t,y]=ode45(@f,[0 10],y0); plot(t,y); hold on; end; hold off; % Ejecutando el comando >scrpt1b en matlab obtenemos el grco dea seado

25

20

15

10

10

c) Para obtener el mximo de la solucin obtenida en a) debemos dea o terminar donde se anula su primera derivada. Para ello denimos la siguiente funcin auxiliar en un archivo df.m. Ella calcula la derivada o de la solucin con condicin inicial y(0) = y0 en el instante t deseado. o o function z=dfsol(t,y0) %dfsol(t,y0) valor de la derivada y(t) de la solucion con y(0)=y0 odeset(RelTol,1e-5,AbsTol,[1e-5]); [tv,yv]=ode45(@f,[0 t],y0); z=f(tv(end),y(end)); A continuacin determinamos donde se anula y (t). Del grco anterior o a vemos que esto sucede aproximadamente en t = 2.5. Por ello buscamos donde se anula df sol(t, 3) en el intervalo t [1, 5]. Los siguientes comandos Matlab producen el resultado deseado: y0=3; tmax=fzero(@dfsol,[1 5],[],y0) [tv,yv]=ode45(@f,[0 tmax],y0); ymax=yv(end) 8

Para mayores detalles vea > help fzero. Con esto obtenemos que la solucin tiene su valor mximo (aprox) en tmax = 2.4927 cuya valor o a es ymax = y(tmax) = 8.3780.

Problema 2
Graque en el intervalo [0, 2] la solucin de la ecuacin diferencial y sus dos o o primeras derivadas. x + (x )2 x + t(x + 2)3 x + (t2 + 1)x = t sin(t), x(0) = 1, x (0) = 2, x (0) = 3 Solucin o Escribimos la ecuacin diferencial como un sistema de primer orden con o condiciones iniciales en la forma X = F (t, X), X(0) = X0 . Para ello denimos x1 = x, x2 = x , x3 = x . Entonces la ecuacin diferencial se escribe o como x1 = x 2 x2 = x 3 x3 = x2 x3 t(x1 + 2)3 x2 (t2 + 1)x1 + t sin(t) 2

Deniendo X = (x1 , x2 , x3 )T y F : R4 R3 como x2 x3 F (t, X) = 2 3 2 x2 x3 t(x1 + 2) x2 (t + 1)x1 + t sin(t) el sistema se escribe vectorialmente como X = F (t, X), X(0) = (1, 2, 3)T .

Usamos la subrutina ODE45 de matlab para obtener los valores de X(t) en una particin del intervalo [0, 2]. Primero denimos la funcin F(t,X) (la o o llamamos f2(t,x) para distinguirla de la f del ejemplo anterior) en el archivo f2.m de la siguiente manera

function y=f2(t,x) y=zeros(3,1); %vector columna y(1) = x(2); y(2)= x(3); y(3) = -x(2)^2*x(3)-t*(x(1)+2)^3*x(2)-(t^2+1)+sin(t)*t; Ejecutando los siguientes comandos matlab obtenemos el grco deseado a % a es el vector de condiciones iniciales a=[1 2 3 ]; % t es un vector % x es una matriz % la primera columna de x es x1(t1), x1(t2)... % la segunda columna de x es x2(t1), x2(t2), ... % etc... odeset(RelTol,1e-4,AbsTol,[1e-5 1e-5 1e-5]); [t,x]=ode45(@f2,[0 2],a); plot(t, x(:,1),r,t,x(:,2),b:, t,x(:,3),g.)
10 Problema 1

10

15

0.2

0.4

0.6

0.8

1.2

1.4

1.6

1.8

El grco con l a nea continua corresponde al grco de la solucin y las a o otras a su primera y segunda derivada. 10

Problema 3
Considere la ecuacin diferencial o x + a x + t(x + 2) = t sin(t), x(0) = 1, x (0) = 2, con parmetro a. Graque para t en [0, 2] las soluciones para los valores de a a en el intervalo [-1,1] que se obtiene al incrementar a en 0.2. comenzando desde a = 1. Este problema en especial muestra como resolver una ecuacin diferencial o que depende de un parmetro, para varios valores del parmetro. a a Solucin o Primero escribimos la ecuacin como un sistema de primer orden en las vario ables y1 = x, y1 = x . y1 = y 2 y2 = a y2 t(y1 + 2) + t sin(t) el sistema se escribe vectorialmente como Y = F (t, Y ), Y (0) = (1, 2)T .

Ahora denimos la funcin F(t,Y) en el archivo f3.m de la siguiente manera o (la llamamos f3(t,y,a) para distinguirla de la f del ejemplo anterior): function z=f3(t,y,a) z=zeros(2,1); %vector columna z(1) = y(2); z(2)= - a*y(2) - t *(y(1)+2) +t*sin(t) Note que el parmetro a es tambin un INPUT para f3. a e Ahora creamos el archivo script3.m % y0 es el vector de condiciones iniciales y0=[1 2]; % t es un vector % Y es una matriz 11

% la primera columna de Y es y1(t1), y1(t2)... % la segunda columna de Y es y2(t1), y2(t2), ... % etc... odeset(RelTol,1e-4,AbsTol,[1e-5 1e-5 1e-5]); a=[-1:0.2:1]; hold on; for vala=a [t,y]=ode45(@f3,[0 2],y0,[],vala); plot(t, y(:,1),r,t,y(:,2),b:) end; hold off; Note que el valor del parmetro a se pasa a ODE45 por medio de la varia able vala, que toma cada uno de los valores en el vector [-1:0.2:1]. Los parntesis [] justo antes de vala indican que no hay opciones adicionales e para ODE45 (las opciones ya las denimos con odeset()). Ejecutando el archivo script3.m obtenemos el siguiente grco a
6 a=1 4

2 a=1 0

0.2

0.4

0.6

0.8

1.2

1.4

1.6

1.8

Las l neas en rojo corresponden a los grcos de y1(t) = x(t) y los en azul a a y2(t) = x (t). El texto a = 1, a = 1 que aparece en el grco lo agregu a a e 12

mano antes de exportarlo. Matlab tiene un editor interactivo de grcos que a permite mejorar la presentacin sin realizar mucho esfuerzo. Por supuesto o que tambin es posible agregar el texto al grco por medio de comandos e a (ejecutar help text).

13

Você também pode gostar