根据连续变量的 start/initial 值设置参数
Set Parameter based on start/initial value of Continuous variable
任务:
- 我有一个变量
y1
,它的导数是由某种规律驱动的
例如y1 = sin(time)
我为此设置了起始值
例如y1 = 3.0
- 我有第二个变量
y2
由 y2 = y1 + offset
定义
- 现在,我希望此偏移量为
Parameter
(因此在模拟期间保持不变)并根据 y1
和 y2
的 starting/initial 值进行评估
喜欢 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
,但不知道会不会影响性能。
但是,即使在这种情况下,我也会收到一些危险警告(因为代数环),即 "It was not possible to check the given initialization system for consistency symbolically, because the relevant equations are part of an algebraic loop. This is not supported yet."
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
实现我想要的?我是否被迫使用更多 'variable' 变量?
- 是否需要
fixed
属性?如果 y1
和 y2
值是来自其他组件的 fixed
怎么办?如果不是呢?
(请注意,我认为它与 不同,因为我需要专门根据初始值评估参数)
在初始方程部分使用变量的名称访问变量的初始值。
通过一些较小的修改,您的代码可以与 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 初始化、初始方程和初始算法:
The initialization uses all equations and algorithms that are utilized in the intended operation [such as simulation or linearization].
因为我们已经在方程部分指定了y2 = y1 + offset
,这个方程不能在初始方程部分再次声明(offset = y2 - y1
是同一个方程,只是换一种方式写的)。
事实上,这个例子很好地展示了 Modelica 如何让您用方程而不是简单的赋值来描述模型。
在初始化过程中方程
y2 = y1 + offset
求解为
offset := y2 - y1
通过使用 y1
和 y2
的起始值。
在模拟过程中使用相同的方程来计算
y2 := y1 + offset.
关于固定属性的详细信息
Modelica by Example对fixed属性给出了很好的解释:
The fixed attribute changes the way the start attribute is used when
the start attribute is used as an initial condition. Normally, the
start attribute is considered a “fallback” initial condition and only
used if there are insufficient initial conditions explicitly specified
in the initial equation sections. However, if the fixed attribute is
set to true, then the start attribute is treated as if it was used as
an explicit initial equation (i.e., it is no longer used as a
fallback, but instead treated as a strict initial condition).
因此,在不使用 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;
任务:
- 我有一个变量
y1
,它的导数是由某种规律驱动的
例如y1 = sin(time)
我为此设置了起始值
例如y1 = 3.0
- 我有第二个变量
y2
由y2 = y1 + offset
定义
- 现在,我希望此偏移量为
Parameter
(因此在模拟期间保持不变)并根据y1
和y2
的 starting/initial 值进行评估
喜欢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
,但不知道会不会影响性能。
但是,即使在这种情况下,我也会收到一些危险警告(因为代数环),即 "It was not possible to check the given initialization system for consistency symbolically, because the relevant equations are part of an algebraic loop. This is not supported yet."
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
实现我想要的?我是否被迫使用更多 'variable' 变量? - 是否需要
fixed
属性?如果y1
和y2
值是来自其他组件的fixed
怎么办?如果不是呢?
(请注意,我认为它与
在初始方程部分使用变量的名称访问变量的初始值。 通过一些较小的修改,您的代码可以与 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 初始化、初始方程和初始算法:
The initialization uses all equations and algorithms that are utilized in the intended operation [such as simulation or linearization].
因为我们已经在方程部分指定了y2 = y1 + offset
,这个方程不能在初始方程部分再次声明(offset = y2 - y1
是同一个方程,只是换一种方式写的)。
事实上,这个例子很好地展示了 Modelica 如何让您用方程而不是简单的赋值来描述模型。
在初始化过程中方程
y2 = y1 + offset
求解为
offset := y2 - y1
通过使用 y1
和 y2
的起始值。
在模拟过程中使用相同的方程来计算
y2 := y1 + offset.
关于固定属性的详细信息
Modelica by Example对fixed属性给出了很好的解释:
The fixed attribute changes the way the start attribute is used when the start attribute is used as an initial condition. Normally, the start attribute is considered a “fallback” initial condition and only used if there are insufficient initial conditions explicitly specified in the initial equation sections. However, if the fixed attribute is set to true, then the start attribute is treated as if it was used as an explicit initial equation (i.e., it is no longer used as a fallback, but instead treated as a strict initial condition).
因此,在不使用 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;