【问题标题】:Why does objective function for some iteration shows as NaN为什么某些迭代的目标函数显示为 NaN
【发布时间】:2023-02-01 22:41:04
【问题描述】:

我有一个 Gekko 模型,目前正在试验不同的目标函数。大多数目标函数是使用 .COST.DCOSTCVMV 变量上构建的,并由一些额外的 MaximizeMinimize 语句增强。然而,发生的情况是这些的某些排列似乎导致某些迭代的目标函数值变为 NaN,如附图所示。我不确定这是否意味着 Obj 函数在计算某些值时会导致除以零、inf 或其他未定义的结果。我会感谢一些关于如何克服这个问题的建议。

【问题讨论】:

    标签: python gekko


    【解决方案1】:

    在收敛之前,目标函数是真实目标和方程残差的加权组合。在收敛时,目标函数等于最初定义的目标,因为方程残差为零。 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-22
      • 2016-02-24
      • 2014-02-22
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多