任务:
y1
,其导数受某些法律驱动y1 = sin(time)
y1 = 3.0
y2
y2 = y1 + offset
Parameter
(因此在模拟过程中为常数),并根据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的参数属性,但是不能以这种方式使用。
我还考虑过使用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
属性?如果y1
和y2
的值是来自其他组件的fixed
怎么办?如果不是,那该怎么办?(请注意,我认为它与Define Model Parameter as Variable不同,因为我需要专门根据初始值来评估参数)
答案 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
使用y1
和y2
的起始值。
在仿真过程中,使用相同的方程式进行计算
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;