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

Solving static equations (or systems thereof)

我想在 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;

但这失败了,因为 Modelica 中的 "constant" 不仅在时间导数消失的意义上是常数,而且在求解初始方程时它也已经是不可变的。所以求解器抱怨它不能求解初始方程 0 = 2,这是因为它假设 k 总是等于 0.

当然我可以让 k 成为一个变量,但是我必须明确地告诉求解器 k 具有消失的时间导数(相当于它在天真的物理意义上实际上是 "constant"):

model ConstantTest
  parameter Real h = 2;
  Real k;
initial equation
  k*k=h;
equation
  der(k) = 0;
end ConstantTest;

这行得通,但有点奇怪,因为求解器必须在每个时间步求解一个平凡的微分方程,以便对 k 基本上什么都不做。那将是对计算资源的浪费。

有没有什么方法可以在不引入"time evolution overhead"的情况下用Modelica求解静态隐式方程?

我猜你可以这样做:

model ConstantTest
  parameter Real h = 2;
  parameter Real k(fixed=false);
initial equation
  k*k=h;
end ConstantTest;

k 将在初始化时计算。

我认为定义这类系统的最佳方式是:

model ConstantTest
  parameter Real h = 2;
  Real k;
equation
  2*k=h;
end ConstantTest;

哪个OpenModelica会放在一个初始部分并且只求解一次。我认为 OpenModelica 对您的系统的行为是一个错误,因为它多次求解与时间无关的方程。