【发布时间】:2016-03-07 22:46:43
【问题描述】:
我有一组 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
【问题讨论】:
-
我很抱歉计算的值很高,但我不想冒险给你错误的输入
-
尝试使用 Scipy 版本 >= 0.15.0。 (还有——
d的值是多少?) -
感谢您的评论。在第一个版本中,我将 d 称为 c 但我认为这会导致对变量的误解,但是我现在修复了它。最初我在 scipy 0.15.1 上运行它,但现在我将它更新到 scipy 0.16.1。结果是奇怪的 res 说它是 101 迭代步骤不成功,但获得的值是好的。
-
你解决了问题@pv。 ,我现在面对的是一个不同的人^^ 将其作为答案发布,以便我接受它
-
您的方程组可以手动求解 - 这些值与输出相比如何?通过检查,c[0] 确实是正确的。
标签: python python-3.x optimization scipy