我是Pyomo和Ipopt的新手。我想使用这些工具来优化非线性优化问题。我在尝试优化函数时出错。
我一直在玩Pyomo提供的例子。我的问题的主要区别是,我想在一个单独的函数中定义目标函数,它意味着用numpy数组进行一些乘法运算,但我认为这两者都可以用Pyomo处理。
我试图尽可能简化我的问题(当然,从优化的角度来看,这没有意义,但这只是为了展示问题(。我的问题看起来像:
import numpy as np
from pyomo.environ import *
def myfunc(model, extra_param):
matrix_A=np.sin(np.random.rand(100,100))+extra_param
return sum(model.x*matrix_A-extra_param)
extra_param=5
model = ConcreteModel()
model.IDX=range(100)
model.x = Var(model.IDX,bounds=(0,1.), initialize=0.99)
model.obj=Objective(expr = myfunc(model,extra_param))
model.pprint()
solver = SolverFactory('ipopt')
solver.solve(model, tee=True)
我收到以下消息:
Ipopt 3.11.1: C:UsersAAnaconda3Librarybinipopt.exe: jacdim: got M = 0, N = 0, NO = 1
ERROR: Solver (ipopt) returned non-zero return code (1)
ERROR: See the solver log above for diagnostic information.
您遇到的问题是因为目标函数没有返回导致标量值的表达式(您可以通过检查model.obj.pprint()
的结果来看到这一点(。
像这样的东西可能会做你想做的事:
def myfunc(model, extra_param):
matrix_A=np.sin(np.random.rand(100,1)).flatten() + extra_param
return sum(matrix_A[i] * model.x[i] for i in model.IDX)
注意,我用(100,1)
更改了np.random.rand
函数中的(100,100)
部分,因为变量model.x
是一个向量。此外,.flatten()
方法会将阵列折叠为1-D。