我想在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中的“常数”不仅在具有消失时间导数的意义上是常数,而且在求解初始方程时它也是不可变的。所以求解器抱怨它不能求解初始方程0 = 2,这是因为它假设k总是等于0。
当然,我可以只将k设为变量,但我必须明确地告诉求解器,k具有消失的时间导数(等于它在朴素的物理意义上实际上是“常数”):
model ConstantTest
parameter Real h = 2;
Real k;
initial equation
k*k=h;
equation
der(k) = 0;
end ConstantTest;这是可行的,但这有点奇怪,因为求解器必须在每个时间步求解一个微分方程式,以便对k几乎什么都不做,这将是对计算资源的浪费。
有没有办法在不引入“时间演化开销”的情况下用Modelica求解静态隐式方程?
发布于 2019-02-08 02:07:10
我想你可以这样做:
model ConstantTest
parameter Real h = 2;
parameter Real k(fixed=false);
initial equation
k*k=h;
end ConstantTest;K将在初始化时计算。
发布于 2019-02-08 02:45:03
我认为定义这类系统的最好方法是:
model ConstantTest
parameter Real h = 2;
Real k;
equation
2*k=h;
end ConstantTest;OpenModelica会将其放入初始部分,并且只会求解一次。我会认为OpenModelica在你的系统中的行为是一个错误,因为它会多次求解一个与时间无关的方程。
https://stackoverflow.com/questions/54578892
复制相似问题