6

I have a follow up question to the post written a couple days ago, thank you for the previous feedback:

Finding complex roots from set of non-linear equations in python

I have gotten the set non-linear equations set up in python now so that fsolve will handle the real and imaginary parts independently. However, there are still problems with the python "fsolve" converging to the correct solution. I have exactly the same inputs that are used in Matlab, and after double checking, the set of equations are exactly the same as well. Matlab, no matter how I set the initial values, will always converge to the correct solution. With python however, every initial condition produces a different result, and never the correct one. After a fraction of a second, the following warning appears with python:

/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/scipy/optimize/minpack.py:227: 
RuntimeWarning: The iteration is not making good progress, as measured by the 
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning) 

I was wondering if there are some known differences between the fsolve in python and Matlab, and if there are some known methods to optimize the performance in python.

Thank you very much

Community
  • 1
  • 1
rmsrms1987
  • 317
  • 1
  • 5
  • 11

1 Answers1

9

I don't think that you should rely on the fact that the names are the same. I see from your other question that you are specifying that Matlab's fsolve use the 'levenberg-marquardt' algorithm rather than the default. Python's scipy.optimize.fsolve uses MINPACK's hybrd algorithms. Levenberg-Marquardt finds roots approximately by minimizing the sum of squares of the function and is quite robust. It is not a true root-finding method like the default 'trust-region-dogleg' algorithm. I don't know how the hybrd schemes work, but they claim to be a modification of Powell's method.

If you want something similar to what you're doing in Matlab, I'd look for an optimization scheme that implements Levenberg-Marquardt, such as scipy.optimize.root, which you were also using in your previous question. Is there a reason why you're not using that?

horchler
  • 18,384
  • 4
  • 37
  • 73
  • 1
    Thank you for the feedback. Originally in my code, I did try the 'lm' method using the root function in scipy. Still however, the results were completely off. What I tried next was just to use the default numerical solver for fsolve in both python and matlab. After making that change, Matlab still performed well, while python didn't. So as of now, I am just a little lost for ideas. – rmsrms1987 Feb 19 '14 at 17:12
  • First can you get convergence if you specify the initial conditions as the the solution given by Matlab (or something close to that)? If not, then you may have a bug in your code. Since Levenberg-Marquardt works, you could try reformulating the problem as minimization of the sum of squares and use a method from [`scipy.optimize.minimize`](http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html) such as Nelder-Mead. – horchler Feb 19 '14 at 17:30
  • @rmsrms1987: Also, is it possible to specify or determine the Levenberg-Marquardt parameter that the `lm` method uses? Matlab uses a default of 0.01. – horchler Feb 19 '14 at 17:37
  • 1
    Thats a good suggestion, I didn't consider using the results from matlab in the python code. It turns out there is a bug in my code, since the solution did not converge in python. This will obviously need to be fixed. Thank you for the help. – rmsrms1987 Feb 19 '14 at 18:19
  • 1
    It turned out to be a minor fix :/ . Out of curiosity, how did you determine that Levenberg-Marquardt parameter in Matlab is 0.1? I will look for how this is done in python. – rmsrms1987 Feb 19 '14 at 19:08
  • 1
    @rmsrms1987: Good to hear. The default parameter is `0.01` and it specified right in the documentation's [Algorithm section](http://www.mathworks.com/help/optim/ug/fsolve.html#f653956). I notice that you didn't [accept](http://meta.stackoverflow.com/help/accepted-answer) the excellent answer given for your previous question (or any of your previous questions). If this answer and any others are helpful in solving your problems, [please make sure to accept them](http://meta.stackoverflow.com/help/someone-answers). – horchler Feb 19 '14 at 19:17
  • Thank you for the information. Sorry about not accepting the answers I just got the privileges to do this after my last post. – rmsrms1987 Feb 19 '14 at 19:33