当您求解方程组时,如何将参数传递给fsolve?例如:
from scipy.optimize import fsolve
def equations(x,y,a,b):
return(x+y+a+b,x-y-a-b)
x,y = fsolve(equations,[0,0],args=(1,2))
我得到:
TypeError:equations()恰好接受4个参数(给定3个参数)
在这种情况下如何传递参数?
答案 0 :(得分:0)
scipy.optimize.fsolve(func, x0, args=(), fprime=None, ...
func
:callable f(x, *args)
至少需要一个(可能是向量)参数的函数。
该函数的输入变量必须组合为一个列表/向量/数组/元组:
def equations(z,a,b):
# z[0] = x, z[1] = y
return(z[0]+z[1]+a+b,z[0]-z[1]-a-b)
x,y = fsolve(equations,[0,0],args=(1,2))
答案 1 :(得分:0)
from scipy.optimize import fsolve
def equations(x0,a,b):
x = x0['x']
y = x0['y']
return(x+y+a+b,x-y-a-b)
x,y = fsolve(equations,x0={x:0,y:0},args=(1,2))
答案 2 :(得分:0)
我个人更喜欢在args
中使用fsolve
参数的另一种方法是创建一个可调用:
class Equations:
def __init__(self, a, b):
self.a, self.b = a, b
def __call__(self, x):
return # code
一种更脏但有效的方法是使用闭包:
def Equations(a, b):
def compute(x):
return # code
return compute
然后,在两种情况下,
solution = fsolve(Equations(1, 2), [0,0])
答案 3 :(得分:0)
我怀疑这与传递args
和具有多个需要优化的输入(即x
和y
)有关。 fsolve
的{{3}}建议将第一个参数设为向量。当我在计算机上尝试您的示例时,我看到了一个不同但相似的错误:
In [3]: from scipy.optimize import fsolve
In [4]: def equations(x, y, a, b):
...: return (x+y+a+b, x-y-a-b)
...:
In [5]: fsolve(equations, [0, 0], args=(1, 2))
导致
TypeError:equations()缺少1个必需的位置参数:“ b”
支持我最初的假设。
的修改版In [6]: def equations2(xy, a, b):
...: x, y = xy
...: return (x+y+a+b, x-y-a-b)
...:
In [7]: fsolve(equations2, [0, 0], args=(1, 2))
Out[7]: array([ 1.05443151e-16, -3.00000000e+00])
因此,解决方案归结为将x和y组合为元组向量。