尝试在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)
答案 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.
该对象由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)