views:

32

answers:

1

Hi,

Can anyone provide an example of providing a jacobian to a leastsq function in scipy? ( http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html#scipy.optimize.leastsq ) I can't figure out the method signature they want - they say it should be a function, yet it's very hard to figure out what input parameters in what order this function should accept. Thanks!

+2  A: 

Here's the exponential decay fitting that I got to work with this:

import numpy as np
from scipy.optimize import leastsq

def f(var,xs):
    return var[0]*np.exp(-var[1]*xs)+var[2]

def func(var, xs, ys):
    return f(var,xs) - ys

def dfunc(var,xs,ys):
    v = np.exp(-var[1]*xs)
    return [v,-var[0]*xs*v,np.ones(len(xs))]

xs = np.linspace(0,4,50)
ys = f([2.5,1.3,0.5],xs)
yn = ys + 0.2*np.random.normal(size=len(xs))
fit = leastsq(func,[10,10,10],args=(xs,yn),Dfun=dfunc,col_deriv=1)

If I wanted to use col_deriv=0, I think that I would have to basically take the transpose of what I return with dfunc. You're quite right though: the documentation on this isn't so great.

Justin Peel
It does work, yet ironically still fails on the example from my previous question :P okay, i probably should pick some other method
cheshire
because you p0 had the wrong sign...
tillsten
Yes, as tillsten said. Basically, it's the difference between fitting for exponential decay and exponential growth. That's a big difference. I think that you'll have to try some other method that uses the second derivative to have a chance of solving when you guess the wrong sign to start. It might need an additional momentum term of something like that too.
Justin Peel
right, i failed really bad. Thanks, that was awesome!
cheshire