小编jan*_*ter的帖子

如何在 Modelica 中构建液体的平衡连接器?

帖子状态:

200313 得到了代码 DEMO_v42 的答案,我接受了赏金!

200310 我对昨天建议的两篇关键论文发表评论。还是不明白怎么更新DEMO_v41。

200309 我想强调,关键问题是如何在代码DEMO_v41(如果可能)中引入流的概念,从而使连接器平衡。作为浓度的变量 c 应该被声明为流,但是方程应该如何用 inStream 或 actualStream 更新 - 我很高兴看到!

200226 添加了帖子示例 DEMO_v41,它是一个简化的代码,我希望代码比第一个 DEMO_v40 更具可读性。

200225 我对给出的答案发表了一些评论,并试图让读者关注实际问题,但几乎没有发生。

200224 我对这篇文章的一般性和详细性都有一些投入。详细的评论价值不大,部分原因是误解了问题。来自 Rene 的更笼统的回答很好,但太笼统了。在考虑使用Modelica.Media等之前,我真的很喜欢通过小例子了解如何使用流的概念。这是一个学习过程。


我想知道如何正确定义液体的连接器,该液体在溶液中具有多种不同浓度的成分,然后该溶液具有流速。液体中的压力可以忽略不计。我长期使用的标准连接器是:

connector LiquidCon
   nc=5;
   Real c[nc]        “Component concentrations”;
   flow Real F       “Flow rate”;
end LiquidCon;
Run Code Online (Sandbox Code Playgroud)

该连接器在 JModelica 和 OpenModelica 中运行良好,但我在 OpenModelica 中收到连接器不平衡的警告。在 Modelica 语言规范的 9.3.1 节中,我发现我的构造实际上是不合法的,请参阅https://www.modelica.org/documents/ModelicaSpec34.pdf。如何制作满足需求的连接器?

我花了一些时间阅读了 Fritzons book 2n edition 中关于“流”概念的第 5.10 章,但我需要更详细地研究它。

我的简单连接器带来警告的原因是,当您声明一个流变量时,编译器假定另一个变量是该流变量的潜在变量,即连接器中至少流和潜在变量的数量必须相同。当然,在我的情况下,成分浓度不是潜在变量,而是编译器无法检测到的。

在第 5.10 章的介绍部分中,“流”概念的范围似乎是“......具有相关属性的物质的双向流动的应用......”。在我的应用领域,我怀疑我需要考虑双向流动。这意味着使用流是一种“矫枉过正”。但这似乎也暗示我也不应该使用“流”这个概念,这有点可惜。我们真的应该在这里停止使用“流”这个概念吗? ?

无论如何,我试图将一个比 Fritzson 书中关于这个主题的书更基本的例子放在一起,以了解“流”概念的使用情况以及计算时间等方面的开销。在下面的示例中,我模拟了从进料罐到收获罐的液体流动。流量现在由压差控制。代码 DEMO_v41 工作并给出连接器不平衡的警告。如果我现在将底物浓度 c 声明为“流”,我现在应该如何使用 inStream 和 actualStream 更新代码以使其以相同的方式工作,但现在使用此平衡连接器? …

modelica openmodelica jmodelica

6
推荐指数
2
解决办法
294
查看次数

Modelica - 迭代器有异常?

稍微概括的例子:

当我定义模型方程时,如何创建一个有异常的 for 循环?

以下工作:

  model Test
     Real[9] q;
  equation
     q[2] = 1.2;
     q[4] = 1.4; 
     for i in {1,3,5,6,7,8,9} loop
        q[i] = 0;
     end for;
  end Test;
Run Code Online (Sandbox Code Playgroud)

但我更愿意写一些类似的东西:

  model Test
     Real[9] q;
  equation
     q[2] = 1.2;
     q[4] = 1.4;
     for i in 1:9 and not in {2,4} loop
        q[i] = 0;
     end for;
  end Test;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

modelica

4
推荐指数
1
解决办法
74
查看次数

使用前缀常量或参数进行结构选择?

我尝试制作适用于不同平台的 Modelica 库代码。

我理解使用前缀“constant”是为了保护参数在编译后不被用户交互更改。如果您想允许更改,请使用前缀“参数”。

结构参数,例如水箱入口的数量,您可以自然地声明为

constant integer n_inlets = 1;
Run Code Online (Sandbox Code Playgroud)

当需要配置带有 n_inlets 的组件槽时,您可以编写代码

Tank tank(n_inlets=0);
Run Code Online (Sandbox Code Playgroud)

如果您决定水箱不应有任何入口。然后,编译后 n_inlets 被保护保持为 0,并且任何用户交互都不会改变它。

但是,如果你喜欢使用GUI来配置坦克,那么我认为你必须声明n_inlets作为参数,否则交互菜单将不会包含n_inlets。至少在 OpenModelica 中是这种情况,我猜其他 Modelica 实现中的 GUI 也是类似的。

配置完成后,我仍然希望保护 n_inlets 免受编译后后续用户交互的影响。有没有办法以这种方式编写代码?

graphical-interaction modelica openmodelica

4
推荐指数
1
解决办法
72
查看次数

如何使用 FMPy 提取(连续时间)状态列表?

在一些交互式仿真工作中,可以方便地仿真到某个时间点,更改一些参数,然后继续仿真。

使用FMU进行仿真,则需要重新加载或重置FMU,然后为系统状态输入新的初始值,该初始值是先前仿真的状态的最终值。您还需要以与之前的模拟类似的方式输入与默认值不同的参数值。

当您使用 PyFMI 时,有一个方便的关联函数 get_states_list() ,如下所示:

  from pyfmi import load_fmu
  ...
  model = load_fmu('file of fmu')
  stateDict = model.get_states_list()
Run Code Online (Sandbox Code Playgroud)

字典 stateDict 包含连续时间状态,这对于进一步自动更新初始状态值与先前模拟的最终状态值非常有帮助。据我了解,可能的离散时间状态不包括在内,并且需要手动处理。

如何使用 FMPy 获得类似的(连续时间)状态字典?或者更好的是,还包括离散时间状态?

modelica fmi pyfmi

3
推荐指数
1
解决办法
450
查看次数

如何在创建实例之前重新声明模型中的包?

我想要做

    M_type(redeclare package L=L2) m2_instance;
Run Code Online (Sandbox Code Playgroud)

但不起作用。相反,我可以写

    model M2_type
       extends M_type(redeclare package L=L2);
    end M2_type;
    M2_type m2_instance;
Run Code Online (Sandbox Code Playgroud)

这里不是一种更短的方法来做到这一点并避免声明 M2_type 吗?

modelica

2
推荐指数
1
解决办法
54
查看次数