我试图解决优化问题,但我正在优化函数的参数而不是函数。
这是一个例子
def Q(a,b,c):
d = integrate.quad(lambda x: (a*x**2+b*x+c), 0, 1)
return d
def u(a,b,c):
e = a+b+c
return e
cons = ({'type': 'eq',
'fun' : lambda u: np.array([u - 1]),}),
f = lambda x: Q(x[0],x[1],x[2])
res = minimize(Q, args=(3,), method='SLSQP', constraints=cons)
考虑到参数的限制,我想最小化功能积分Q.理想情况下,我也可以使约束成为一个整体。我没有把它包含在这里,因为我想从简单开始。
我得到的错误是
TypeError Traceback (most recent call last) <ipython-input-158-cdbd019dd886>
in <module>() 8 'fun' : lambda u: np.array([u - 1]),}), 9 f = lambda x:
Q(x[0],x[1],x[2]) ---> 10 res = minimize(Q, args=(3,), method='SLSQP',
constraints=cons) TypeError: minimize() takes at least 2 arguments (4 given)
应该说明的是,我并不担心我使用什么样的代码或编辑来实现这一点!只是想让它发挥作用。
答案 0 :(得分:3)
从基础开始:
minimize
需要初步猜测,x0。minimize
使用的参数是单个向量,而不是像a,b,c这样的三个变量。quad
返回两个数字的元组,其中第0个是积分而另一个是错误。 args
表示要提供给目标函数的其他(固定)参数,而不是其参数的数量。解决这些问题后,代码开始看起来不像现在的cargo-cult programming。
from scipy import integrate
from scipy.optimize import minimize
import numpy as np
def Q(u):
a, b, c = u
d = integrate.quad(lambda x: (a*x**2+b*x+c), 0, 1)
return d[0]
cons = ({'type': 'eq',
'fun' : lambda u: u[0]+u[1]+u[2]-1})
res = minimize(Q, x0 = (1, 2, 3), method='SLSQP', constraints=cons)
print(res)