【问题标题】:Using an if-statement for div by 0 protection in Modelica在 Modelica 中为 div by 0 保护使用 if 语句
【发布时间】:2018-11-26 10:55:46
【问题描述】:

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

而 COP = 热量/功率

有时没有电源,因此系统会执行 a(不能除以零)。我希望这些值为零。所以我尝试了一个 IF 语句if-statement。如果 power(u) = 0 则 COP(y) = 0。不知何故这不起作用(见时间 8)COP output + data。有人似乎注意到了这个问题吗?

编辑(在 8.1 时仍有问题 编辑(热电)

【问题讨论】:

    标签: if-statement modelica


    【解决方案1】:

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

    【讨论】:

    • 虽然我不确定“eps”值是怎么回事。有效。 COP 下降到 0。仍然在 tiem 8.1,COP 再次回到 11。什么时候不应该。有什么想法吗?
    • 你能在你的情节中添加powerheat吗?
    • 我添加了电源和热量。有什么改变你知道问题吗?
    • 你能简单描述一下你是如何摆脱它的吗?可能对其他人有帮助...
    • 我使用了 modelica 标准库中的 CombiTimeTable 来存储数据。默认的步长是一个非常小的数字。我将它设置为 1 并且效果很好。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复,很遗憾没有解决问题。这可能与我正在使用的 CombiTimeTable 有关吗?
    猜你喜欢
    • 2018-05-11
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多