Вопрос

Я новичок в 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;
Это было полезно?

Решение

Хорошо, это довольно много вопросов.Попробую на них ответить:

  1. В чем разница между when и if.

    Вопросы внутри when предложение «активно» только в тот момент, когда условные выражения, используемые в when пункт становится активным.Напротив, уравнения внутри if утверждение истинно до тех пор, пока истинное условное выражение.

  2. Какова цель foo?

    Наверное, для визуализации.Насколько я вижу, это не оказывает явного влияния на модель.

  3. Почему impact перечислены в when пункт.

    Одна из проблем у вас так называемая Такие системы Зенона заключается в том, что он будет продолжать подпрыгивать бесконечно с все меньшими и меньшими интервалами.Я подозреваю, что impact Флаг здесь предназначен для обозначения того, что система перестала подпрыгивать.Обычно это делается путем проверки того, что условное выражение h<=0.0 на самом деле становится ЛОЖЬ в какой-то момент.Поскольку обнаружение событий включает числовой допуск, в какой-то момент высота отскока никогда не выходит за пределы диапазона допуска, и вам необходимо это обнаружить, иначе мяч больше никогда не отскочит и просто продолжит падать.(это трудно объяснить, не запустив симуляцию и не увидев эффекта).

  4. Что это , делать в 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.Надеюсь, эти объяснения помогут.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top