Вы можете просто изменить свой вызов, чтобы немного решить:
opt = SolverFactory('ipopt')
res = opt.solve(model, symbolic_solver_labels=True)
Затем вы должны увидеть более полезное сообщение об ошибке в выводе ipopt.
Позвольте мне расширить этот ответ на адрес другая часть вопроса о поиске ограничения по его номеру. Поскольку переменные и ограничения Pyomo не имеют индексов, это очень сильно зависит от интерфейса c. Для Pynumero у вас есть несколько вариантов. Предположим, у вас есть следующие ConcreteModel
с именами m
и PyomoNLP
с именами nlp
.
import pyomo.environ as pyo
from pyomo.contrib.pynumero.interfaces.pyomo_nlp import PyomoNLP
m = pyo.ConcreteModel()
m.x = pyo.Var()
m.y = pyo.Var()
m.obj = pyo.Objective(expr=m.y)
m.c1 = pyo.Constraint(expr=m.y >= m.x)
m.c2 = pyo.Constraint(expr=m.y >= -m.x)
nlp = PyomoNLP(m)
Если вы просто хотите получить индекс нескольких переменных или ограничений, вы можете использовать
var_indices = nlp.get_primal_indices([m.x, m.y])
con_indices = nlp.get_constraint_indices([m.c1, m.c2])
Если вам нужны полные карты в обоих направлениях, вы можете использовать
con_to_index = dict()
index_to_con = dict()
var_to_index = pyo.ComponentMap()
index_to-var = dict()
for ndx, var in enumerate(nlp.get_pyomo_variables()):
var_to_index[var] = ndx
index_to_var[ndx] = var
for ndx, con in enumerate(nlp.get_pyomo_constraints()):
con_to_index[con] = ndx
index_to_con[ndx] = con