我想在Modelica中执行以下操作:在特定模型中,我有几个参数h,并且我想通过求解参数和其他值之间的一组隐式方程来从中推导出一些与时间无关的值k。由于方程式本质上是隐式的,因此我不能简单地分配一个表达式,而必须让求解器找到解。
由于参数是恒定的,所以我希望能够在系统其余部分的实际时间积分之前(例如,包含k作为系数的微分方程)开始时仅求解一次方程。
请参阅以下我想写的示例:
drive()
但是这失败了,因为Modelica中的“常数”不仅在具有消失的时间导数的意义上是常数,而且在求解初始方程式时它已经是不可变的。因此,求解器抱怨无法求解初始方程0 = 2,这是因为它假定k始终等于0。
当然,我只能将k设置为变量,但随后我必须明确地告诉求解器,k的时间导数消失了(就其天真的物理意义而言,它实际上是“恒定的”):
commentSchema
这是可行的,但是有点奇怪,因为求解器必须在每个时间步上求解一个平凡的微分方程,以便对k基本不做任何处理。这将浪费计算资源。
有什么方法可以用Modelica解决静态隐式方程式而不会引入“时间演化开销”?
答案 0 :(得分:7)
我想您可以这样做:
model ConstantTest
parameter Real h = 2;
parameter Real k(fixed=false);
initial equation
k*k=h;
end ConstantTest;
k将在初始化时计算。
答案 1 :(得分:2)
我认为定义此类系统的最佳方法是:
model ConstantTest
parameter Real h = 2;
Real k;
equation
2*k=h;
end ConstantTest;
哪个OpenModelica将放在初始部分,并且只求解一次。我会认为OpenModelica对于您的系统的行为是一个错误,因为它多次解决了与时间无关的方程式。