首页 > 解决方案 > 如何在Modelica的when子句中避免离散导数的逻辑?

问题描述

我正在制定计算内燃机的 p(压力)的逻辑。方程由 when 子句中称为“期间”的几种情况组成。

  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) 部分仅在第二个子句中。

我该如何解决这个问题?

标签: modelicaderivativedymola

解决方案


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

第一个方程,

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

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

此外,如果一个方程同时涉及两者p,并且der(p)该方程通常被求解为der(p)基于计算p,但我不确定这是否是这里的目标。

补充:您的评论似乎表明您希望等式在 Period 获得新值时有效,而不仅仅是在实例中有效。在 Modelicawhen中,用于仅在条件为真时才有效一次的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;

但不确定它是否会起作用,因为我还没有看到整个模型。


推荐阅读