首页 > 解决方案 > 根据连续变量的开始/初始值设置参数

问题描述

任务

代码

从概念上讲,我想实现:

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 的参数属性,但它不能以这种方式使用。

我也想过使用 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;

问题

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

标签: modelicaopenmodelica

解决方案


变量的初始值在初始方程部分中使用它们的名称来访问。通过一些较小的修改,您的代码可以与 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 章初始化、初始方程和初始算法中写道:

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

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

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

在初始化过程中,方程

y2 = y1 + offset

解决为

offset := y2 - y1

y1通过使用和的起始值y2

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

y2 := y1 + offset.

固定属性的详细信息

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

当 start 属性用作初始条件时,fixed 属性改变了 start 属性的使用方式。通常,开始属性被认为是“备用”初始条件,并且仅在初始方程部分中明确指定的初始条件不足时使用。但是,如果将固定属性设置为真,则开始属性被视为好像它被用作显式初始方程(即,它不再用作后备,而是被视为严格的初始条件)。

所以在不使用 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;

推荐阅读