我尝试使用SciPy.optimize.minimize最小化多变量函数。
我尝试了几种方法。 SLSQP似乎忽略了边界和/或约束。显然我的调用最小化有些问题,但我不确定是什么。
函数(在代码中称为f)太复杂了,无法在此描述。 我没有f的渐变,我也不知道形状。
import numpy as np
from scipy.optimize import minimize
....
# fields is an argument (list of strings)
indf1 = fields.index('f1')
indf2 = fields.index('f2')
methods=['Nelder-Mead','SLSQP','L-BFGS-B','COBYLA','Powell']
method_name = methods[1]
cons = ( {'type':'ineq','fun':lambda(x):np.array([x[indf1]])}, {'type':'ineq', 'fun':lambda(x):np.array([x[indf2]])})
bounds_pairs = [(None,None) for i in range(len(fields))]
bounds_pairs[indf1] = (float_info.epsilon,1)
bounds_pairs[indf2] = (float_info.epsilon,1)
minimize(f,np.array(initial_guess),method=method_name,bounds=bounds_pairs,jac=False,constraints=cons,tol=1e-12)
根据两个界限和缺点,字段f1和f2都应该是非负的。但是,这不起作用。
这是输出:
status: 4
success: False
njev: 2
nfev: 24
fun: 1000000000000.0
x: array([ 0.00000000e+00, -4.00000000e-04, -1.00005897e-04,
-6.09588623e-13, 1.00000014e-10])
message: 'Inequality constraints incompatible'
jac: array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
-6.71088639e+19, 0.00000000e+00, 0.00000000e+00])
nit: 3
当我打印出参数的值时,我可以看到负值赋值:
{'f4': 0.0, 'f1': 1.5001161208210954e-08, 'f3': -0.00010000589702911378, 'f2': -6.0958862304687526e-13, 'f5': -0.00040000000000000002}
这方面的任何线索?
* P.S:我之前发过一个类似的问题,但只得到了没有建设性和无关紧要的评论。