разница между «когда» и «если» в OpenModelica?
-
21-12-2019 - |
Вопрос
Я новичок в OpenModelica, и у меня есть несколько вопросов относительно кода BouncingBall.mo, который распространяется вместе с программным обеспечением в качестве примера.
1) какая разница между 'когда' и 'если'?
2) какова цель переменной 'фу' в коде?
3)в строке(15) - "когда {h <= 0,0 и v <= 0,0, влияние}",, не должно ли выражение для 'когда' будет достаточно, как "{h <= 0,0 и v <= 0,0}" потому что это становится истинный когда происходит воздействие, какова цель влияние(для меня это здесь лишнее) и что означает запятая(,) до влияние означает?
model BouncingBall
parameter Real e = 0.7 "coefficient of restitution";
parameter Real g = 9.81 "gravity acceleration";
Real h(start = 1) "height of ball";
Real v "velocity of ball";
Boolean flying(start = true) "true, if ball is flying";
Boolean impact;
Real v_new;
Integer foo;
equation
impact = h <= 0.0;
foo = if impact then 1 else 2;
der(v) = if flying then -g else 0;
der(h) = v;
when {h <= 0.0 and v <= 0.0,impact} then
v_new = if edge(impact) then -e * pre(v) else 0;
flying = v_new > 0;
reinit(v, v_new);
end when;
end BouncingBall;
Решение
Хорошо, это довольно много вопросов.Попробую на них ответить:
В чем разница между
when
иif
.Вопросы внутри
when
предложение «активно» только в тот момент, когда условные выражения, используемые вwhen
пункт становится активным.Напротив, уравнения внутриif
утверждение истинно до тех пор, пока истинное условное выражение.Какова цель
foo
?Наверное, для визуализации.Насколько я вижу, это не оказывает явного влияния на модель.
Почему
impact
перечислены вwhen
пункт.Одна из проблем у вас так называемая Такие системы Зенона заключается в том, что он будет продолжать подпрыгивать бесконечно с все меньшими и меньшими интервалами.Я подозреваю, что
impact
Флаг здесь предназначен для обозначения того, что система перестала подпрыгивать.Обычно это делается путем проверки того, что условное выражениеh<=0.0
на самом деле становится ЛОЖЬ в какой-то момент.Поскольку обнаружение событий включает числовой допуск, в какой-то момент высота отскока никогда не выходит за пределы диапазона допуска, и вам необходимо это обнаружить, иначе мяч больше никогда не отскочит и просто продолжит падать.(это трудно объяснить, не запустив симуляцию и не увидев эффекта).Что это
,
делать вwhen
пункт.Учтите следующее:
when {a, b} then
.Дело в том, что если вы хотите иметьwhen
предложение срабатывает, когда либоa
илиb
станет правдой, вы можете подумать, что напишете это какwhen a or b then
.Но это неверно, потому что это сработает только тогда, когда первый человек становится истинным.Чтобы лучше это увидеть, рассмотрите этот код:
a = time>1.0; b = time>2.0; when {a, b} then // Equation set 1 end when; when a or b then // Equation set 2 end when;
Таким образом, набор уравнений 1 будет выполнен. дважды здесь, потому что он будет выполнен, когда a
становится правдой, а затем снова, когда b
становится правдой.Но набор уравнений 2 будет выполнен только один раз когда a
становится правдой.Это потому, что все выражение a or b
становится истинным только в один момент.
Это общие моменты путаницы в отношении when
.Надеюсь, эти объяснения помогут.