我想要解决一组3个方程式。变量c [0],c [1],c [2]是成本函数,范围为-1到1.从我在网上发现的scipy优化是最好的方法。除了c [0]到c [3]之外,等式中的所有内容都是常数且已知。
0 = a + u * c [0]
0 = b + v * c [1] + w * c [2]
0 = d - n * c [1] + m * c [2]
我将其转化为以下优化问题,包含边界和约束,因此我需要SLSQP
c=np.array([])
def fun(c):
return abs(c[0])+abs(c[1])+abs(c[2])
x0 = [0.05,0.05,0.05]
bnds = [(-1.0,1.0),(-1.0,1.0),(-1.0,1.0)]
cons = ({'type': 'eq', 'fun': lambda c: a+u*c[0]},
{'type': 'eq', 'fun': lambda c: b+v*c[1]+w*c[2]},
{'type': 'eq', 'fun': lambda c: d-n*c[1]+m*c[2]},
)
res = minimize(fun, x0, method='SLSQP',
bounds=bnds,
constraints=cons)
我明白了:
status: 0
success: True
njev: 3
nfev: 15
fun: 33.015905119807698
x: array([ 1.04805004e-02, 1.01768804e+01, -2.28285442e+01])
message: 'Optimization terminated successfully.'
jac: array([ 1., 1., -1., 0.])
nit: 3
所以我的界限似乎被忽略了。翻译不平等的边界会产生相同的结果
计算的值是
a = -3943.3960306568406
b = 172710.8224501527
d = -380842.9800419506
u = 376260.28
v = 112878.084
w = 57886.196
n = -3205737.5856
m = 1412423.1824
答案 0 :(得分:0)
尝试使用Scipy版本> = 0.15.0。
在没有给出约束函数的jacobian的情况下,SLSQP例程在先前版本中存在已知错误。