scipy.optimize.最小化小数点后几位的更改值



这是我的优化代码。

initialGuess = D.Matrix[:,D.menge]
bnds = D.Matrix[:,(D.mengenMin,D.mengenMax)]
con1 = {'type': 'eq', 'fun': PercentSum} 
con2 = {'type': 'eq', 'fun': MinMaxProportion}
cons = ([con1,con2])
solution = minimize(rootfunc,initialGuess,method='SLSQP',
bounds=bnds,constraints=cons)

问题是,算法会在小数点后几位更改值。这是我最初的猜测。我已经尝试过从浮点转换为整数,以解决问题。

[  0.   0. 123.   0.   0. 622. 245.   0.   0.   0.]

优化器的第一次尝试如下:

[1.49011612e-08 0.00000000e+00 1.23000000e+02 0.00000000e+00
0.00000000e+00 6.22000000e+02 2.45000000e+02 0.00000000e+00
0.00000000e+00 0.00000000e+00]

另一个是:

[  0.           0.         123.00000001   0.           0.
622.         245.           0.           0.           0.        ]

最终优化完成时出现以下错误:

status 6
message Singular matrix C in LSQ subproblem

我认为问题在于细微的差别。是否有可能告诉SLSQP算法只尝试更改小数点后两位或更高的位置?

向致意

编辑:我找到了一个选项,但它不能解决我的问题。scipy.optimize.miminime的新调用:

solution = minimize(rootfunc,initialGuess,method='SLSQP',
bounds=bnds,constraints=con2,options={'eps':1,'disp':True})

这些"微小步骤"不是求解器在每次迭代中选择的值,它们来自有限差分。像这样的基于渐变的解算器需要渐变。由于您没有将梯度作为函数提供,因此它默认为使用有限差分为您计算梯度。正如错误所说,你真正的问题很可能是一个奇异矩阵。

最新更新