Dar*_*oni 5 modelica openmodelica
任务:
y1,其导数由某些定律驱动,y1 = sin(time)y1 = 3.0 y2y2 = y1 + offsetParameter(因此在模拟过程中恒定)并根据 等的起始/初始值y1进行y2offset = 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;
Run Code Online (Sandbox Code Playgroud)
我认为它可以工作,因为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;
Run Code Online (Sandbox Code Playgroud)
问题:
Parameter?我是否被迫使用一些更多的“可变”变量?fixed需要属性?如果y1和y2值fixed来自其他组件怎么办?如果不是呢?(请注意,我认为它与将模型参数定义为变量不同,因为我需要专门根据初始值来评估参数)
变量的初始值可以使用初始方程部分中的名称来访问。\n经过一些较小的修改,您的代码可以与 Dymola 和 OpenModlica 配合使用:
\n\nmodel SetParametersFromInitialValues\n Real y1(start=3.0, fixed=true);\n Real y2(start=2.0, fixed=true);\n final parameter Real offset(fixed=false);\nequation \n der(y1) = sin(time);\n y2 = y1 + offset;\nend SetParametersFromInitialValues;\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,此处不需要初始方程部分,因为方程在初始化期间也有效。请参阅下面的详细信息以获取进一步的描述。
\n\nModelica规范3.40在第8.6章初始化、初始方程和初始算法中写道:
\n\n\n\n\n初始化使用预期操作[例如模拟或线性化]中使用的所有方程和算法。
\n
由于我们已经在方程部分指定y2 = y1 + offset,因此不得在初始方程部分再次声明该方程(offset = y2 - y1是相同的方程,只是以另一种方式编写)。
事实上,这个示例很好地演示了 Modelica 如何使您能够使用方程而不是简单的赋值来描述模型。
\n\n在初始化期间方程
\n\ny2 = y1 + offset\nRun Code Online (Sandbox Code Playgroud)\n\n解为
\n\noffset := y2 - y1\nRun Code Online (Sandbox Code Playgroud)\n\ny1通过使用和的起始值y2。
在仿真过程中,使用相同的方程来计算
\n\ny2 := y1 + offset.\nRun Code Online (Sandbox Code Playgroud)\n\nModelica by Example对固定属性给出了非常好的解释:
\n\n\n\n\n当开始属性用作初始条件时,固定属性会更改开始属性的使用方式。通常,起始属性被视为 \xe2\x80\x9cfallback\xe2\x80\x9d 初始条件,并且仅在初始方程部分中明确指定的初始条件不足时才使用。但是,如果将固定属性设置为 true,则开始属性将被视为用作显式初始方程(即,它不再用作回退,而是被视为严格的初始条件)。
\n
因此,在不使用fixed=true的情况下,我们可以重新编写上面的代码,如下所示:
\n\nmodel SetParametersFromInitialValues2\n Real y1;\n Real y2;\n final parameter Real offset(fixed=false);\ninitial equation \n y1 = 3;\n y2 = 1;\nequation \n der(y1) = sin(time) + 1;\n y2 = y1 + offset;\nend SetParametersFromInitialValues2;\nRun Code Online (Sandbox Code Playgroud)\n