根据连续变量

时间:2019-06-06 10:26:26

标签: modelica openmodelica

任务

  • 我有一个变量y1,其导数受某些法律驱动
    例如y1 = sin(time)
    并为其设置了起始值
    例如y1 = 3.0
  • 我还有第二个变量y2
    y2 = y1 + offset
  • 定义
  • 现在,我希望此偏移量为Parameter(因此在模拟过程中为常数),并根据y1y2的起始/初始值进行评估
    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;

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

我还考虑过使用discrete代替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;

问题

  • 有没有办法用Parameter实现我想要的?我是否被迫使用更多“变量”变量?
  • 是否需要fixed属性?如果y1y2的值是来自其他组件的fixed怎么办?如果不是,那该怎么办?

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

2 个答案:

答案 0 :(得分:3)

在初始公式部分中使用变量的名称访问变量的初始值。 经过一些较小的修改,您的代码就可以与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

使用y1y2的起始值。

在仿真过程中,使用相同的方程式进行计算

y2 := y1 + offset.

有关固定属性的详细信息

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

  

固定属性更改了在以下情况下使用开始属性的方式   start属性用作初始条件。通常,   start属性被视为“后备”初始条件,仅   如果没有明确指定初始条件,则使用   在初始方程部分。但是,如果固定属性是   设置为true,则将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;

答案 1 :(得分:1)

您可以引入用于设置起始值的参数,看起来不那么优雅,然后可以轻松地计算偏移量,并且可以从参数对话框中设置起始值。

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;