Място на събитието в MATLAB, за да намерите време, необходимо за пълно преобразуване на различни видове

Имам система от ODE, както следва:

dx1/dt = (x1,x2,x3)
dx2/dt = (x1,x2,x3)
dx3/dt = (x1,x2,x3)

Началните условия са x1=x2=x3=0 @ t=0, а ограниченията са dx1/dt = 0, dx2/dt = 0, dx3/dt = 0 за x1 = 1, x2 = 1, x3 = 1 съответно. След като x1, x2, x3 достигнат стойност 1, те трябва да останат на 1 за по-нататъшно увеличаване на t.

Трябва да намеря (1) x1, x2, x3 при различни t и (2) да оценя стойностите на t, когато всяка от тях стане 1. Имах трудности при получаването на резултати за (2).

Опитах се да използвам следната функция за събитие:

function [val,stop,dir] = event(t,X)
X1 = x1; 
X2 = x2; 
X3 = x3;
val = [X1 -1; X2 -1; X3 -1];
stop= [1;1;1];
dir = [1;1;1];
end

Не проработи. След това опитах друг код, за да намеря поне t, съответстващ на x3 = 1 (защото x3 нараства бавно в сравнение с x1 и x2).

function [val,stop,dir] = event(t,X)
X3 = x3;
val = X3 -1;
stop= 1;
dir = 1;
end

Може ли някой да ме насочи в това отношение?

С уважение. Судип


person SUDIP DE SARKAR    schedule 04.03.2015    source източник
comment
Моля, обяснете какъв резултат бихте очаквали и какво получавате вместо това. Също така публикувайте mcve код, за да можем да пресъздадем проблема.   -  person knedlsepp    schedule 04.03.2015
comment
Здравей kneedlsepp, опитах for цикъл с условия, подобни на отговорените от am304, и се получи. Както и да е, благодаря за помощта. :)   -  person SUDIP DE SARKAR    schedule 05.03.2015
comment
Ако отговорът на am304 реши проблема ви, моля, приемете го, като щракнете върху сивата отметка, за да стане зелена.   -  person knedlsepp    schedule 05.03.2015


Отговори (1)


Това изглежда доста лесно за решаване с ode решаващите, без необходимост от събитие. Бих дефинирал функция като:

function dX = my_ode(t,X)

for k=1:length(X)
    if abs(X(k)-1) <= 1e-6 % or use whatever tolerance you want, e.g. eps
       dX(k) = 0;
    else
       dX(k) = X(k);
    end
end

След това бих извикал ode решаващия инструмент, както следва:

tspan = [0 10]; % choose whatever time span you want
X_init = [0 0 0];
[T,X] = ode45(@my_ode,tspan,X_init);
plot(T,X)

Не съм сигурен защо имате маркера Simulink, но това също лесно се внедрява в Simulink, ако е необходимо.

person am304    schedule 04.03.2015
comment
Здравейте am304, вчера опитах подобен код, за да избегна събитието и той проработи. :) - person SUDIP DE SARKAR; 05.03.2015
comment
Радвам се да помогна, моля, приемете отговора, ако ви е помогнал да решите проблема си. По този начин хората с подобни проблеми могат лесно да намерят решение на проблема си. - person am304; 05.03.2015