在 Modelica 中使用 if 语句进行 div by 0 保护

Using an if-statement for div by 0 protection in Modelica

我制作了一个简单的热泵模型,它使用传感器数据计算其 COP。

而 COP = 热量/功率

有时没有电源所以系统会做一个(不能被零除)。我希望这些值只是零。所以我尝试了 IF 语句if-statement. if power(u) = 0 then COP(y) = 0. somehow this does not work (see time 8)COP output + data。有人似乎注意到了这个问题吗?

编辑(时间 8.1 仍然有问题 编辑(热量和功率)

关系运算在 Modelica 中的工作方式略有不同。

如果您将 if u>0 替换为 if noEvent(u>0),它应该会按您的预期工作。

有关详细信息,请参阅 Modelica 规范中的第 8.5 节事件和同步 https://modelica.org/documents/ModelicaSpec34.pdf

为了使计算更具普遍适用性(例如,幂的符号可以改变),请看下面的代码。从中构建一个函数也是一个好主意(对于函数,可以省略 noEvent() 语句)...

model DivNoZeroExample
      parameter Real eps = 1e-6 "Smallest number to be used as divisor";
      Real power = 0.5-time "Some artificial value for power";
      Real heat = 1 "Some artificial value for heat";
      Real COP "To be computed";

equation 
    if noEvent(abs(power) < abs(eps)) then
        COP =  if noEvent(power>= 0) then heat/eps else heat/(-eps);
    else
        COP =  heat/power;
    end if;
end DivNoZeroExample;