Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing fsolve results in python and matlab

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

like image 455
rmsrms1987 Avatar asked Feb 19 '14 15:02

rmsrms1987


1 Answers

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?

like image 105
horchler Avatar answered Sep 17 '22 18:09

horchler