Python 将值列表传递给SciPy fsolve参数

Python 将值列表传递给SciPy fsolve参数,python,python-3.x,scipy,Python,Python 3.x,Scipy,我有以下功能: def equation1(xy, d=7.62, G=8.2728, rhop=7.51, ut=399): ep, uc = xy # define variables g = 981 # acceleration due to gravity, cm/s^2 f1 = 2*g*d*((ep**-4.7) - 1) - 0.01*(uc/ep - ut)**2 f2 = G - (uc/ep - ut)*rhop*(1

我有以下功能:

def equation1(xy, d=7.62, G=8.2728, rhop=7.51, ut=399):
    ep, uc = xy     # define variables
    g = 981         # acceleration due to gravity, cm/s^2

    f1 = 2*g*d*((ep**-4.7) - 1) - 0.01*(uc/ep - ut)**2
    f2 = G - (uc/ep - ut)*rhop*(1 - ep)
    return f1, f2
其中,我通过在SciPy中使用
fsolve
求解
ep
uc

ep1, uc1 = fsolve(equation1, [1, 500])
我不想为
G
定义一个值,而是想为
ep
uc
求解
G
值等范围的
G=[8,10,12]
。当我为G传递一个值列表时,我得到了一个关于使用序列设置数组元素的错误


如果其中一个参数是值的列表或数组,是否可以使用
fsolve

您可以将
G
作为
equation1
的参数,并通过
fsolve
传递它(使用其
args
参数),如下所示:

这在我的机器上提供:

8 0.994582431487 592.401268397
10 0.993718674117 607.148953105
12 0.992912345764 620.018209488

您可以将
G
作为参数保留到
equation1
,并通过
fsolve
(使用其
args
参数)将其传递为:

这在我的机器上提供:

8 0.994582431487 592.401268397
10 0.993718674117 607.148953105
12 0.992912345764 620.018209488

如果我使用以下命令运行函数:

In [83]: ep1, uc1 = fsolve(equation1, [1, 500],args=(7.62, [8,10,12]))
...
ValueError: setting an array element with a sequence.
但是看看调用堆栈。很长,但这条线很突出

res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
它正在对您的函数进行测试调用

例如:

In [121]: x0=np.array([1,500])
In [122]: numinputs=2
In [123]: args = (1,8)     # scalar G
In [124]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
Out[124]: array([-102.01,    8.  ])

In [125]: args = (1,[8,10])    # list G
In [126]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
....
ValueError: setting an array element with a sequence.
具体查看函数生成的内容:

In [127]: equation1(*((x0[:numinputs],) + args))
Out[127]: (-102.01000000000001, array([  8.,  10.]))
它无法将此元组转换为有效的1d数组,因此会显示错误消息

请注意,函数的参数包括:

In [128]: ((x0[:numinputs],) + args)
Out[128]: (array([  1, 500]), 1, [8, 10])
fsolve
将整个
args
元组传递给函数。它不会遍历数组或列表


因此,对于各种
G
值,您需要
fsolve
,您必须自己进行迭代
fsolve
(以及大多数其他
scipy
函数)不会为您执行此操作。

如果我使用以下选项运行您的函数:

In [83]: ep1, uc1 = fsolve(equation1, [1, 500],args=(7.62, [8,10,12]))
...
ValueError: setting an array element with a sequence.
但是看看调用堆栈。很长,但这条线很突出

res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
它正在对您的函数进行测试调用

例如:

In [121]: x0=np.array([1,500])
In [122]: numinputs=2
In [123]: args = (1,8)     # scalar G
In [124]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
Out[124]: array([-102.01,    8.  ])

In [125]: args = (1,[8,10])    # list G
In [126]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
....
ValueError: setting an array element with a sequence.
具体查看函数生成的内容:

In [127]: equation1(*((x0[:numinputs],) + args))
Out[127]: (-102.01000000000001, array([  8.,  10.]))
它无法将此元组转换为有效的1d数组,因此会显示错误消息

请注意,函数的参数包括:

In [128]: ((x0[:numinputs],) + args)
Out[128]: (array([  1, 500]), 1, [8, 10])
fsolve
将整个
args
元组传递给函数。它不会遍历数组或列表


因此,对于各种
G
值,您需要
fsolve
,您必须自己进行迭代
fsolve
(以及大多数其他
scipy
函数)不会为您执行此操作。

是否要为
G
的每个值解算
ep、uc
?在这种情况下,您必须循环这些值,并为每种情况调用
fsolve
。@AndrasDeak是的,我要为
G
的每个值求解
ep,uc
。是否要为
G
的每个值求解
ep,uc
?在这种情况下,您必须循环这些值,并为每种情况调用
fsolve
。@AndrasDeak是的,我想为
ep,uc
G
的每个值求解。是否需要在元组内传递
G
?由于for循环在每次迭代中传递一个值,似乎一个参数不需要元组。@摆动传递也可以,我使用元组只是为了说明在哪里需要插入可能的附加参数…谢谢你的帮助,你的答案正是我想要的。是否需要在元组中传递
G
?由于for循环在每次迭代中传递一个值,似乎一个参数不需要元组。@摆动传递也可以,我使用元组只是为了显示在哪里需要插入可能的附加参数…谢谢你的帮助,你的答案就是我想要的。