根据连续变量的 start/initial 值设置参数

Set Parameter based on start/initial value of Continuous variable

任务:

代码

概念上我想实现:

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;

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

我也想过用discrete代替parameter,但不知道会不会影响性能。
但是,即使在这种情况下,我也会收到一些危险警告(因为代数环),即 "It was not possible to check the given initialization system for consistency symbolically, because the relevant equations are part of an algebraic loop. This is not supported yet."

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;

问题:

(请注意,我认为它与 不同,因为我需要专门根据初始值评估参数)

在初始方程部分使用变量的名称访问变量的初始值。 通过一些较小的修改,您的代码可以与 Dymola 和 OpenModlica 一起使用:

model SetParametersFromInitialValues
  Real y1(start=3.0, fixed=true);
  Real y2(start=2.0, fixed=true);
  final parameter Real offset(fixed=false);
equation 
  der(y1) = sin(time);
  y2 = y1 + offset;
end SetParametersFromInitialValues;

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

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

Modelica Specification 3.40写在章节8.6 初始化、初始方程和初始算法:

The initialization uses all equations and algorithms that are utilized in the intended operation [such as simulation or linearization].

因为我们已经在方程部分指定了y2 = y1 + offset,这个方程不能在初始方程部分再次声明(offset = y2 - y1是同一个方程,只是换一种方式写的)。

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

在初始化过程中方程

y2 = y1 + offset

求解为

offset := y2 - y1

通过使用 y1y2 的起始值。

在模拟过程中使用相同的方程来计算

y2 := y1 + offset.

关于固定属性的详细信息

Modelica by Example对fixed属性给出了很好的解释:

The fixed attribute changes the way the start attribute is used when the start attribute is used as an initial condition. Normally, the start attribute is considered a “fallback” initial condition and only used if there are insufficient initial conditions explicitly specified in the initial equation sections. However, if the fixed attribute is set to true, then the start attribute is treated as if it was used as an explicit initial equation (i.e., it is no longer used as a fallback, but instead treated as a strict initial condition).

因此,在不使用 fixed=true 的情况下,我们可以将上面的代码重新表述如下:

model SetParametersFromInitialValues2
  Real y1;
  Real y2;
  final parameter Real offset(fixed=false);
initial equation 
  y1 = 3;
  y2 = 1;
equation 
  der(y1) = sin(time) + 1;
  y2 = y1 + offset;
end SetParametersFromInitialValues2;

您可以引入用于设置起始值的参数,可能看起来不太优雅,然后计算偏移量很容易,它引入了从参数对话框设置起始值的可能性。

model SetParametersFromInitialValues

parameter Real y1_start = 3.0;
parameter Real y2_start = 3.1;
final parameter Real offset= y2_start - y1_start;

Real y1(start = y1_start, fixed = true);
Real y2(start = y2_start, fixed = true);

equation
  der(y1) = sin(time);
  y2 = y1 + offset;

end SetParametersFromInitialValues;