Modelica 检测Dymola中RealInput变量的变化

Modelica 检测Dymola中RealInput变量的变化,modelica,dymola,Modelica,Dymola,我需要检测RealInput值X的任何变化。我已经尝试过检查 如果X==preX,但只接收一个错误和一个警告,表示无法比较Real是否相等。我也考虑过使用X的导数,但是没有明确的表达式 我的其他想法是尝试将连续输入采样到离散变量中,以便进行比较。这能以某种方式工作吗?尝试更改操作符。如中所述。根据规范,它将扩展到XpreX,因此也可以使用它。尝试更改操作符。如中所述。根据规范,它将扩展到XpreX,因此可能也可以工作。更改运算符仅对非实信号实际有用。原因是它没有为实类型定义。相反,您需要创建一个

我需要检测RealInput值X的任何变化。我已经尝试过检查 如果X==preX,但只接收一个错误和一个警告,表示无法比较Real是否相等。我也考虑过使用X的导数,但是没有明确的表达式

我的其他想法是尝试将连续输入采样到离散变量中,以便进行比较。这能以某种方式工作吗?

尝试更改操作符。如中所述。根据规范,它将扩展到XpreX,因此也可以使用它。

尝试更改操作符。如中所述。根据规范,它将扩展到XpreX,因此可能也可以工作。

更改运算符仅对非实信号实际有用。原因是它没有为实类型定义。相反,您需要创建一个模型来检查信号是否偏离上次记录的值超过给定的ε。我还没有测试过,但是代码看起来像这样:

model DetectChange
  parameter Real eps;
  input Real signal;
  output Boolean change;
protected
  Real last_value;
initial algorithm
  last_value = signal;
algorithm
  when pre(change) then
    last_value := signal;
  end when;
  change := abs(signal-last_value)>=eps;
end DetectChange;
再说一遍,我还没有测试过这个。但是它给了你一些想法。

改变操作符只对非真实信号有用。原因是它没有为实类型定义。相反,您需要创建一个模型来检查信号是否偏离上次记录的值超过给定的ε。我还没有测试过,但是代码看起来像这样:

model DetectChange
  parameter Real eps;
  input Real signal;
  output Boolean change;
protected
  Real last_value;
initial algorithm
  last_value = signal;
algorithm
  when pre(change) then
    last_value := signal;
  end when;
  change := abs(signal-last_value)>=eps;
end DetectChange;

再说一遍,我还没有测试过这个。但是它给了你一些想法。

如果你在a中使用preX,X必须是一个离散时间表达式。这意味着它可能已经被取样了。按照答案中的建议使用change。如果在a中使用preX,X必须是离散时间表达式。这意味着它可能已经被取样了。按照答案中的建议使用change。正如我在另一个答案中指出的,操作符并没有定义为真正的。此外,这与OP的X==preX基本相同,因为它要求X是一个离散时间变量。此外,这与OP的X==preX基本相同,因为它要求X是一个离散时间变量。为什么不能比较实类型的相等性?这似乎是一个常见的用例,原因与浮点类型在内部的表示方式有关。虽然我们很少这样看待它们,但它们确实是不可信的价值观。平等不被允许的原因是它并没有真正达到人们的期望。例如,进入64位Intel机器上的Python外壳,计算2.7*3==8.1。它会回来的。这是因为2.7*3的计算结果为8.100000000000142,而8.1的计算结果为8.0999999964。因此,具有讽刺意味的是,它们实际上都没有精确地表示8.1。因此,我可以使用常量.small、小于比较和大于比较来测试近似相等性吗?我会避免使用eps和small,因为它们提供了给定平台的浮点数粒度信息。那没有任何工程意义。还要记住,当积分微分方程时,你会得到数值噪声,这将导致单子上下摆动。我在上面代码中使用的eps应该代表一些有意义的工程阈值。换句话说,工程术语的变化有多大,足以证明采取行动是合理的。这就是上面的eps。为什么不能比较真实类型的相等性?这似乎是一个常见的用例,原因与浮点类型在内部的表示方式有关。虽然我们很少这样看待它们,但它们确实是不可信的价值观。平等不被允许的原因是它并没有真正达到人们的期望。例如,进入64位Intel机器上的Python外壳,计算2.7*3==8.1。它会回来的。这是因为2.7*3的计算结果为8.100000000000142,而8.1的计算结果为8.0999999964。因此,具有讽刺意味的是,它们实际上都没有精确地表示8.1。因此,我可以使用常量.small、小于比较和大于比较来测试近似相等性吗?我会避免使用eps和small,因为它们提供了给定平台的浮点数粒度信息。那没有任何工程意义。还要记住,当积分微分方程时,你会得到数值噪声,这将导致单子上下摆动。我在上面代码中使用的eps应该代表一些有意义的工程阈值。换句话说,工程术语的变化有多大,足以证明采取行动是合理的。以上是eps。