求解静态方程(或其系统)

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解决静态隐式方程而不引入"时间演化开销"?

Adr*_*Pop 7

我想你可以这样做:

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将在初始化时计算.