优化没有成功。您可以看到解决方案报告失败...至少它知道它无法满足约束。
>>> result
array([5.61582806e-12, 3.56925226e-12, 3.57912934e-12, 3.57912933e-12,
3.57872619e-12])
>>> temp_func(result)
-1.0
>>> sol
fun: 8.270470124157974e-23
jac: array([1.49123928e-08, 1.49082997e-08, 1.49083195e-08, 1.49083195e-08,
1.49083186e-08])
message: 'Iteration limit exceeded'
nfev: 1697
nit: 101
njev: 101
status: 9
success: False
x: array([5.61582806e-12, 3.56925226e-12, 3.57912934e-12, 3.57912933e-12,
3.57872619e-12])
优化失败的原因是约束中的最大函数。顺序二次规划 https://en.wikipedia.org/wiki/Sequential_quadratic_programming基于线性化约束。在局部,(不满足的)约束线性化为一个常数值,因此迭代解决方案看不到任何方法来取得满足该约束的进展——每次迭代都会减少目标,而不会在解决方案方面取得进展。
我将约束更改为区域中不平坦,以允许算法逐步改进它并且优化成功。
def temp_func(X):
total = 0
for i in range(n):
val = total+X[i]*5 - 6
if val < 0:
val = np.arctan(val)
total = val
return total/n - 1
这可能是您实际上试图强制执行的约束,但也许您可以顺利地近似您的约束并获得成功。