modelica - 根据连续变量的开始/初始值设置参数
问题描述
任务:
- 我有一个变量
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 的参数属性,但它不能以这种方式使用。
我也想过使用 adiscrete
而不是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
来自其他组件怎么办?如果不是呢?
(请注意,我认为它与将模型参数定义为变量不同,因为我需要专门根据初始值评估参数)
解决方案
变量的初始值在初始方程部分中使用它们的名称来访问。通过一些较小的修改,您的代码可以与 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 属性用作初始条件时,fixed 属性改变了 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;
推荐阅读
- .net - 为 .NET Core 控制台应用程序创建 Linux 安装程序
- python - matplotlib/seaborn 热图使用带有日期时间索引的 pandas 数据框
- html - AngularJS HTML 编辑器留下所有标签
- javascript - 在 vue 中构建音频播放器;如何在更改绑定后开始播放音频:src?
- react-native - setTimeout 将我的应用程序冻结在本机反应中
- ms-office - 提交带有自定义功能的加载项(更新?)
- apache-spark - Kafka 生产者 - 发送消息列表
- python-3.x - 如何向用户发送不同的消息
- typescript - 量角器使用setter填充几个元素
- postgresql - Postgresql 返回值减少余额