我正在仿真中求解一组方程(IMODE = 1,SOLVER = 3)。 IPOPT求解器求解到可接受的水平并退出,但是gekko为此返回了一个错误并返回了我的解决方案。根据IPOPT文档,可接受水平的公差为1.0e-6,与gekko使用的OTOL和RTOL的默认值相同(以及我使用的值)。我能够修改gekko.py源代码以得到返回的答案,但是这样做避免了所有类型的错误。我不希望绕过所有错误,因为它们显然有助于调试其他问题,例如不可行。是否有我缺少的m.solve选项,或者是IPOPT解决到可接受水平时不触发错误的另一种方法?
答案 0 :(得分:2)
处理来自求解器的错误的一种方法是将solve命令包装在CREATE TRIGGER zkontrolujMnožství ON Zboží INSTEAD OF DELETE
AS BEGIN
IF (EXISTS (SELECT 1 FROM deleted WHERE množstvíSklad < 0)
EXECUTE vyvolej_chybu_sp 15; -- Raise error
ELSE
DELETE FROM Zboží
WHERE zbožíID IN (SELECT zbožíID FROM deleted);
END;
和try
语句中。 APPINFO的输出可以为您提供指导,说明遇到了什么类型的错误,并让您对“不可行的解决方案”,“解决到可接受的水平”或other IPOPT error codes做出不同的响应。
except
另一个选择是try a different solver such as APOPT or BPOPT。
try:
m.solve(disp=True)
except:
print('Solver error, looking at APPINFO')
if m.options.APPINFO==1:
print('APPINFO=1')
elif m.options.APPINFO==2:
print('APPINFO=2')
编辑:当Gekko引发求解器异常时,不会更新参数m.options.SOLVER = 1
。使用APPINFO
尝试以下操作:
debug=0
我刚刚更新了Gekko,以便远程解决方案也可以绕过所提出的异常,并使用m.solve(disp=True,debug=0)
if m.options.APPINFO!=0:
print('Solver error, looking at APPINFO')
if m.options.APPINFO==1:
print('APPINFO=1')
elif m.options.APPINFO==2:
print('APPINFO=2')
信息完成对选项文件的处理。本地运行时,APPINFO
信息位于运行目录的APPINFO
中,并由options.json
中的load_JSON
读取。