Scipy优化ValueError:变量太多无法取消

2024-04-29 12:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试在中使用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)

Tags: 方法importnprootoptimizevalueerrorr1q3
3条回答

看来优化.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编程了。你知道吗

您的示例无法运行,因为您没有指定mu2。你知道吗

阅读documentation for ^{}中的例子。同时读取由root返回的^{} 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)

为什么会出现错误

您得到这个错误是因为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,您可以从OptimizeResult对象中解压解决方案,即x


总而言之,你只需要:

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

相关问题 更多 >