Python 优化自定义函数时使用Pyomo/Ipopt获得的错误

Python 优化自定义函数时使用Pyomo/Ipopt获得的错误,python,optimization,pyomo,Python,Optimization,Pyomo,我是Pyomo和Ipopt的新手。我想用这些工具优化一个非线性优化问题。我在尝试优化函数时出错 我一直在使用Pyomo提供的示例。我的问题的主要区别在于,我想在一个单独的函数中定义目标函数,并且它意味着与numpy数组的一些乘法,但我认为它们都可以用Pyomo来处理 我已经尽可能地简化了我的问题(当然,从优化的角度来看,这毫无意义,但它只是为了说明问题)。我的问题是: import numpy as np from pyomo.environ import * def myfunc(model

我是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:\Users\A\Anaconda3\Library\bin\ipopt.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)
更改了
(100100)
函数中的
(100100)
部分,因为变量
model.x
是一个向量。另外,
.flatte()
方法会将数组折叠成一维。

我不推荐在目标中使用随机数生成器。谢谢Erwin的评论。是的,从优化的角度来看,这确实没有意义(我用一些第三方数据替换随机矩阵只是为了简化问题)。但是,在目标函数中使用和不使用随机数生成器时,我得到了相同的错误。感谢您的评论,非常有用!事实上,当我简化我的问题时,我遇到了维度问题。对于我的实际问题,我需要矩阵A仍然是一个二维数组,因为目标函数是:obj=sum(vector1+vector2),其中每个向量都是通过乘法得到的,比如:vector1(dim n,dim 1)=(矩阵(dim n,dim)*model.x(dim,dim 1)**2(数组中每个元素的幂).与vector2相同,但使用不同的矩阵。我是否也应该尝试折叠为1D数组?很高兴这很有用。您的公式从数学角度来看是有意义的,但请小心,因为某些乘法的Pyomo表示法可能不同(例如,请参阅我的
return
语句与您的语句中的差异)。通常,检查一切是否正常的简单方法是在目标上使用
.pprint()
方法,并查看表达式是否存在实际表达式或其他需要更正的内容(例如Numpy数组)。