在收敛之前,目标函数是真实目标和方程残差的加权组合。在收敛时,目标函数等于最初定义的目标,因为方程残差为零。 NaN 可能是由于被零除、计算结果为无穷大的三角函数或由于虚数(例如 sqrt(-value))而出现的。 NaN 表示求解器发散。求解器很少恢复,因为 NaN 目标也意味着缺少一些方程梯度。这里有三个建议:
1. 消除所有方程中被零除的变量。没有必要消除非零常量的除以零。下面是一个等式,其中密度ρ 是一个计算变量。
m.Equation(v.dt() == (m_in - m_out)/ρ)
消除除以零通常是等式两边的简单乘法。
m.Equation(ρ*v.dt() == m_in - m_out)
2. 添加变量边界。添加变量边界有助于避免被零除,但也可以帮助求解器找到解决方案。例如,摩尔分数的变量界限为(0-1),温度的变量界限为(0-10000)。
ρ = m.Var(1.0,lb=0.01,ub=10)
如果求解器报告不可行问题,请放宽(加宽)变量范围。
3. 确定不可行的约束和方程。设置m.options.max_iter=10提前终止并查看infeasibilities.txt文件报告。这是检索该文件的帮助:How to retrieve the 'infeasibilities.txt' from the gekko