OpenModelica过定系统疑问:循环重复生成方程的原因与解决方法
OpenModelica循环生成冗余方程的问题解决
问题原因
你代码里的核心问题有两个:
- 循环变量和常量
u同名,容易引发逻辑混淆; - 每次循环都会重复生成
h1和h2的微分方程。当循环执行2次时,相当于把h1、h2的微分方程各复制了一遍,再加上2个q[u]的赋值方程,总共生成6个方程,但系统里的变量只有q[1]、q[2]、h1、h2这4个,直接导致方程数多于变量数,出现过约束。
解决方案
把q数组元素的赋值逻辑放在循环里,而h1、h2的状态微分方程只需要定义一次(放在循环外),同时修改循环变量名避免命名冲突。
修改后的代码
constant Integer u=2; Real q[u]; Real h1(start=1); Real h2(start=1); parameter Real h0=3.2; parameter Real Area=33; parameter Real area=0.16; parameter Real g=982; equation // 循环计算每个q数组元素的值 for i in 1:u loop q[i] = 21.96*i^(0.3853) + 0.3477; end for; // 系统状态方程仅定义一次,这里假设多个q的总和为流入量 0 = -der(h1) + sum(q)/Area - (area/Area)*sqrt(2*g*(h1+h0)); 0 = -der(h2) + (area/Area)*sqrt(2*g*(h1+h0)) - (area/Area)*sqrt(2*g*(h2+h0)); end DoubleTankSystem;
额外说明
如果你的需求不是多个q的总和流入水箱,而是要切换不同的q作为输入,可以通过参数选择或条件语句实现,不要用循环重复生成状态方程。OpenModelica中,equation段的for循环会为每一次迭代生成独立方程,只有数组元素的批量赋值这类场景适合放在循环里,全局状态方程只需定义一次。
内容的提问来源于stack exchange,提问作者Nabaz Rashid
相关产品推荐
相关产品推荐

