无容积场景下Modelica中inStream()与actualStream()的正确使用咨询
Modelica零流量探针传感器的stream函数使用问题解答
现有inStream代码的问题
你当前的代码虽然能运行,但逻辑冗余且不正确:
- 循环中对非测量组分添加
inStream(probe.c[i]) = probe.c[i]完全多余,探针无需干预这些组分的传递逻辑 - 对测量组分重复写
inStream(probe.c[component]) = probe.c[component]也无意义:根据Modelica规范,当flow变量F=0时,inStream(c)默认等于连接器的c变量,这个方程属于恒等式,编译器可能自动忽略,但写法上不符合规范逻辑
替换actualStream后编译失败的原因
actualStream()和inStream()的语义有本质区别:
- 当
F≠0时,两者都代表流入连接器的流变量值 - 当
F=0时,inStream(c)直接等于连接器的c(规范默认行为),而actualStream(c)是一个独立的自由变量,必须通过额外方程约束它的取值
替换后出现「变量多于方程」的错误,是因为actualStream(probe.c[i])会新增独立变量,但原代码的约束方程没有完全覆盖这些变量,导致模型自由度不为零。
正确的代码实现
由于探针是零流量(probe.F=0),完全不需要借助inStream()或actualStream(),直接使用连接器的变量即可。修正后的代码如下:
LiquidCon stream Real[2] c; flow Real F; Real p; end LiquidCon; block ProbeSensor LiquidCon probe; output RealOutput out; constant Integer component = 2 "The liquidphase component measured index"; parameter Real T (unit="h") = 0.05 "Time constant of measurement"; parameter Real x_0 = 0.0 "Initial state of measurement device"; Real x(start=x_0, fixed=true) "State variable measurement device"; Real p (unit="bar") "Pressure"; equation probe.F = 0; // 探针无流量,不消耗液体 p = probe.p; // 直接使用连接器的组分浓度,F=0时等价于inStream(probe.c[component]) T*der(x) + x = probe.c[component]; out = x; end ProbeSensor;
若一定要使用actualStream的处理方式
如果因特殊需求必须用actualStream(),需要明确添加所有流变量的约束方程,确保变量数与方程数匹配:
block ProbeSensor LiquidCon probe; output RealOutput out; constant Integer component = 2 "The liquidphase component measured index"; parameter Real T (unit="h") = 0.05 "Time constant of measurement"; parameter Real x_0 = 0.0 "Initial state of measurement device"; Real x(start=x_0, fixed=true) "State variable measurement device"; Real p (unit="bar") "Pressure"; equation probe.F = 0; p = probe.p; // 约束所有组分的actualStream等于连接器变量(F=0时的取值) for i in 1:2 loop actualStream(probe.c[i]) = probe.c[i]; end for; // 测量方程使用actualStream T*der(x) + x = actualStream(probe.c[component]); out = x; end ProbeSensor;
内容的提问来源于stack exchange,提问作者janpeter
相关产品推荐
相关产品推荐

