Во-первых, обратите внимание, что a
- это состояние (по крайней мере, на основе приведенных вами уравнений). Это означает, что в настоящее время будет известно a
. Из вашего описания также известно c
(видимо, это функция времени). Таким образом, в любой момент времени мы знаем, какая ветвь оператора if
будет взята.
Таким образом, в любой момент времени мы можем вычислить b
и, следовательно, der(a)
. Настоящий вопрос в том, в какой момент изменяется условие в операторе if
.
Ответ заключается в том, что функция "монитора" устанавливается (компилятором Modelica), и когда эта функция монитора пересекает ноль, среда выполнения Modelica отреагирует, остановив интеграцию в этой точке, а затем перезапустив интеграцию (используя другую ветвь). Это связано с тем, что условное выражение в операторе if
неявно генерирует события.
Другой способ подумать об этом состоит в том, что существует «скрытая» логическая переменная, которая указывает, берем ли мы ветку или другую. Сначала это звучит безумно, потому что вы предполагаете, что среда выполнения Modelica примет ветку в зависимости от того, a>c.y
, но на самом деле это не так. Что он делает, так это определяет начальное значение логического значения на основе значения a>c.y
в начале моделирования, а затем пытается выяснить, когда оно действительно изменится. На самом деле он не оценивает a>c.y
все время. Это приводит к странным ситуациям, когда одна ветвь выполняется, хотя этого не должно быть. Это произойдет в Modelica и связано с вариантами решений, созданными в то время, когда среда выполнения Modelica пытается определить, где произошло событие.
Я знаю, это звучит сбивающе с толку, но если вы примете понятие «скрытой логической переменной» и поймете, что оно не изменится до тех пор, пока среда выполнения Modelica не сможет окончательно определить точку, в которой должно произойти изменение (на основе некоторой траектории возможного решения), это все имеет смысл.
Надеюсь, это поможет.
person
Michael Tiller
schedule
18.01.2014