燃烧化学反应通常被视为刚性问题,这是由于燃烧过程中涉及的化学反应动力学特性所决定的。在仿真过程中常常出现燃烧室模型工质组分计算出负数致使仿真失败跳出问题。即便使用总包反应模型将复杂成千上万的基元反应简化为简单的几个总包反应后依旧存在这个问题。
为了保证模型运行,我首先想到了添加一个if判断来消除这个问题,当燃料组分小于0时,反应速率降低为0:
if moleConcentration[2]<0 then r=0; else r=xxx;
但是这并不能解决问题,我想到这可能是由于Modelica语言的事件语法导致的,因此我选择了抑制事件的判断
if noEvent(moleConcentration[2]<0) then r=0; else r=xxx;
事实上该方法确实使得部分工况得以运行,但是依旧无法满足所有工况。
将判断值从0改成一个很小的正数依然无法解决问题,甚至出现了更复杂的报错。
Modelica语言是否存在一个方法保证某个数值永远大于0
专栏
标签
高校专区
Modelica语言是否存在一个方法保证某个数值永远大于0
一般问题
发布于 2025-01-16 10:44:40
查看 16过去529天
所属专栏:Sysplorer基础平台
产品信息:Sysplorer系统建模仿真环境
采纳的回答
发布于 2025-01-20 11:14:09
后续问题已解决,使用max函数确实能很好的将一个变量限制在一个最小值之前,但是依旧不能很好解决我的问题。依旧是抑制事件方法解决了我的问题,值得注意的是,Mwork默认精度是1e-5,这个精度在判断时可能会超出标准工质库的极限-1e-5,因此需要在仿真前调节精度到1e-6,这样就能完美解决这个问题。但注意不要调得太低,否则会出现仿真速度骤降的问题。
全部回答 2
发布于 2025-01-16 15:54:46
您好,可以尝试以下形式,使得 r 永远大于0
r=max(1e-4, r_1);
// r_1为计算结果,以上代码可以保证 r 的取值为 0 和 r_1 中较大值,只要 r_1 > 0,r = r_1,否则r = 1e-4
发布于 2025-01-20 11:14:09
后续问题已解决,使用max函数确实能很好的将一个变量限制在一个最小值之前,但是依旧不能很好解决我的问题。依旧是抑制事件方法解决了我的问题,值得注意的是,Mwork默认精度是1e-5,这个精度在判断时可能会超出标准工质库的极限-1e-5,因此需要在仿真前调节精度到1e-6,这样就能完美解决这个问题。但注意不要调得太低,否则会出现仿真速度骤降的问题。
和原帖交流更多问题细节吧,去