如何在 modelica 的 if 语句中使用多个 And 运算符?
How to use Multiple And operator in the if statement in modelica?
我在热传递中编写 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 运算符?或者因为其他问题?
问题不在于与运算符,而在于相等运算符 del_T1<>del_T2
和 del_T1==del_T2
。
如果您删除了 and 部分,它们会生成错误消息 "Non-real equation in continuous time are not legal:"。
如果您设法生成代码,它会给出更准确的错误消息:
无法比较 Real 类型的变量是否相等。
在 Modelica 规范的第 3.5 节中有说明,https://specification.modelica.org/v3.4/Ch3.html#equality-relational-and-logical-operators
解决方法是将其替换为 "close enough";例如将 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;
(显然可以更改变量声明。)
我在热传递中编写 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 运算符?或者因为其他问题?
问题不在于与运算符,而在于相等运算符 del_T1<>del_T2
和 del_T1==del_T2
。
如果您删除了 and 部分,它们会生成错误消息 "Non-real equation in continuous time are not legal:"。
如果您设法生成代码,它会给出更准确的错误消息: 无法比较 Real 类型的变量是否相等。
在 Modelica 规范的第 3.5 节中有说明,https://specification.modelica.org/v3.4/Ch3.html#equality-relational-and-logical-operators
解决方法是将其替换为 "close enough";例如将 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;
(显然可以更改变量声明。)