使用Sundials求解化工厂大型DAEs时遇收敛失败问题
问题描述
我尝试用Sundials求解大规模微分代数方程组(DAEs),系统包含代数变量和微分变量。为获取初始条件,我用Ipopt和JuMP求解不含微分项的方程组:代数变量初始条件由Ipopt给出,微分变量初始条件设为0。Ipopt成功求解,提示:
EXIT: Optimal Solution Found.
但用Sundials求解时失败,报错如下:
[IDAS ERROR] IDASolve At t = 0 and h = 6.67572e-010, the corrector convergence failed repeatedly or with |h| = hmin. retcode: ConvergenceFailure Interpolation: 3rd order Hermite t: 1-element Vector{Float64}: 0.0 u: 1-element Vector{Vector{Float64}}: [1.2206393830204552, 665.4567421778746, 665.4567421778746, 665.4567421778746, 0.2392717933819864, 0.23927179338198643, 0.2392717933819864, 30.000000114765616, 30.000000114765616, 30.000000114765616 … 1.9999743918584891, 1.9999743918584985, 15.038245336256479, 15.038245336256479, 15.038245336256479, 15.038245406882618, 15.038245406882618, 15.038245406882618, 2.9999986304798587, 308.2267147190701]
已确认微分方程定义正确,单罐模型的小系统能正常求解,但增加一个罐后无法运行,求解决思路。
可行的解决方向
- 验证初始条件相容性:Ipopt得到的代数变量初始值和设为0的微分变量可能不满足DAEs的相容性约束。DAEs要求初始状态不仅满足代数方程,还要满足对代数方程求导后结合微分方程得到的隐式条件。可以用DAE求解器自带的相容性检查工具,或者手动推导相容性条件,让Ipopt同时求解满足该条件的初始值(包括微分变量)。
- 调整Sundials求解参数:
- 手动设置更大的初始步长,避免求解器一开始就尝试极小步长导致收敛失败;
- 调整相对容差(
rtol)和绝对容差(atol),适当放宽容差可能帮助收敛; - 更换线性求解器,比如将默认求解器换成KLU、SuperLU_DIST这类更适合大规模系统的选项。
- 处理系统刚性:多罐系统的刚性通常比单罐更强,确认IDAS是否启用了适配刚性系统的预条件器,或者切换到更适合刚性DAE的求解配置。
- 变量缩放:观察到系统中变量数量级差异极大(如0.2和600+),这种差异会影响数值稳定性。对变量进行缩放,让所有变量的数量级趋近一致,能有效改善求解器的收敛表现。
- 检查DAE指标:确认系统的微分指标,若指标高于1,IDAS默认配置难以处理,需要将系统降阶到指标1,或者使用支持高指标DAEs的求解策略。
内容的提问来源于stack exchange,提问作者Raggen
相关产品推荐
相关产品推荐

