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

问题描述 投票:0回答:1

我正在通过逻辑计算内燃机的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,我得到如下错误消息

enter image description here

在消息中说等式p是离散的并且无法微分。

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

我该如何解决此问题?

modelica derivative dymola
1个回答
2
投票

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

第一等式,

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

可以独立工作,但是上面的p的第二个等式仅在Period becomes 0、2或3时才有效。这只是一个时间点,所以我无法理解der(p)是什么。应该在右侧。

[另外,如果一个方程式同时涉及pder(p),则通常可以求解该方程式,以基于der(p)来计算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;

但是由于我还没有看到整个模型,所以不确定它是否会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.