根据连续变量的开始/初始值设置参数

Dar*_*oni 5 modelica openmodelica

任务

  • 我有一个变量y1,其导数由某些定律驱动,
    例如y1 = sin(time)
    ,我为其设置起始值,
    例如y1 = 3.0
  • 我有第二个变量y2
    ,其定义为y2 = y1 + offset
  • 现在,我希望这个偏移量为 a Parameter(因此在模拟过程中恒定)并根据 等的起始/初始值y1进行y2
    评估offset = y2.start - y1.start

代码

从概念上讲我想实现:

model SetParametersFromInitialValues

Real y1(start = 3.0, fixed = true);
Real y2(start = 3.0, fixed = true);
parameter Real offset(fixed = false);

initial equation
  offset = y2.start - y1.start;
equation
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;
Run Code Online (Sandbox Code Playgroud)

我认为它可以工作,因为start应该是内置类型 Real 的参数属性,但它不能以这种方式使用。

我也想过使用 adiscrete代替parameter,但我不知道这是否会影响性能。
然而,即使在这种情况下,我也会收到一些危险的警告(由于代数环),即“不可能以符号方式检查给定初始化系统的一致性,因为相关方程是代数环的一部分。这不是还支持。”

model SetParametersFromInitialValues

Real y1(start = 3.0, fixed = true);
discrete Real offset(fixed = false);
Real y2(start = 5.0, fixed = true);

equation
  when initial() then
    offset = y2 - y1;
  end when;
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;
Run Code Online (Sandbox Code Playgroud)

问题

  • 有办法实现我想要的吗Parameter?我是否被迫使用一些更多的“可变”变量?
  • 是否fixed需要属性?如果y1y2fixed来自其他组件怎么办?如果不是呢?

(请注意,我认为它与将模型参数定义为变量不同,因为我需要专门根据初始值来评估参数)

mar*_*rco 4

变量的初始值可以使用初始方程部分中的名称来访问。\n经过一些较小的修改,您的代码可以与 Dymola 和 OpenModlica 配合使用:

\n\n
model SetParametersFromInitialValues\n  Real y1(start=3.0, fixed=true);\n  Real y2(start=2.0, fixed=true);\n  final parameter Real offset(fixed=false);\nequation \n  der(y1) = sin(time);\n  y2 = y1 + offset;\nend SetParametersFromInitialValues;\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,此处不需要初始方程部分,因为方程在初始化期间也有效。请参阅下面的详细信息以获取进一步的描述。

\n\n

有关删除的初始方程的详细信息

\n\n

Modelica规范3.40在第8.6章初始化、初始方程和初始算法中写道:

\n\n
\n

初始化使用预期操作[例如模拟或线性化]中使用的所有方程和算法。

\n
\n\n

由于我们已经在方程部分指定y2 = y1 + offset,因此不得在初始方程部分再次声明该方程(offset = y2 - y1是相同的方程,只是以另一种方式编写)。

\n\n

事实上,这个示例很好地演示了 Modelica 如何使您能够使用方程而不是简单的赋值来描述模型。

\n\n

在初始化期间方程

\n\n
y2 = y1 + offset\n
Run Code Online (Sandbox Code Playgroud)\n\n

解为

\n\n
offset := y2 - y1\n
Run Code Online (Sandbox Code Playgroud)\n\n

y1通过使用和的起始值y2

\n\n

在仿真过程中,使用相同的方程来计算

\n\n
y2 := y1 + offset.\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关固定属性的详细信息

\n\n

Modelica by Example对固定属性给出了非常好的解释:

\n\n
\n

当开始属性用作初始条件时,固定属性会更改开始属性的使用方式。通常,起始属性被视为 \xe2\x80\x9cfallback\xe2\x80\x9d 初始条件,并且仅在初始方程部分中明确指定的初始条件不足时才使用。但是,如果将固定属性设置为 true,则开始属性将被视为用作显式初始方程(即,它不再用作回退,而是被视为严格的初始条件)。

\n
\n\n

因此,在不使用fixed=true的情况下,我们可以重新编写上面的代码,如下所示:

\n\n
model SetParametersFromInitialValues2\n  Real y1;\n  Real y2;\n  final parameter Real offset(fixed=false);\ninitial equation \n  y1 = 3;\n  y2 = 1;\nequation \n  der(y1) = sin(time) + 1;\n  y2 = y1 + offset;\nend SetParametersFromInitialValues2;\n
Run Code Online (Sandbox Code Playgroud)\n

  • 注意:实际上 Dymola 会生成一条警告消息“删除了以下冗余且一致的方程:offset = y2-y1;”。删除初始方​​程效果很好 - 并生成正确的解。这个更简单的模型可能适用于 OpeModelica。(很明显,初始方程是多余的。) (2认同)