在Modelica中将if语句用于div by 0保护

时间:2018-11-26 10:55:47

标签: if-statement modelica

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

而COP =热/功率

有时没有电源,因此系统执行a(不能除以零)。我希望这些值为零。因此,我尝试了一个IF语句if-statement。如果power(u)= 0,则COP(y)=0。这在某种程度上是行不通的(请参见时间8)COP output + data。似乎有人注意到了这个问题吗?

编辑(在时间8.1仍然存在问题output2.o textview 2.0 编辑(热量和功率)heat/power/COP

2 个答案:

答案 0 :(得分:2)

要使计算更通用(例如,幂的符号可能会改变),请看下面的代码。从它构建一个函数也是一个好主意(对于该函数,可以省略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;

答案 1 :(得分:1)

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

如果将if u>0替换为if noEvent(u>0),它应该可以正常工作。

有关详细信息,请参阅Modelica规范https://modelica.org/documents/ModelicaSpec34.pdf

中的8.5事件和同步部分。