Modelica的when子句中如何避免离散导数的逻辑?

How can make the logic avoiding discrete derivative in the when clause in Modelica?

我正在编写计算内燃机 p(压力)的逻辑。 方程由 when 子句中称为 'Period' 的几个案例组成。

  when Period==1 then
    p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));
  elsewhen Period==0 or Period==2 or Period==3 then
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end when;

代码中唯一未知的变量是 p,我收到如下错误消息

留言中说方程p是离散的,不可微分

但是,我认为这不是离散方程。 即使它是离散方程,我也不希望出现错误,因为 der(p) 部分仅在第二个子句中。

我该如何解决这个问题?

你能解释一下你想要什么行为吗?

第一个方程,

  when Period==1 then
    p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));

独立运行,但是 p 的上面的第二个等式仅在 Period 变为 0、2 或 3 时有效。这只是一个时间点,所以我不明白右手边的 der(p) 应该是什么。

此外,如果一个方程同时涉及 pder(p),则通常求解方程以根据 p 计算 der(p),但我不确定是否是这里的目标。

添加: 您的评论似乎表明您希望等式在 Period 获得新值时有效,而不仅仅是在实例中有效。在 Modelica 中,when 表示方程只在条件为真时有效一次,if 表示在条件为真时有效的方程。

这会导致类似的结果:

  if Period==1 then
    ...
  else
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end if;

但是,在那种情况下,第一个等式是有问题的。我想您希望 x=T^(Gamma/(Gamma-1))/p 在该部分保持不变,不幸的是,直接写入会导致更改索引,而 Modelica 目前不支持该索引。

但是,另一种方法是说它的导数为零,这会给出类似的结果:

  x=T^(Gamma/(Gamma-1))/p;
  if Period==1 then
    der(x)=0;
  else
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end if;

但不确定是否有效,因为我还没有看到整个模型。