Проблемы с пониманием сообщения об ошибке димолы - PullRequest
2 голосов
/ 06 ноября 2011

Может ли кто-нибудь дать мне подсказку, что означает «алгебраический цикл» - и как я должен справиться с этой ситуацией, добавив «пред» -операторы?Я серьезно не понимаю ...

Error: Failed to generate code for an algebraic loop
involving when equations or algorithms with when parts.
Unknowns:
  pump.Hb_flow
  pump.medium.d
  pump.medium.h
  pump.medium.state.melting
  pump.medium.state.T
  pump.V_flow
  pump.V_flow_single
  pump.W_single

Equations:
  algorithm 
    when Modelica.SIunits.Conversions.to_degC(pump.medium.state.T) < 13.9 then
      pump.medium.state.melting := true;
    elsewhen Modelica.SIunits.Conversions.to_degC(pump.medium.state.T) > 32.8       then
      pump.medium.state.melting := false;
    end when;
  // [removed set of equations that contained no "when"]

You may be able to cut the loop 
by putting 'pre' around some of the references to
unknown continuous time variables in when parts or when conditions.

Заранее спасибо, с наилучшими пожеланиями

TIMO.

1 Ответ

2 голосов
/ 06 ноября 2011

Эта проблема, как правило, связана с тем, что уравнения в предложении when влияют на условный оператор, который их запускает.

В Modelica нужно понимать, что решатель будет оценивать уравнения с использованием «кандидата»Решения "как часть процесса моделирования.Это не обязательно решение, которое он в конечном итоге выберет, но, тем не менее, необходимо оценить их по мере приближения к возможному решению.

Как это связано?Ну, в вашем случае я вижу, что вы меняете значение переменной "плавления".Но если это значение затем влияет на температуру среды (что вызвало изменение значения «плавления»), то инструмент обнаружит несогласованность в системе уравнений.Инструмент может быть в состоянии выполнить итерацию, чтобы найти согласованное решение-кандидат, но Димола просто «пробивает» и говорит, что не поддерживает такие ситуации.

Теперь важно понять, что в основном это обычновсе не имеет значения .Зачем?Потому что по большей части пользователь действительно не хочет семантики по умолчанию предложений когда в таких случаях.Большинство пользователей хотят рассматривать условие в предложении when как «причину», а уравнения внутри предложения when - как «следствие».В этом смысле они последовательны, и эффект не должен обернуться и повлиять на причину (хотя Белые Полосы написали отличную песню о таких ситуациях ;-)).

Общая схема здесь состоит в том, чтобы изолировать условие и затем добавить оператор «pre» вокруг него в предложении when.Если исходная модель выглядела следующим образом:

model Test
...
equation
  when x>12.5 then
    // equations involving y
  end when;
  // equations coupling x to y
end Test;

Вам просто нужно преобразовать модель в нечто вроде этого:

model Test2
...
  Boolean cond;
equation
  cond = x>12.5;
  when pre(cond) then
    // equations involving y
  end when;
  // equations coupling x to y
end Test;

Здесь важно то, что уравнения, включающие только y, приходят после условие верно.В данном случае «pre» в основном говорит, что если в текущее время минус несколько эпсилон, значение условия было true, тогда (в ответ) срабатывают уравнения в предложении when.

Такие ситуации могут привести к условию, называемому «дребезжание», когда значение условия меняется на каждый «эпсилон» прошедшего времени, но это означает, что проблема не очень хорошо поставлена.

Я надеюсь, что это делаеткакой-то смысл.Я признаю, что в сложных случаях может быть трудно точно определить, где существуют алгебраические циклы (хотя Димола пытается дать вам некоторую диагностику).Кроме того, в некоторых случаях вам требуется поведение Modelica по умолчанию, поэтому вы не всегда хотите добавлять необязательные пре-квалификаторы.

Дайте мне знать, если у вас есть какие-либо вопросы по этому объяснению.

...