求解静态方程(或其系统)
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 对您的系统的行为是一个错误,因为它多次求解与时间无关的方程。
我想在 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 对您的系统的行为是一个错误,因为它多次求解与时间无关的方程。