Académique Documents
Professionnel Documents
Culture Documents
http://www.sc.ehu.es/sbweb/energias-renovables...
Inicio
MATLAB
Numrico
Races de ecuaciones Valores y vectores propios Integracin numrica Ecuaciones diferenciales Ajuste de datos Anlisis de Fourier Estadstica
La funcin ode45
Su sintaxis es la siguiente [t,x]=ode45(odefun,tspan,x0, options, params) x es una matriz donde cada columna corresponde a las variables dependientes y t es el vector tiempo. odefun es el nombre de la funcin, tspan especifica el intervalo de tiempo, un vector de dos nmeros tspan=[ti,tf], tiempo inicial y final. Para obtener valores de las variables dependientes en instantes concretos t0, t1, t2, ... tn. se escribe tspan=[t0,t1....tn];
Ejercicios
x0 es un vector que contiene los valores iniciales. options es una estructura que se crea con la funcin odeset, que explicaremos al final de esta pgina ya que es un asunto bastante complicado. params son parmetros que queremos pasar a la funcin odefun En la mayor parte de los ejemplos, utilizaremos los tres primeros parmetros: llamaremos a la funcin ode45 y le pasaremos la funcin odefunc, los instantes inicial y final en el vector tspan y las condiciones iniciales en el vector x0. Vamos a volver a resolver los problemas planteados en este captulo mediante la funcin MATLAB ode45.
1 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
Elaboramos el script titulado radiactivo_1 para integrar el sistema de dos ecuaciones diferenciales de primer orden que describe la serie de desintagracin radioactiva. A-->B-->C donde C es un elemento estable. En la matriz x que devuelve la funcin ode45, x(1) representar los sucesivos valores de la variable x y x(2) representar a la variable y. El mismo criterio se emplear para determinar el vector x0 de las condiciones iniciales. La definicin de las funciones f (t,x,y) y g(t,x,y) aparecen en un vector columna, separadas por ; (punto y coma)
fg=@(t,x) [-a*x(1);a*x(1)-b*x(2)]; % x(1) es x, x(2) es y
Alternativamente, vamos a definir las funciones f (t,x,y) y g(t,x,y) en un fichero .M y le pasamos los valores de los parmetros a y b.
function z=func_radioactivo(t,x,a,b) z=[-a*x(1);a*x(1)-b*x(2)]; % x(1) es x, x(2) es y end
Elaboramos el script radioactivo_2 para establecer los valores de los parmetros a y b, las condiciones iniciales y llamar a la funcin que realiza la integracin numrica ode45. El primer parmetro de ode45 es el handler (manejador de la funcin) a integrar que se especifica del siguiente modo @nombre_funcion.
[t,x]=ode45(@func_radioactivo,tspan,x0);
Ahora bien, func_radioactivo precisa de los valores de los parmetros a y b. Hay dos formas de hacerlo. La ms sencilla es definir una funcin annima fg en trminos de func_radioactivo. En el problema 3 "Sistemas de ecuaciones de Lorentz" describimos el segundo procedimiento.
fg=@(t,x) func_radioactivo_1(t,x,a,b);
Vase la misma situacin en la llamada a funcin fzero al final de la pgina Races de una ecuacin
a=input('parmetro a: '); b=input('parmetro b: '); %condiciones iniciales x0=zeros(1,2); x0(1)=input('valor inicial de x: '); x0(2)=input('valor inicial de y: '); tf=input('tiempo final, tf: '); tspan=[0 tf]; fg=@(t,x) func_radioactivo(t,x,a,b); [t,x]=ode45(fg,tspan,x0); plot(t,x) xlabel('t') ylabel('x,y'); title('dx/dt=-ax, dy/dt=ax-by')
2 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
dx =v dt
dv = f (t, x, v) dt
En este sistema de dos ecuaciones diferenciales de primer orden x(1) representar los sucesivos valores de la variable x y x(2) representar a la variable v. El mismo criterio se emplear para determinar el vector x0 de las condiciones iniciales. Las funciones a integrar v, y f (t,x,v) aparecen en un vector columna, separadas por ; (punto y coma)
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)]; % x(1) es x, x(2) es v
Elaboramos el script oscilador_1 para resolver la ecuacin de segundo grado que describe las oscilaciones amortiguadas
w0=input('frecuencia angular, w0: '); g=input('rozamiento, gamma: '); %condiciones iniciales x0=zeros(1,2); x0(1)=input('posicin inicial, x0: '); x0(2)=input('velocidad inicial, v0: '); tf=input('tiempo final, tf: '); f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)]; tspan=[0 tf]; [t,x]=ode45(f,tspan,x0); plot(t,x(:,1),'r') grid on xlabel('t') ylabel('x'); title('oscilador amortiguado')
Si en el comando plot ponemos plot(t,x), se representa la posicin x(1) y la velocidad x(2) en funcin del tiempo (en dos colores asignados por MATLAB). Si solamente queremos representar la posicin x(1) en funcin del tiempo t, se escribe plot(t,x(:,1)). Vase la pgina Vectores y matrices En la ventana de comandos corremos el script oscilador_1
>> oscilador_1 frecuencia angular w0: 2 rozamiento, gamma: 0.5 posicin inicial, x0: 0 velocidad inicial,v0: 10 tiempo final, tf: 10
dx = vx dt dy = vy dt
3 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
En este sistema x(1) representar los sucesivos valores de la variable x y x(2) representar a la variable v x, x(3) a la variable y y x(4) a la variable vy. El mismo criterio se emplear para determinar el vector x0 de las condiciones iniciales. Elaboramos el script orbita_1 para resolver el sistema de dos ecuaciones de segundo grado que describe el movimiento de un cuerpo celeste.
%condiciones iniciales x0=zeros(1,4); x0(1)=input('posicin inicial x: '); x0(2)=input('velocidad incial x: '); x0(3)=0; x0(4)=input('velocidad incial y: '); tf=input('tiempo final, tf: '); tspan=[0 tf]; fg=@(t,x)[x(2);-4*pi*pi*x(1)/(sqrt(x(1)*x(1)+x(3)*x(3)))^3; x(4); -4*pi*pi*x(3)/(sqrt(x(1)*x(1)+x(3)*x(3)))^3]; [t,x]=ode45(fg,tspan,x0); plot(x(:,1),x(:,3),'r') xlabel('x') ylabel('y'); title('rbita de un planeta')
En Figure Window representamos la trayectoria, es decir, los puntos de abscisas x(1) que guardan los valores x y las ordenadas x(3) que guardan los valores y, en funcin del tiempo t, se escribe plot(t,x(:,1),x(:,3)). En la ventana de comandos corremos el script orbita_1
>> orbita_1 posicin inicial x: 1 velocidad incial x: 0 velocidad incial y: 6.27 tiempo final, tf: 1
Opciones de ode45
Imaginemos que estudiamos el movimiento de cada de un cuerpo, no sabemos cuanto tiempo tardar en llegar al suelo, desconocemos el valor del elemento tf en el vector tspan. Sin embargo, queremos detener el proceso de integracin numrica de la ecuacin diferencial que describe el movimiento cuando la posicin del mvil sea cero. La funcin MATLAB ode45 dispone de un parmetro adicional options donde podemos indicarlo, pero es bastante lioso e intentaremos explicarlo mediante ejemplos. Volvemos a resolver la ecuacin diferencial que describe las oscilaciones amortiguadas y detendremos el proceso de integracin cuando el mvil alcance la posicin mxima, su velocidad es nula. Supongamos que el oscilador amortiguado estudiado anteriormente, de frecuencia natural 0=2, constante de amortiguamiento =0.25, parte de la posicin x0=2.5 con velocidad nula, queremos detener el proceso de integracin cuando el mvil alcance la posicin mxima, cuando su velocidad es nula, tal como se muestra en la figura, con lo que se completa un periodo.
4 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
Los pasos a seguir son los siguientes: 1.-Definimos la funcin cuyo nombre es opcion_ode45
function [detect,stopin,direction]=opcion_ode45(t,x) detect=[x(1) x(2)]; %[posicin, velocidad] stopin=[0 1]; % 1 indice que detiene la integracin cuando la velocidad se hace cero direction=[0 -1]; % 1 crece, -1 decrece, 0 no importa end
2.-Creamos la estructura opts con la llamada a la funcin odeset opts=odeset('events',@opcion_ode45); Cuando se utiliza options la funcin ode45 devuelve los tiempos te en los cuales ocurren los 'eventos' y los correspondientes valores de las variables dependientes (posicin, velocidad) en el vector xe. Finalmente, ie es un ndice que es til cuando se vigilan varios eventos. 3.-Le pasamos opts a la funcin ode45 en su cuarto parmetro [t,x,te,xe,ie]=ode45(odefunc,tspan,x0,opts); Escribimos el script oscilador_2 para resolver la ecuacin diferencial de segundo orden y detener el proceso de integracin de acuerdo con lo estipulado en el parmetro opts.
w0=2; g=0.25; x0=[2.5 0]; tf=10; f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)]; tspan=[0 10]; opts=odeset('events',@opcion_ode45); [t,x,te,xe,ie]=ode45(f,tspan,x0,opts); te,xe,ie plot(t,x(:,1),'r') grid on xlabel('t') ylabel('x'); title('oscilador amortiguado')
Cuando corremos el script oscilador_2 en la ventana de comandos se imprime los siguientes datos relativos a los eventos. Tiempo, te Posicin x(1) Velocidad x(2) Indice ie
5 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
2 1 2
Cuando parte de la posicin inicial x(1)=2.5 la velocidad es cero x(2)=0, detecta velocidad (ndice ie=2). Cuando pasa por el origen x(1)=0 detecta posicin (ndice ie=1), pero no se detiene ya que en stopin se ha puesto un cero. Cuando la posicin es x(1)=1.1322 detecta velocidad nula x(2)=0, (ndice ie=2) y la integracin numrica se detiene ya que en stopin se ha puesto un uno y la velocidad decrece en direction se ha puesto un -1. La columna de tiempos nos porporciona el periodo de la oscilacin, te=3.1662. Se sugiere al lector, cambiar en la funcin opcion_ode45 direction=[0 1]; Vamos ahora a marcar en la representacin grfica de la oscilacin amortiguada, las posiciones de mxima amplitud x(2)=0 y cuando pasa por el origen x(1)=0 sin detener el proceso de integracin numrica.
6 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
plot(t,x(:,1),'r') plot(te(ie==1),xe(ie==1),'o','markersize',6,'markerfacecolor','k') plot(te(ie==2),xe(ie==2),'o','markersize',6,'markerfacecolor','b') grid on xlabel('t') ylabel('x'); title('oscilador amortiguado') hold off
Si solamente estamos interesados en los mximos definimos una nueva versin de la funcin opcion2_ode45
function [detect,stopin,direction]=opcion2_ode45(t,x) detect=x(2); stopin=0; direction=-1; end
dx = x + y dt dy = x y xz dt dz = z + xy dt
donde =10, =8/3 y =28 Vamos a resolver el sistema de tres ecuaciones diferenciales con las condiciones iniciales siguientes: en el instante t=0, x0=-8, y0=8 z0=27. 1. Escribir una funcin denominada lorentz(t,x,p) como fichero.M que contenga las tres ecuaciones y dependa de los tres parmetros =p(1), =p(2) y =p(3). Observar que la variable x se guarda en el primer elemento x(1), la variable y en el segundo x(2) y la variable z en el tercer x(3) elemento del vector x. 2. Escribir un script denominado lorentz_script que llame a la funcin MATLAB ode45, para resolver el sistema de ecuaciones diferenciales para las condiciones iniciales especificadas. 3. Pasar los parmetros , y como elementos de un vector p a la funcin ode45 para que a su vez se los pase a la funcin lorentz. 4. Dibujar el atractor de Lorentz de z en funcin de x hasta el instante tf=20 en una primera ventana grfica.
7 de 8
12/12/13 17:29
http://www.sc.ehu.es/sbweb/energias-renovables...
5. Dibujar x, y y z en funcin del tiempo en tres zonas de una segunda ventana grfica. 6. Examinar el comportamiento del sistema para otras condiciones iniciales, t=0, x 0=1, y0=2 z0=3. Definimos la funcin lorentz como fichero .M
function fg=lorentz(t,x,p) %x(1) es x, x(2) es y y x(3) es z % p(1) es sigma, p(2) es beta y p(3) es rho fg=[-p(1)*x(1)+p(1)*x(2); p(3)*x(1)-x(2)-x(1)*x(3); -p(2)*x(3)+x(1)*x(2)]; end
Aparecen dos ventanas grficas, la primera con el atractor de Lorentz, la representacin z(x) y la segunda ventana dividida en tres regiones que muestran x(t), y(t) y z(t)
8 de 8
12/12/13 17:29