【问题标题】:How to use Multiple And operator in the if statement in modelica?如何在modelica的if语句中使用Multiple And运算符?
【发布时间】:2020-06-08 19:32:08
【问题描述】:

我正在对传热中的 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 运算符两次以上时,我模拟模型时才会显示如下错误消息。

如何多次使用 And 运算符?还是因为其他问题?

【问题讨论】:

  • 'And' 当然可以多次使用。但是使用此代码很难提供帮助。你能提供一个完整的最小示例吗?

标签: if-statement operator-keyword modelica dymola


【解决方案1】:

问题不在于与运算符,而在于相等运算符del_T1&lt;&gt;del_T2del_T1==del_T2

如果您删除了与部分,它们会生成错误消息“连续时间中的非实数方程不合法:”。

如果您设法生成代码,它会给出更准确的错误消息: 无法比较 Real 类型的变量是否相等。

这在 Modelica 规范的第 3.5 节中有说明,https://specification.modelica.org/v3.4/Ch3.html#equality-relational-and-logical-operators

解决方法是用“足够接近”来代替它;例如将del_T1==del_T2 替换为abs(del_T1-del_T2)&lt;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;

(显然变量声明可以更改。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2018-05-16
    相关资源
    最近更新 更多