我是GEKKO的新用户,最近我开始制作处理非线性炉模型的MPC应用程序。我目前正在使用Spyder IDE测试该应用程序。
我想在Linux系统上使用它,并且能够在我自己的计算机上本地运行代码,因此我目前无法使用标准的IPOPT求解器。我目前正在尝试使用APOPT和BPOPT求解器作为替代方法(使用m.options.SOLVER = 1)。我之前在IPOPT中测试了该模型,并且该模型可以正常运行。
在启用当前APOPT求解器的情况下运行代码时,该求解器能够在最初的第一步中找到成功的解决方案,但最终无法找到可行的解决方案。
这是求解器输出的示例:
对我而言,眼前一亮的是该模型目前具有负自由度,并且可能被过度指定了。
我一直在研究APOPT与IPOPT求解器的公式,但是我只是想看看是否有人知道这是否是该求解器无法像以前的迭代那样找到解决方案的原因,以及为什么该模型可以使用IPOPT求解器成功运行。
感谢您的帮助!
答案 0 :(得分:2)
负自由度问题很可能是因为您在问题中存在不平等约束。在解决问题之前,gekko不知道这些约束是否有效,因此假设所有不平等约束均有效,它会进行自由度分析。您可以查看的一件事是infeasiblities.txt
文件,它将告诉您什么约束不可行。您的问题收敛到1.6e-7,因此看起来像求解器报告的解决方案不可行,因为它与正确的解决方案相距甚远。要尝试的另一件事是用remote=True
捕获错误,如果不成功,请尝试IPOPT求解器,例如:
try:
m.options.SOLVER = 1
m.solve()
except:
m.options.SOLVER = 3
m.solve()
print('IPOPT solved the problem when APOPT failed')
我有一个用于本地解决方案的Linux可执行文件版本,但是pip install gekko
中包含的发行版大小过大。我建议您首先尝试找到不可行解决方案的来源,然后,如果IPOPT工作得更好,我可以通过IPOPT为您提供所需的本地可执行文件。