Matlab - Duda sobre ODE45

 
Vista:

Duda sobre ODE45

Publicado por Jaime (9 intervenciones) el 10/02/2019 17:38:17
Buenas tardes, tengo una duda con la función de ODE45.

Mi problema es que apenas entiendo cómo funciona ODE45 por dentro, sobretodo respecto al paso temporal que utiliza. No tengo problemas con definir el modelo de integración, ya lo he utilizado varias veces y me ha funcionado de maravilla, pero ahora me he encontrado con un nuevo caso y no se cómo resolverlo.

Al definir las ecuaciones de integración, uno de los valores es una variable que se encuentra guardada en una matriz, y necesito que en cada paso temporal coja un número de dentro de dicha matriz. Los valores dentro están ordenados, de tal forma que lo único que debería de hacer es ir leyendo de uno en uno a medida que adelanta el paso temporal, y esto es lo que no soy capaz de hacer.

Si a alguien se le ocurre una manera de solucionarlo estaría muy agradecido.

Un saludo y gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda sobre ODE45

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 10/02/2019 21:25:05
Podría poner la matriz que menciona y ademas la forma del avance de su código donde esté usando ode45
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda sobre ODE45

Publicado por Jaime (9 intervenciones) el 10/02/2019 21:53:53
Porsupuesto.

Y una pequeña corrección, cuando me refería a matriz quería decir vector columna.

Inicialmente llamo a la función definiendo el intervalo de tiempo que quiero que me integre y sus condiciones iniciales de la forma:
---------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
global GMsat r
 
GMsat = 300;
r      =  200:1:300;
r = r`;
y0   =[ S(1,1), S(1,2), S(1,3), S(1,4), S(1,5), S(1,6) ];
Tini = 0;
Tfin = 100;
 
[T,Y]=ode45(@funcion_ode,[Tini:Tfin],y0);
----------------------------------------------------------------------------
Después creando una función llamada funcion_ode:
----------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function dy = funcion_ode(t,y)
 
global GMsat r
 
dy = zeros (6,1);
 
dy(1) = y(4);
dy(2) = y(5);
dy(3) = y(6);
dy(4) = -(GMsat)/(r(:,1)^3)*y(1);
dy(5) = -(GMsat)/(r(:,1)^3)*y(2);
dy(6) = -(GMsat)/(r(:,1)^3)*y(3);
 
end

-------------------------------------------------------------
Lo que quiero conseguir es que para cada paso temporal que de ODE45 entre 0 y 100 introduzca uno de los valores ordenados de mi vector r, de tal forma que en cada paso temporal r tenga un valor determinado. No he introducido la matriz S, los valores iniciales del vector y0 pueden ser cualesquiera.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda sobre ODE45

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 11/02/2019 02:21:23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function ode45caballero23
global GMsat r i
GMsat = 300;
r = 200:1:300;
S=rand(1,6);
r = r';
y0 =[ S(1,1), S(1,2), S(1,3), S(1,4), S(1,5), S(1,6) ]';
Tini = 0;
Tfin = 100;
I=Tini:Tfin;
TT=[];
YY=[];
for i=1:length(I)-1
[T,Y]=ode45(@funcion_ode,[I(i) I(i+1)],y0);
TT=[TT;T];
YY=[YY;Y];
end
plot(TT,YY(:,1),'r',  TT,YY(:,2),'b',  TT,YY(:,3),'m',  TT,YY(:,4),'c', TT,YY(:,5),'g',  TT,YY(:,6),'y'    )
whos TT YY
end
% ----------------------------------------------------------------------------
% Después creando una función llamada funcion_ode:
% ----------------------------------------------------------------------------
function dy = funcion_ode(t,y)
global GMsat r  i
dy = zeros (6,1);
dy(1,1) = y(4);
dy(2,1) = y(5);
dy(3,1) = y(6);
dy(4,1) = -(GMsat)/(r(i)^3)*y(1);
dy(5,1) = -(GMsat)/(r(i)^3)*y(2);
dy(6,1) = -(GMsat)/(r(i)^3)*y(3);
 
end


Saludos
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Servicios de programación matlab


http://matlabcaballero.blogspot.com
https://www.facebook.com/matlabcaballero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda sobre ODE45

Publicado por Jaime (9 intervenciones) el 11/02/2019 11:43:39
mhhh...creo que la forma escrita es correcta desde el punto de vista de la programación, pero no matemático. Si introduzco la función ode45 en un bucle, las condiciones iniciales y0 se están refrescando en cada paso temporal, quitando el sentido a toda la integración numérica.

Aún así me ha dado una idea sobre cómo hacerlo, si el bucle se encontrase dentro de funcion_ode quizás si sirva. Voy a probarlo de esta forma.

Un saludo y muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda sobre ODE45

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 11/02/2019 12:56:56
Después de unos minutos de subir al foro el código me di cuenta de ese detalle, pero quería ver su opinión sobre tal punto.

1
2
3
4
5
6
for i=1:length(I)-1
[T,Y]=ode45(@funcion_ode,[I(i) I(i+1)],y0);
TT=[TT;T];
YY=[YY;Y];
y0=Y(:,end)
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar