Местоположение события MATLAB, чтобы найти время, необходимое для полной конверсии различных видов

У меня есть система ОДУ следующим образом:

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
Привет, Knedlsepp, я попробовал цикл 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