Académique Documents
Professionnel Documents
Culture Documents
1 de 8
Inicio
MATLAB
Races de ecuaciones
Sistemas de ecuaciones
Valores y vectores
propios
Integracin numrica
Ecuaciones
diferenciales
Interpolacin, regresin
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
Numrico
La funcin ode45
Su sintaxis es la siguiente
[t,x]=ode45(odefun,tspan,x0, options, params)
Ejercicios
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];
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.
V0=10;
R=input('Resistencia R: ');
C=input('Capacidad C: ');
tf=input('tiempo final, tf: ');
f=@(t,x) V0/R-x/(R*C);
tspan=[0 tf];
x0=0;
[t,x]=ode45(f,tspan,x0);
plot(t,x,'r')
xlabel('t')
ylabel('q');
title('carga del condensador')
29/10/2014 14:47
2 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
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')
29/10/2014 14:47
3 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
parmetro a: 0.1
parmetro b: 0.2
valor inicial de x: 100
valor inicial de y: 0
tiempo final, tf: 20
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.
Como ejemplo, estudiamos las oscilaciones amortiguadas, que hemos descrito en la pgina anterior.
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
En este sistema x(1) representar los sucesivos valores de la variable x y x(2) representar a la variable vx, 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
29/10/2014 14:47
4 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
iniciales.
Como ejemplo, estudiamos el movimiento de un planeta alrededor del Sol o de un satlite artificial alrededor de
la Tierra.
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.
29/10/2014 14:47
5 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
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
0.0000
2.5000
-0.0000
2
2.4378
0.0000
2.7173
1
3.1662
1.1322
-0.0000
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
29/10/2014 14:47
6 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
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.
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
29/10/2014 14:47
7 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
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 7];
opts=odeset('events',@opcion1_ode45);
[t,x,te,xe,ie]=ode45(f,tspan,x0,opts);
te,xe,ie
hold on
plot(t,x(:,1),'r')
plot(te(ie==1),xe(ie==1),'o','markersize',6,'markerfacecolor','b')
grid on
xlabel('t')
ylabel('x');
title('oscilador amortiguado')
hold off
29/10/2014 14:47
8 de 8
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/d...
subplot(3,1,1)
plot(t,x(:,1))
ylabel('x');
subplot(3,1,2)
plot(t,x(:,2))
ylabel('y');
subplot(3,1,3)
plot(t,x(:,3))
ylabel('z');
xlabel('t')
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)
29/10/2014 14:47