传递参数列表给SciPy fsolve函数

2024-09-24 02:21:07 发布

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

我有以下功能:

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和{}:

^{pr2}$

我不想为G定义一个单一的值,而是希望为ep和{}求解一个范围G值,例如G = [8, 10, 12]。当我传递G的值列表时,我得到一个关于用序列设置数组元素的错误。在

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


Tags: 功能列表def数组variablesf2f1ep
2条回答

如果我运行你的函数:

In [83]: ep1, uc1 = fsolve(equation1, [1, 500],args=(7.62, [8,10,12]))
...
ValueError: setting an array element with a sequence.

但是看看调用堆栈。很长,但这条线很显眼

^{pr2}$

它正在对你的函数进行测试调用。在

例如:

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元组传递给函数。它不遍历数组或列表。在

因此,您想要fsolve对于不同的G值,您必须自己进行迭代。fsolve(以及其他大多数scipy函数)不会为您完成此操作。在

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

from scipy.optimize import fsolve

def equation1(xy, G, d=7.62, 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


for G in [8, 10, 12]:
    ep1, uc1 = fsolve(equation1, [1, 500], (G, ))
    print(G, ep1, uc1)

在我的机器上显示:

^{pr2}$

相关问题 更多 >