Scipy Optimize ValueError:太多变量无法解包

时间:2019-08-05 10:22:59

标签: python numpy scipy

尝试在scipy.optimize中使用root方法,但一直出现ValueError,尽管对我来说似乎输入了正确数量的变量。

import numpy as np
from scipy import optimize
earthpos=np.array([  1.50000000e+11,   0.00000000e+00,   0.00000000e+00])

def equations(p,qf):
    q1, q2, q3, q4 = p
    r1=np.sqrt((qf[0]-mu2)**2+qf[1]**2+qf[2]**2)
    return q1**2-q2**2-q3**2+q4**2-qf[0]+mu2, 2*q1*q2-2*q3*q4-qf[1], 2*q1*q3+2*q2*q4-qf[2], q1**2+q2**2+q3**2+q4**2-r1

q1, q2, q3, q4 = optimize.root(equations, (1,1,1,1),earthpos)

礼物:

 ValueError: too many values to unpack (expected 4)

3 个答案:

答案 0 :(得分:1)

为什么会出现错误

您会收到错误消息,因为optimize.root()返回了scipy优化结果。 输入type(optimize.root(equations, (1,1,1,1),earthpos))并查看输出。

如何解决和解压缩优化解决方案

替换最后

q1, q2, q3, q4 = optimize.root(equations, (1,1,1,1),earthpos)

q1, q2, q3, q4 = optimize.root(equations, (1,1,1,1),earthpos).x

最后使用.x,您可以从x对象中打开解决方案,即OptimizeResult


将所有内容放在一起,您只需要以下内容:

import numpy as np
from scipy import optimize
earthpos=np.array([  1.50000000e+11,   0.00000000e+00,   0.00000000e+00])

def equations(p,qf):
    q1, q2, q3, q4 = p
    r1=np.sqrt((qf[0]-mu2)**2+qf[1]**2+qf[2]**2)
    return q1**2-q2**2-q3**2+q4**2-qf[0]+mu2, 2*q1*q2-2*q3*q4-qf[1], 2*q1*q3+2*q2*q4-qf[2], q1**2+q2**2+q3**2+q4**2-r1

q1, q2, q3, q4 = optimize.root(equations, (1,1,1,1),earthpos).x

答案 1 :(得分:0)

似乎optimize.root返回一个OptimizeResult对象:

Returns:
solOptimizeResult:
The solution represented as a OptimizeResult object. Important attributes are: x the solution array, success a Boolean flag indicating if the algorithm exited successfully and message which describes the cause of the termination. See OptimizeResult for a description of other attributes.

参见此处:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.OptimizeResult.html#scipy.optimize.OptimizeResult

该对象由4个以上的字段组成,您要查找的字段是第一个字段,所以也许optimize.root(equations, (1,1,1,1),earthpos)[0]可以工作?很抱歉,如果这行不通,因为我已经用Python编程了很长时间了。

答案 2 :(得分:0)

您的示例无法运行,因为您未指定mu2

阅读documentation for root中的示例。还要读取root返回的OptimizeResult object的属性,正如Abs指出的那样,optimize.root返回一个对象,但是必须使用该对象的x属性访问解决方案。

您想做类似的事情(我用过mu2=1):

import numpy as np
from scipy import optimize
mu2 = 1
earthpos=np.array([  1.50000000e+11,   0.00000000e+00,   0.00000000e+00])
def equations(p,qf):
    q1, q2, q3, q4 = p
    r1=np.sqrt((qf[0]-mu2)**2+qf[1]**2+qf[2]**2)
    return q1**2-q2**2-q3**2+q4**2-qf[0]+mu2, 2*q1*q2-2*q3*q4-qf[1], 2*q1*q3+2*q2*q4-qf[2], q1**2+q2**2+q3**2+q4**2-r1
sol = optimize.root(equations, (1,1,1,1),earthpos)
q1, q2, q3, q4 = sol.x
print(q1)