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

Modelica 根据连续变量的起始值/初始值设置参数,modelica,openmodelica,Modelica,Openmodelica,任务: 我有一个变量y1,它的导数是由一些定律驱动的 e、 g.y1=sin(时间) 我为其设置了起始值 e、 g.y1=3.0 我还有第二个变量y2 由y2=y1+偏移量定义 现在,我希望该偏移量是一个参数(因此在模拟过程中保持不变),并根据y1和y2的起始值/初始值进行评估 比如offset=y2.start-y1.start 代码 从概念上讲,我希望实现: model SetParametersFromInitialValues Real y1(start = 3.0, fixed

任务

  • 我有一个变量
    y1
    ,它的导数是由一些定律驱动的
    e、 g.
    y1=sin(时间)

    我为其设置了起始值
    e、 g.
    y1=3.0
  • 我还有第二个变量
    y2

    y2=y1+偏移量定义
  • 现在,我希望该偏移量是一个
    参数(因此在模拟过程中保持不变),并根据
    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;
我认为它可以工作,因为
start
应该是内置类型Real的一个参数属性,但它不能以这种方式使用

我还考虑过使用
离散
而不是
参数
,但我不知道这是否会影响性能。
然而,即使在这种情况下,我也得到了一些危险的警告(因为代数循环),即“不可能象征性地检查给定的初始化系统的一致性,因为相关方程是代数循环的一部分。这还不受支持。”

问题

  • 有没有办法通过
    参数
    实现我想要的?我是否被迫使用更多的“变量”变量
  • 是否已修复
    属性是必需的?如果来自其他组件的
    y1
    y2
    值是
    固定的
    ,该怎么办?如果不是呢

(请注意,我认为这不同于,因为我需要根据初始值评估参数)

在初始方程部分使用变量的名称访问变量的初始值。 通过一些较小的修改,您的代码可以使用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;
注意,这里不需要初始方程部分,因为方程在初始化期间也是有效的。有关详细说明,请参见下面的详细信息

有关删除的初始方程的详细信息 第8.6章初始化、初始方程和初始算法中写道:

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

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

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

在初始化过程中

y2 = y1 + offset
解为

offset := y2 - y1
使用
y1
y2
的起始值

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

y2 := y1 + offset.
有关固定属性的详细信息 对固定属性给出了非常好的解释:

“固定”属性会更改启动时使用“开始”属性的方式 “开始”属性用作初始条件。通常情况下 “开始”属性被视为“回退”初始条件,并且仅限于 如果明确指定的初始条件不足,则使用 在初始方程部分。但是,如果固定属性为 如果设置为true,则开始属性将被视为 显式初始方程(即不再用作 回退,但将其视为严格的初始条件)

因此,在不使用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;

哦,这和我的“离散”版本非常接近!美好的不幸的是,它不能与OpenModelica正常工作(它返回相同的错误)。对于OpenModelica,我建议使用
初始算法
而不是
初始方程
,以帮助进行符号操作。不幸的是,即使在这种情况下,您也会收到“超过指定初始条件”的警告。顺便说一句,Dymola解决了模型中出现的任何问题。是的,OpenModelica无法解决它。对不起,我只在迪莫拉试过。但是matth发布了一个在OpenModelica中也有效的很好的解决方案。注意:实际上,Dymola为这句话生成了一条警告消息:“删除了以下冗余且一致的等式:offset=y2-y1;”。删除初始方程效果很好,并生成正确的解决方案。这种更简单的模型可能适用于OpeModelica。(很明显,初始方程是多余的。)谢谢你的输入。我会更新我的答案。事实上,正如我在文章最后几行提到的,我必须特别避免这个问题。我必须根据外部模型(如车身位置)推断起始值,因此我无法填写y1_起始值和y2_起始值。
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;