MATLAB — хитрая система оды с булевым значением

EDITED: Спасибо за голосование, теперь я наконец-то добавил изображения. Добавлен полный m.file, хотя я не думаю, что это было необходимо. Ключ кода.

xp(2)=...-((x(2)>=X2)&(xp(3)>=0)...; 
xp(3)=...-((x(3)>=X3)&(xp(2)>=0))...;

Полный код:

function xp=uzdevums1(t,x)
%parametr values
r1 = 0.1; r2 = 1; r3 = 0.2;
K1=100;K2 = 100; K3 = 100;
X2=25;X3=10;
speedx2 = 0.02; speedx3=0.02;
%ode system
xp=zeros(3,1);
xp(1)=r1*(1-x(1)/(x(2)+x(3)))*x(1);
xp(2)=r2*(1-x(2)/K2)*x(2)-((x(2)>=X2)&(xp(3)>=0)&xp(1)>0)*x(2)*x(1)*speedx2; 
xp(3)=r3*(1-x(3)/K3)*x(3)-((x(3)>=X3)&(xp(2)>=0))*x(3)*x(1)*speedx3;

из оболочки: [T,X]=ode45('uzdevums1',[0 60],[10 80 20]); Идея состоит в том, что логическое выражение в xp(2) (производное зеленой линии) должно быть истинным, пока оно не приблизится к X2=25, но логическое выражение для xp(3) (производное красной линии) должно быть ложным, пока xp(2) не изменится подписать.

Красная линия = x3 работает нормально.. поскольку знак для xp(2) изменяется, логическое выражение теперь истинно, и красная линия меняет направление, но зеленая линия этого не делает... другими словами, оба x(2)>=X2 (что нормально) и xp(3)>=0 (чего я не понимаю)

другими словами: красная линия падает, как получилось, что xp(3)>=0 ?

На 2-м рисунке я добавил xp(1)>0, и логическое выражение, наконец, стало ложным... но почему бы и нет, поскольку xp(3) изменил знак?!

Спасибо

введите здесь описание изображениявведите здесь описание изображения


person Kârlis Olte    schedule 05.01.2013    source источник
comment
Подождите, я не вижу никакой ссылки на ваши изображения.. как мы можем понять вопрос?   -  person Acorbe    schedule 05.01.2013
comment
Является ли этот код частью уравнений вашей модели? Если да, то это очень плохая идея. Обычные решатели не ожидают прерывистых изменений в вашей правой части. Вам потребуется дискретизация, но, поскольку интервалы зависят от ваших параметров, это потребует дополнительных вещей, таких как ограничения и, возможно, преобразование времени. Не уверен, что вы пытаетесь здесь.   -  person s.bandara    schedule 05.01.2013
comment
Я хотел прикрепить изображение, но программа не позволила, так как у меня недостаточно баллов.   -  person Kârlis Olte    schedule 05.01.2013
comment
У меня не было проблем с решателями. ode45 отлично сработал для меня.   -  person Kârlis Olte    schedule 05.01.2013
comment
если вы не можете публиковать изображения, вы могли бы хотя бы опубликовать немного больше своего кода   -  person RussH    schedule 06.01.2013
comment
1. Мне кажется, что я прожил этот пост раньше... снова дежа-вю... 2. Мне нужно, чтобы вы прояснили, что вам нужно и что пошло не так, например. не говори: boolean expression in xp(2) should be true until it approaches X2=25, а the condition in xp(2) is true when X2 > 25. Слово «подходы» лично меня раздражает, потому что оно ничего не значит вне контекста. Это не абстрактная математика, это числовые вычисления, вы должны все определить.   -  person Rasman    schedule 08.01.2013
comment
Наконец, весь ваш код просто кажется неправильным, я не уверен, что вы пытаетесь сделать слишком много одновременно, но ваш производный термин может стать психотическим, если он будет человеком. Булевы и дифференциальные уравнения нужно использовать с осторожностью, чтобы не было быстрых переходов между включенным и выключенным состоянием (этих сумасшедших вибраций, которые вы видите на своем графике). Я не могу это исправить, если вы не уточните свои условия   -  person Rasman    schedule 08.01.2013


Ответы (1)


Если я правильно вас понял, главное, с чем вам нужна помощь, это объяснение того, почему утверждение xp(3)>=0 оценивается как истинное.

Изучите свои расчеты xp шаг за шагом.

xp=zeros(3,1);
xp(1)=r1*(1-x(1)/(x(2)+x(3)))*x(1);
xp(2)=r2*(1-x(2)/K2)*x(2)-((x(2)>=X2)&(xp(3)>=0)&xp(1)>0)*x(2)*x(1)*speedx2; 
xp(3)=r3*(1-x(3)/K3)*x(3)-((x(3)>=X3)&(xp(2)>=0))*x(3)*x(1)*speedx3;

Вы пытаетесь использовать значение xp(3) при вычислении xp(2) (и наоборот). Но xp(3) по-прежнему равно нулю, когда вы используете его при вычислении xp(2), поэтому выражение xp(3)>=0 всегда будет оцениваться как истинное.

person user1884905    schedule 08.01.2013