首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使逻辑在Modelica中的when子句中避免离散导数?

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

Stack Overflow用户
提问于 2020-03-03 03:36:21
回答 1查看 76关注 0票数 0

我在做计算内燃机p(压力)的逻辑。方程由几个在时间从句中称为“周期”的情况组成。

代码语言:javascript
复制
  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)部分只在第二个子句中。

我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 16:05:29

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

第一个方程式,

代码语言:javascript
复制
  when Period==1 then
    p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));

它本身起作用,但上面关于p的第二个方程只有在周期变为0,2或3时才是有效的,这只是时间上的一个点,所以我无法理解右边的der(p)应该是什么。

另外,如果一个方程同时涉及到pder(p),那么这个方程通常会被求解成基于p计算der(p),但我不确定这是否就是这里的目标。

补充:您的评论似乎表明,您希望在句点获得新值时,而不仅仅是在实例中,方程是有效的。在Modelica中,when用于只在条件变为真时才有效一次的方程,而if适用于条件为真时有效的方程。

这会导致这样的结果:

代码语言:javascript
复制
  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中目前不受支持。

然而,另一种选择是说它的导数为零,这将提供如下内容:

代码语言:javascript
复制
  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;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60499726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档