oli*_*ver 5 modelica openmodelica
我想在Modelica中执行以下操作:在特定模型中,我有几个参数h,我想通过求解参数和其他值之间的一组隐式方程,从中推导出一些与时间无关的值k.由于方程本质上是隐式的,我不能简单地指定一个表达式,我宁愿让解算器找到解决方案.
由于参数是常数,我希望能够在系统的其余部分(例如,包含k作为系数的微分方程)的实际时间积分之前,在开始时仅解决方程一次.
请参阅以下我希望能够编写的示例:
model ConstantTest
parameter Real h = 2;
const Real k;
initial equation
k*k=h; // just an example of an implicit equation, which in this simple case could also be written explicitly
end ConstantTest;
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为Modelica中的"常数"不仅在消失时间导数的意义上是常数,而且在初始方程求解时它也已经是不可变的.所以求解器抱怨它无法求解初始方程0 = 2,这是因为假设k总是等于0.
当然我可以让ka变量,但是我必须明确地告诉求解器k具有消失时间导数(相当于它在天真的物理意义上实际上是"常数"):
model ConstantTest
parameter Real h = 2;
Real k;
initial equation
k*k=h;
equation
der(k) = 0;
end ConstantTest;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但它有点奇怪,因为求解器必须在每个时间步骤解决一个微不足道的微分方程,以便基本上什么都不做k.这将浪费计算资源.
有没有办法用Modelica解决静态隐式方程而不引入"时间演化开销"?
我想你可以这样做:
model ConstantTest
parameter Real h = 2;
parameter Real k(fixed=false);
initial equation
k*k=h;
end ConstantTest;
Run Code Online (Sandbox Code Playgroud)
k将在初始化时计算.