![](/img/trans.png)
[英]how to solve non linear equation Pass two list of values to SciPy fsolve argument
[英]Pass list of values to SciPy fsolve argument
我有以下功能:
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
定义单个值外,我想针对范围G
值(例如G = [8, 10, 12]
uc
求解ep
和uc
。 当我传递G的值列表时,出现关于使用序列设置数组元素的错误。
是否可以在其中一个参数是值列表或值数组的地方使用fsolve
?
您可以将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)
这给了我的机器:
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
元组传递给您的函数。 它不会遍历数组或列表。
所以,你要fsolve
各种G
值,你必须自己做迭代。 fsolve
(以及其他大多数scipy
函数)将无法为您完成此任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.