求解方程组时将参数传递给fsolve

时间:2019-02-25 15:21:07

标签: python

当您求解方程组时,如何将参数传递给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个参数)

在这种情况下如何传递参数?

4 个答案:

答案 0 :(得分:0)

来自documentation

scipy.optimize.fsolve(func, x0, args=(), fprime=None, ...
     
      
  • funccallable 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和具有多个需要优化的输入(即xy)有关。 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组合为元组向量