【问题标题】:Division by zero depending on parameter根据参数除以零
【发布时间】:2021-09-07 19:18:10
【问题描述】:

我正在使用FixedRotation 组件并得到除以零的错误。这发生在表单的翻译表达式中

var = nominator/fixedRotation.R_rel_inv.T[1,3]

因为T[1,3]对于所选参数为0:

  • n={0,1,0}
  • angle=180 deg

Openmodelica 似乎保留了符号变量并尝试通用,但在这种情况下,这会导致除以零,因为它选择将 T[1,3] 放在分母中。

为了告诉编译器,编译的评估值T[1,3] 应被视为硬编码,需要进行哪些修改? R_rel 在内部位于 fixedRotation 中,未使用 Evaluate=true 定义...

我应该使用这个块的自定义版本吗? (当我将源代码复制粘贴到新模型并将参数R_relR_rel_inv 设置为Evalute=true 时,模拟不会被零除)...

但是是否有一个修饰符可以从外部告诉参数应为Evaluate=true 而无需制作新模型?

还有其他方法可以防止被零除吗?

【问题讨论】:

    标签: modelica openmodelica


    【解决方案1】:

    尝试在更高级别传播参数并在此设置注释(Evaluate=true)。

    例如:

    model A
      parameter Real a=1;
    end A;
    
    model B
      parameter Real aPropagated = 2 annotation(Evaluate=true);
      A Ainstance(a=aPropagated);
    end B;
    

    【讨论】:

      【解决方案2】:

      我不明白 Evaluate 注释在这里应该如何提供帮助。分母显然为零,​​这是实际上应该处理的。 要解决除以零的问题,有多种可能性(例如,为这种情况设置特定值或定义分母的小偏移量,您可以在 Modelica 标准库中找到示例)。您还可以考虑方程式的物理含义并相应地处理它。 由于分母依赖于一个参数,你也可以设置一个assert()来警告用户参数值错误。

      顺便说一句。 R_rel_inv 受到保护,因此不应使用。请改用R_rel。此外,为了处理旋转矩阵,使用Modelica.Mechanics.MultiBody.Frames 中的函数是一种可取的方式。

      并且:使用自定义版本或自己的实现取决于您的偏好。自定义版本由社区维护,自己的版本在您手中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多