在 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;
我制作了一个简单的热泵模型,它使用传感器数据计算其 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;