matlab - sistemas - Cómo resolver un sistema de ecuación diferencial ordinaria con parámetros dependientes del tiempo
simulacion de ecuaciones diferenciales en matlab (1)
¿Cómo resolver un sistema de ecuación diferencial ordinaria ... un problema de valor inicial .... con parámetros dependientes del tiempo o de la variable independiente? di la ecuación que tengo
Dy(1)/dt=a(t)*y(1)+b(t)*y(2);
Dy(2)/dt=-a(t)*y(3)+b(t)*y(1);
Dy(3)/dt=a(t)*y(2);
donde a (t) es un vector y b (t) = c * a (t); donde el valor de ayb está cambiando con el tiempo no de forma monótona y cada paso de tiempo. Intenté resolver esto usando esta publicación ... pero cuando apliqué el mismo principio ... recibí el mensaje de error
"Error al utilizar gridInterpolant Las coordenadas de los puntos no están secuenciadas en estricto orden monotónico".
¿Puede alguien ayudarme?
Lea hasta el final para ver si la primera parte o la segunda parte de la respuesta son relevantes para usted:
Parte 1: Primero crea un archivo .m
con una función que describa tu cálculo y funciones que darán a
y b
. Por ejemplo: crea un archivo llamado fun_name.m
que contendrá el siguiente código:
function Dy = fun_name(t,y)
Dy=[ a(t)*y(1)+b(t)*y(2); ...
-a(t)*y(3)+b(t)*y(1); ...
a(t)*y(2)] ;
end
function fa=a(t);
fa=cos(t); % or place whatever you want to place for a(t)..
end
function fb=b(t);
fb=sin(t); % or place whatever you want to place for b(t)..
end
Luego use un segundo archivo con el siguiente código:
t_values=linspace(0,10,101); % the time vector you want to use, or use tspan type vector, [0 10]
initial_cond=[1 ; 0 ; 0];
[tv,Yv]=ode45(''fun_name'',t_values,initial_cond);
plot(tv,Yv(:,1),''+'',tv,Yv(:,2),''x'',tv,Yv(:,3),''o'');
legend(''y1'',''y2'',''y3'');
Por supuesto, para el caso de fun_name.m
que escribí no es necesario utilizar subfunciones para a(t)
y b(t)
, solo puede usar la forma funcional explícita en Dy
si eso es posible (como cos(t)
etc.).
Parte 2: Si a(t)
, b(t)
son solo vectores de números que tienes que no se pueden expresar como una función de t
(como en la parte 1), entonces necesitarás tener también un vector de tiempo para que cada uno de ellos sucede, este puede ser, por supuesto, el mismo tiempo que usará para el ODE, pero no tiene por qué serlo, siempre que funcione una interpolación. Trataré el caso general, cuando tengan diferentes tiempos o resoluciones. Luego puede hacer algo de lo siguiente, crear el archivo fun_name.m
:
function Dy = fun_name(t, y, at, a, bt, b)
a = interp1(at, a, t); % Interpolate the data set (at, a) at times t
b = interp1(at, b, t); % Interpolate the data set (bt, b) at times t
Dy=[ a*y(1)+b*y(2); ...
-a*y(3)+b*y(1); ...
a*y(2)] ;
Para usarlo, vea el siguiente script:
%generate bogus `a` ad `b` function vectors with different time vectors `at` and `bt`
at= linspace(-1, 11, 74); % Generate t for a in a generic case where their time span and sampling can be different
bt= linspace(-3, 33, 122); % Generate t for b
a=rand(numel(at,1));
b=rand(numel(bt,1));
% or use those you have, but you also need to pass their time info...
t_values=linspace(0,10,101); % the time vector you want to use
initial_cond=[1 ; 0 ; 0];
[tv,Yv]= ode45(@(t,y) fun_name(t, y, at, a, bt, b), t_values, initial_cond); %
plot(tv,Yv(:,1),''+'',tv,Yv(:,2),''x'',tv,Yv(:,3),''o'');
legend(''y1'',''y2'',''y3'');