Как использовать оператор Multiple And в операторе if в modelica? - PullRequest
0 голосов
/ 25 февраля 2020

Я кодирую метод LMTD при передаче тепла и обнаружил некоторые ошибки при использовании операторов и более двух раз одновременно.

if (del_T1 > beta) and (del_T2 > beta) and (del_T1<>del_T2) then
    T_LMTD = (del_T1-del_T2) / ( (log(del_T1)) - (log(del_T2)));
  elseif (del_T1 > beta) and (del_T2 > beta) and (del_T1==del_T2) then
    T_LMTD = (del_T1-del_T2) / 2;
  elseif (del_T1 > beta) and (del_T2 < beta) then
    T_LMTD = (del_T1 - beta) / ( (log(del_T1/beta)) * (1 - zeta * (del_T2 - beta)));
  elseif (del_T1 < beta) and (del_T2 > beta) then
    T_LMTD = (del_T2 - beta) / ( (log(del_T2/beta)) * (1 - zeta * (del_T1 - beta)));
  elseif (del_T1 < beta) and (del_T2 < beta) then
    T_LMTD = beta / ( (1 - zeta * (del_T1 - beta))  * (1 - zeta * (del_T2 - beta)));
  else
    T_LMTD = beta / ( (1 - zeta * (del_T1 - beta))  * (1 - zeta * (del_T2 - beta)));
  end if;

К сожалению, сообщения об ошибках печатаются, как показано ниже, когда я симулирую модель только тогда, когда я использовал операторы And более двух раз в одной строке.

enter image description here

Как использовать оператор And несколько раз? или из-за других проблем?

1 Ответ

7 голосов
/ 25 февраля 2020

Проблема не в операторе and, а в операторах равенства, del_T1<>del_T2 и del_T1==del_T2.

Если бы вы удалили компоненты and, они сгенерировали бы сообщение об ошибке «Нереальное уравнение в непрерывном времени не является законным:».

И если вам удастся сгенерировать код, он будет дали более точное сообщение об ошибке: переменные типа Real нельзя сравнивать на равенство.

Что указано в разделе 3.5 спецификации Modelica, https://specification.modelica.org/v3.4/Ch3.html#equality -relational-and-logic-operator

Обходной путь для этого - заменить его на «достаточно близко»; например, замените del_T1==del_T2 на abs(del_T1-del_T2)<tol, для некоторого допуска тол.

Это дает рабочий пример как:

  Real T_LMTD;
  input Real del_T1;
  input Real del_T2;
  input Real zeta;
  parameter Real beta=0.7;
  parameter Real tol=1e-6;
equation 
 if (del_T1 > beta) and (del_T2 > beta) and abs(del_T1-del_T2)>tol then
    T_LMTD = (del_T1-del_T2) / ( (log(del_T1)) - (log(del_T2)));
  elseif (del_T1 > beta) and (del_T2 > beta) and abs(del_T1-del_T2)<tol then
    T_LMTD = (del_T1-del_T2) / 2;
  elseif (del_T1 > beta) and (del_T2 < beta) then
    T_LMTD = (del_T1 - beta) / ( (log(del_T1/beta)) * (1 - zeta * (del_T2 - beta)));
  elseif (del_T1 < beta) and (del_T2 > beta) then
    T_LMTD = (del_T2 - beta) / ( (log(del_T2/beta)) * (1 - zeta * (del_T1 - beta)));
  elseif (del_T1 < beta) and (del_T2 < beta) then
    T_LMTD = beta / ( (1 - zeta * (del_T1 - beta))  * (1 - zeta * (del_T2 - beta)));
  else
    T_LMTD = beta / ( (1 - zeta * (del_T1 - beta))  * (1 - zeta * (del_T2 - beta)));
  end if;

(Очевидно, объявления переменных могут быть изменены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...