Python fsolve() complains about shape. Why?

后端 未结 2 1482
小鲜肉
小鲜肉 2020-12-20 05:39

Having the function f(x,y,z), I need to solve the restriction f(x,y,z) = 0 and then plot it. I tried to find for each pair (y,z) the value x for which f(x,y,z) = 0:

相关标签:
2条回答
  • 2020-12-20 06:31

    fsolve expects the x argument and the return value of func to be a scalar or one-dimensional array. You'll have to modify your code to work with flattened x values. E.g.

    def func(x, y, z):
        x = x.reshape(y.size, z.size)
        return (x + y + z).ravel()
    

    and something like this for the call to fsolve:

    sol, info, ier, mesg = fsolve(func, x0.ravel(), args=yz, full_output=True)
    x = sol.reshape(y.size, z.size)
    
    0 讨论(0)
  • 2020-12-20 06:34

    Here's a comparison to the krylov method advertized in the scipy.optimize tutorial:

    from numpy import linspace, zeros, newaxis
    import time
    from scipy.optimize import root
    
    def func(x,y,z):
        x = x.reshape(y.size, z.size)
        f = x + y + z
        f = f.ravel()
        return f
    
    n = 50
    y = linspace(0,1,n)
    z = linspace(0,1,n)
    x0 = zeros((y.size,z.size)) + 0.5 # the initial guess
    yz = (y[:,newaxis],z[newaxis,:]) # the other parameters
    
    start = time.time()
    sol1 = root(func, x0.ravel(), args=yz, method='hybr', tol=1e-7)  # same as fsolve
    x1 = sol1.x.reshape(y.size, z.size)
    print("(fsolve) time taken (sec): %g" % (time.time() - start,))
    print("(fsolve) successful: %r (%s)" % (sol1.success, sol1.message))
    print("(fsolve) max error: %g" % (abs(func(x1, *yz)).max(),))
    
    start = time.time()
    sol2 = root(func, x0.ravel(), args=yz, method='krylov', tol=1e-9)
    x2 = sol2.x.reshape(y.size, z.size)
    print("(krylov) time taken (sec): %g" % (time.time() - start,))
    print("(krylov) successful: %r (%s)" % (sol2.success, sol2.message))
    print("(krylov) max error: %g" % (abs(func(x2, *yz)).max(),))
    

    Prints

    (fsolve) time taken (sec): 26.9296
    (fsolve) successful: False (The iteration is not making good progress, as measured by the 
      improvement from the last ten iterations.)
    (fsolve) max error: 1.52656e-16
    (krylov) time taken (sec): 0.0173709
    (krylov) successful: True (A solution was found at the specified tolerance.)
    (krylov) max error: 1.11022e-16
    
    0 讨论(0)
提交回复
热议问题