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;