在 GEKKO 中,导致错误的原因"Restoration phase is called at point that is almost feasible, with constraint viol



我实例化了一个仿真对象(GEKKO IMODE=4(和一个控制器物体(GEKKO IMODE=6(,并在循环中迭代运行它们,控制器在模拟器对象中设置自变量,并在下一个循环中从模拟器中读取状态变量。其目的是评估由于各种类型的模型误差引起的控制器响应,并在稍后演示使用Estimator对象进行自适应控制。

控制器在37次迭代中运行良好,但随后解决方案失败;恢复阶段被称为几乎可行的点,违反约束8.305823e-009。中止"我尝试了SCALING=2,然后在相同的错误消息之前达到了42次迭代(尽管对于违反约束的情况有不同的数值(。更改一些调整参数,如MV上的DMAX,进一步将错误推到了以后的迭代中。

我只有两个相等约束:

m.Equation(m.TankLevel.dt()==m.Balance)  
m.Equation(m.Flare==m.Rundown-(m.Unit1_Feed+m.Unit2_Feed+m.Fuel))

由于错误消息在我看来是一个数值精度问题,我将最后一个Equality约束更改为不等式约束m.Equation(m.Flare<=m.Rundown-(m.Unit1_Feed+m.Unit2_Feed+m.Fuel)+10e-8)

这似乎解决了问题。

错误的根本原因是什么?我应该以不同的方式解决它吗?

GEKKO 1.0.5, APMonitor 1.0.0

Restoration Phase错误来自Gekko中的IPOPT解算器(默认值(。当要求太高的精度或缩放效果不佳,并且求解器难以找到可行的解决方案时,有时会出现此错误。以下是一些需要考虑的事项:

解算器容差

设置解算器和目标公差,以避免过高的精度要求。残差和目标公差的默认值均为1e-6。尝试将公差设置为1e-5。

m.options.RTOL=1e-6
m.options.OTOL=1e-6

更改解算器

尝试使用APOPTBPOPT解算器,而不是默认的(IPOPT(。这可以帮助识别不可行的方程或解决错误。

m.options.SOLVER=1  # 1=APOPT, 2=BPOPT, 3=IPOPT

比例方程

如果方程中的值较大,则要求的精度可能超过机器精度。例如,如果m.Unit1_Feed和其他变量的典型值在1e6的范围内,则尝试:

s = 1e-6
m.Equation(s*m.Flare==s*(m.Rundown-(m.Unit1_Feed+m.Unit2_Feed+m.Fuel)))

这不会改变方程,但当函数的一阶导数接近1.0时,确实提高了找到数值解的难度。Gekko和APMonitor会根据初始猜测值自动应用缩放来修复此问题。如果给出了良好的初始猜测,通常不需要对方程进行缩放。

相关内容

最新更新