【问题标题】:First order Modelica model with null time constant具有空时间常数的一阶 Modelica 模型
【发布时间】:2020-04-21 14:39:01
【问题描述】:

我想弄清楚在 Modelica 中是否可以(并且在语义上合法)模拟一阶传递函数的模型,时间常数等于 0 (T以下)。我使用的是 OpenModelica 1.15.0~dev-48-g3656b95,但我在一般 Modelica 上下文中提出问题。

我的上下文是在 Modelica 模型上试验模型降阶,这让我尝试使用具有 有时为 null 时间常数的 Modelica.Blocks.Continuous.FirstOrder。但是,为了使讨论更简单,这里是我正在研究的平面模型(标准 FirstOrder 块的简化和改编):

model FirstOrderZero
  import Modelica.SIunits;

  Real u "input";
  Real y "output";

  parameter Real k(unit="1")=1 "Gain";
  constant SIunits.Time T=0 "Time Constant";

equation
  u = 1;
  der(y) = (k*u - y)/T;

end FirstOrderZero;

我了解 Modelica 工具执行符号方程分析的方式,时间常数 T 应该是 constant 而不是 parameter。实际上,对于T=0,微分方程退化为代数方程y = k*u。除非 Modelica 模拟工具可以为 T 的不同值生成不同的代码路径(我认为没有 Modelica 工具可以,除了将来可能是 Modia?),T 是否为空的事实应该在方程分析的开始。

我不明白为什么上述模型无法模拟(“在时间 0 处除以零 [...] 其中除数表达式为 0.0”,使用 OM 1.15 开发)而 它可以工作 当最后一个方程改写为:

 T*der(y) = (k*u - y);

我会假设符号方程分析应该自动重新制定方程? (我可以使用 OM Transformational Debugger 看到等式变为 der(y) = (k - y)/0.0,当然,在模拟时会中断)。

或者,编写 Modelica 方程除以一个空常数是否语法上非法

【问题讨论】:

    标签: modelica openmodelica


    【解决方案1】:

    T 的可变性

    如果时间常数T 是常数,则参数或(离散)变量取决于您要做什么。

    • 常量的值在翻译过程中得到固定
    • 参数可以在转换后更改(因此在开始模拟之前),但不能在模拟期间更改
    • 离散变量可以在模拟期间更改其值,但仅限于事件实例
    • 连续变量可以在模拟过程中改变它们的值

    有关详细信息,请参阅 Modelica 规范 3.4 中的4.4.4 Component Variability Prefixes discrete, parameter, constant

    对于一阶元素,您通常使用在模拟过程中不会改变的传递函数,但用户应该能够设置T 的值。因此parameter 将是自然的选择。

    为什么你的模拟失败

    通过为T 使用常数,Modelica 工具可以比使用参数时更优化您的方程。根据您编写方程式的方式,您最终会得到一个不同的优化方程式。

    对于constant T=0,您的原始模型缩减为

    model FirstOrderZero
      Real u, y;
      parameter Real k=1;
    equation 
      u = 1;
      der(y) = (k*u - y)/0;
    end FirstOrderZero;
    

    要解决y,需要它的导数der(y) - 但它无法计算,因为总是会被零除。

    T*der(y) = (k*u - y); 的第二种情况下,您的模型减少到

    model FirstOrderZero
      Real u, y;
      parameter Real k=1;
    equation 
      u = 1;
      0 * der(y) = (k*u - y);
    end FirstOrderZero;
    

    等式0 * der(y) = (k*u - y) 的结果是0 = (k*u - y),因此是y = k*u。没有被零除,可以模拟模型。

    您看,尽管 Modelica 是一种非因果语言,但如何编写方程式可能很重要。

    你能做什么

    T=0 的一阶元素不再是一阶元素,而只是比例增益。要对其建模,请使用块 Modelica.Blocks.Continuous.TransferFunction

    如果T 不为零,则将其参数化如下:

    Modelica.Blocks.Continuous.TransferFunction transferFunction(b={k}, a={T,1})
    

    如果它是零使用

    Modelica.Blocks.Continuous.TransferFunction transferFunction(b={k}, a={1})
    

    【讨论】:

    • 为了使我的问题更精确(也许这是一个愚蠢的问题):我正在寻找一个参考(例如 Modelica 规范),它指出除以 0 的方程是不正确的。否则,为什么符号方程分析器无法取消呢?同意,这将涉及将方程乘以 0,这确实不是等价的方程。
    • 我刚刚检查了Modelica.Blocks.Continuous.TransferFunction transferFunction(b={k}, a={T,1})T 是一个等于零的常数同样失败(在时间0除以0)。这是连贯的。
    • 嗯,除以零是非法的。如果您的翻译模型中有除以零,那么您就有问题了。在上面的示例中,我们看到相同的等式可能会导致除以零,具体取决于您的编写方式。
    • 感谢@marco 的反馈。所以我可以这样总结推理:1)“简化”等式分母处的零在数学上是非法的,因此没有Modelica引擎会这样做。 2) OpenModelica 没有检测到方程因包含.../0 而被破坏,因此它会生成相应的 C 代码 3) 编译后的模型因经典的“除以零”错误而崩溃。所以现在一切看起来都很合乎逻辑,除了可能在第 2 步),OM 可能会引发错误,不是吗?
    • 没错,很好的总结。如果该工具应该在第 2 步抛出错误是有问题的。可以生成代码,所以翻译过程很好。请注意,Dymola 也会翻译模型,但会发出警告 Evaluation caused division by zero (T=0), in (k*u-y)/T
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多