Lab 7 - Universidad de Concepción

Transcripción

Lab 7 - Universidad de Concepción
UNIVERSIDAD CATOLICA DE LA SANTISIMA CONCEPCIÓN
DEPARTAMENTO DE MATEMÁTICA Y FÍSICA APLICADA
Laboratorio 7
Franco A. Milanese
Introducción a MATLAB r: Integración numérica.
1.
Integración numérica
MATLAB posee bastantes funciones para resolver numéricamente ODE's. Nos enfocaremos en
el uso de las funciones ode23() y ode45(), las cuales implementan los métodos numérico de
Runge-Kutta de segundo/tercer y cuarto/quinto orden, respectivamente.
1.1. ODE's de primer orden con funciones en cheros .m
Aproximemos numéricamente la solución del PVI: Hallar y ∈ C 1 ([0, 5]) tal que
d
y = 2x,
dx
y(0) = 1.
En general para cualquier EDO de la forma y 0 = f (x, y), empezamos deniendo la función f (x, y).
En un chero .m ingresamos la función del lado derecho
function dy=f(x,y)
dy=2*x;
El uso más básico del comando ode45() tiene la forma ode45(funcion,dominio,condiciones
iniciales), entonces para resolver nuestro PVI, ejecutamos
[x,y]=ode45(@f,[0,5], 1);
plot(x,y)
lo cual nos retorna la parábola y = x2 + 1, ver gura 1.
1.2. Solución numérica de sistemas de EDO's
La parte mas difícil del uso de las funciones integradas en MATLAB para la resolución de EDO's
es denir la ecuación diferencial de una forma en que MATLAB la entienda. MATLAB tiene una
forma muy especíca para denir una ecuación diferencial, lo hace mediante una función que
toma un vector de variables en la ecuación diferencial y un vector de variables independientes,
y retorna la derivada del vector de variables en las componentes del vector independiente. La
única forma en la que MATLAB sabe cual variable es cual dentro del vector es el orden en el
que creemos el vector, debemos denir la ecuación diferencial, las componentes de los vectores y
las condiciones iniciales en el mismo orden. Y nalmente las columnas de la respuesta están en
ese mismo orden.
1
Figura 1: Solución de un PVI aproximada numericamente.
Por ejemplo, supongamos que nos interesa solución el sistema de EDO's: Hallar y1 , y2 ∈ C 1 ([0, 1])
tal que
y10 (x) = xy2 (x)
y20 (x) = xy1 (x),
y1 (0) = 1, y2 (0) = 0
entonces, debemos construir el chero que retorne la función
f (x, y1 , y2 ) = [x y2 (x); x y1 (x)],
tal chero puede tener al forma
function dy12=f(x,y12)
y1=y12(1,1);
y2=y12(2,1);
dy12(1,1)=x*y2;
dy12(2,1)=x*y1;
así, para resolver, podemos hacer simplemente
[x,y]=ode45(@f,[0,1], [1,0]);
plot(x,y)
legend('y_1','y_2')
lo cual nos retorna el gráco de la gure 2.
2
Figura 2: Solución de un sistema de EDO's aproximada numericamente.
1.3. Reducción a MATLAB de una EDO
Supongamos que queremos resolver el sistema de EDO's: Hallar (x, y) ∈ C 2 ([0, 5]) × C 1 ([0, 5])
tal que
x00 (t) + y 0 (t) − 2x0 (t) = 3
y 0 (t) = 3x + 5
x(0) = 0
x0 (1) = 1
y(0) = 0,
Lo primero que debemos notar es que esta no es una ecuación diferencial de primer orden, debido
a que tiene el término x00 en una de sus ecuaciones. Para crear una función que nos entregue la
segunda derivada, una de las variables debe ser la primera derivada. En consecuencia, la función
de MATLAB debe tener las variables x, x0 , y . La función debe decirle a MATLAB como obtener
x0 , x00 , y 0 . Denimos la función MATLAB
function dyx=f2(t,xy)
x=xy(1,1); %Entradas del vector
dx=xy(2,1);
y=xy(3,1);
dx=dx; %Salidas de la funcion
dy=3*x+5;
ddx=3-dy-+2*dx;
dyx=[dx;ddx;dy]; %Ordenamos la salida según el orden elegido
3
así nalmente, obtenemos la curva solución de la gura 3 comandando
[T, XY]=ode45(@f2,[0,10],[0 1 0]);
plot(T,XY);
legend('x','dx','y')
Figura 3: Solución de un sistema de EDO's reducido, aproximado numericamente.
2.
Otras funciones de integración numérica de EDO's
. Existen muchas otras funciones para solucionar EDO's en MATLAB. Pero lo bueno es que todas
funcionan de la misma manera descrita anteriormente. A continuación un listado con algunas de
ellas.
Función Implicito/Explicito
Orden de convergencia
ode45()
Explicito
Cuardo orden (presición media)
ode23()
Explicito
Segundo o tercer orden (presición baja)
ode113()
Explicito
Treceavo orden (el más preciso)
ode15s()
Implicito
Cualquier orden entre 1 y 5
ode23s()
Implicito
Baja precisión pero mas estable que ode115s()
Por lo general se utiliza la función ode45() o ode15s.
Los solvers de MATLAB por lo general serán mejor que cualquier cosa que intentemos programar,
son capaces de estimar el error de la solución en cada intervalo de la variable independiente y
decidir donde el intervalo es muy grande o muy pequeño (lo que controla el error y la eciencia
del código). Es más importante que entiendas conceptos como el orden de convergencia más que
el funcionamiento en sí del método numérico.
4
ode45() utiliza un método explicito eciente, pero se vuelve inestable para sistemas rigidos
(sti). Esto se maniesta cuando la función toma intervalos demasiado pequeños de la variable
independiente para controlar el error. Además en estos casos, la solución se demora mucho en
ser calculada o los intervalos se reducen tanto que la precisión de los números los hace iguales,
lo que hace que la rutina falle.
ode15s() debe ser usado para sistema rigidos (sti). Debido a que es un esquema implicito,
deberá solucionar un conjunto de ecuaciones en cada intervalo de la variable independiente.
2.1. Un problema rigido
Supongamos que tenemos el problema: Hallar x1 , x2 ∈ C 1 ([0, 10]) tal que
x1 (t) = −x1 (t) − x2 (t)
x2 (t) = x1 (t) − 5000 x2 (t)
,
x1 (0) = 1
x2 (0) = 1
podemos pensar que la ecuación diferencial del problema se reduce a
d x1 (t)
x1 (t)
−1 −1
.
=
1 5000 x2 (t)
dt x2 (t)
Si hacemos
>> eigs([-1,-1;1,-5000])
ans =
1.0e+03 *
-5.0000
-0.0010
nos damos cuenta que los autovalores de la matriz del problema son −1 y −5000, como un
autovalor es muy grande, la matriz del problema es rígida y por lo tanto el problema es rígido.
Para intentar resolver este problema, debemos empezar ingresando la función que describe el
conjunto de EDO's a MATLAB,
function dx1x2=f3(t,x1x2);
dx1x2=[-1,-1;1,-5000]*x1x2;
lo cual se hace rápidamente usando la multiplicación matricial. Resolvamos el problema usando
ode45() y las funciones tic toc para contar el tiempo de cómputo del computador,
>> tic;
[t,x1x2]=ode45(@f3,[0,10],[1,1]);
toc
Elapsed time is 2.080367 seconds.
5
mientras que si utilizamos el solver ode15s(),
>> tic;
[t,x1x2]=ode15s(@f3,[0,10],[1,1]);
toc
Elapsed time is 0.476699 seconds.
El tiempo de cada cómputo de cada rutina depende de muchos factores, entre ellos la velocidad
del procesador que esté usando como la velocidad de las tarjetas RAM de su ordenador.
2.2. Ajustes a las rutinas con odeset
Las funciones para la solución de EDO's de MATLAB se pueden ajustar para que operen según
distintas instrucciones. Todas estas instrucciones se encuentran en una variable llamada odeset.
Para acceder a todas las distintas opciones, puede ejecutar help odeset. Por ejemplo, la siguiente
ejecución de ode45() mostrará estadísticas de los cálculos de la rutina y trabajará hasta tener
un error relativo de 1 × 10−6 .
options=odeset('RelTol',1e-6,'Stats','on');
[t,x1x2]=ode45(@f3,[0,10],[1,1]);
3.
Ejercicios
1. Resuelva numérica y simbólicamente los siguientes PVI's
) y 0 (x) = x2 , con y(0) = 1, x ∈ [0, 10].
00
2
0
b ) y (x) = x , con y(0) = 0, y (0) = 1,
x ∈ [0, π].
00
2
c ) y (x) + 3y(x) = x , con y(0) = 0,
y 0 (0) = 1, x ∈ [0, 2].
a
d
) y 000 (x) + y 00 (x) = 0, con y(0) = 1,
y 0 (0) = 1 , y 00 (0) = 0, x ∈ [0, 1].
2. Resuelva numérica y simbólicamente los siguientes PVI's
) y 0 (x) = x2 , con y(1) = 1, x ∈ [0, 1].
00
2
0
b ) y (x) = x , con y(1) = 0, y (1) = 1,
x ∈ [0, 1].
00
2
c ) y (x) + 3y(x) = x , con y(2) = 0,
y 0 (3) = 1, x ∈ [0, 2].
a
d
) y 000 (x) + y 00 (x) = 0, con y(1) = 1,
y 0 (1) = 1 , y 00 (1) = 0, x ∈ [0, 10].
OBS: Debe llevar las condiciones de contorno a x = 0, para esto haga el cambio de variables
s = x − a donde a ∈ R es un desplazamiento adecuado y reescriba las EDO's usando regla
de la cadena.
3. Use ode23() y ode45() para resolver el problema de valores iniciales
−ty
y 0 (t) = p
,
2 − y2
y(0) = 0,
t ∈ [0, 5].
graque estas funciones y grábelas en imagenes .jpg. Sugerencia: utilize el código hecho
anteriormente para gracar.
6
4. Use ode23() para solucioner el sistema de EDO's
y10 (t) = 2y1 (t) + y2 (t) + 5y3 (t) + e−2t
y20 (t) = −3y1 (t) − 2y2 (t) + 8y3 (t) + 2e−2t − cos(3t)
y30 (t) = 3y1 (t) + 3y2 (t) + 2y3 (t) + cos(3t)
y1 (0) = 1
y2 (0) = −1
y3 (0) = 0
t ∈ [0, π].
5. Resuelva la EDO de Van der Pol
x00 (t) + (x(t)2 − 1)x0 (t) + x(t) = 0,
x(0) = 0,
x0 (0) = 0,25,
t ∈ [0, 20].
6. Las ecuaciones de Lotka-Volterra, también conocidas como ecuaciones predador-presa, son
un par de ecuaciones diferenciales de primer orden no lineales que se usan para el modelado
de dos poblaciones que interactúan, una presa y un depredador. Las ecuaciones fueron
propuestas de forma independiente por Alfred J. Lotka en 1925 y Vito Volterra en 1926.
Tales ecuaciones se denen como:
d
x = x(α − βy)
dt
d
y = −y(γ − δx)
dt
donde
y es el número de algún predador (por ejemplo, un lobo);
x es el número de sus presas (por ejemplo, conejos);
dy/dt y dx/dt representa el crecimiento de las dos poblaciones en el tiempo; t representa el tiempo,
α,β , γ y δ son números reales que representan las interacciones de las dos especies.
Construya una función de MATLAB que graque las soluciones de las ecuaciones de LotkaVolterra para parámetros α,β , γ y δ dado, mas condiciones iniciales.
Referencias
Rudra Pratap, Getting Started with MATLAB 2009. Department of Mechanical Engineering Indian Institute of Science, Bangalore. New York, Oxford University Press 2010.
14 de enero de 2014
7

Documentos relacionados