SciPy LeastSq Dfun Usage
Question: I'm trying to get my Jacobian to work with SciPy's Optimize library's leastsq
function.

I have the following code:

    
    
    #!/usr/bin/python
    import scipy
    import numpy
    from scipy.optimize import leastsq
    
    #Define real coefficients
    p_real=[3,5,1]
    
    #Define functions
    def func(p, x):         #Function
        return p[0]*numpy.exp(-p[1]*x)+p[2]
    
    def dfunc(p, x, y):     #Derivative
        return [numpy.exp(-p[1]*x),-x*p[0]*numpy.exp(-p[1]*x), numpy.ones(len(x))]
    
    def residuals(p, x, y):
        return y-func(p, x)
    
    #Generate messy data
    x_vals=numpy.linspace(0,10,30)
    y_vals=func(p_real,x_vals)
    y_messy=y_vals+numpy.random.normal(size=len(y_vals))
    
    #Fit
    plsq,cov,infodict,mesg,ier=leastsq(residuals, [10,10,10], args=(x_vals, y_vals), Dfun=dfunc, col_deriv=1, full_output=True)
    
    print plsq
    

Now, when I run this, I get `plsq=[10,10,10]` as my return. When I take out
`Dfun=dfunc, col_deriv=1`, then I get something close to `p_real`.

Can anyone tell me what gives? Or point out a better source of documentation
than what SciPy provides?

Incidentally, I'm using the Jacobian because I have the (perhaps misguided)
belief that it will lead to faster convergence.


Answer: Change `residuals` to its negative:

    
    
    def residuals(p, x, y):
        return func(p, x)-y
    

and you get

    
    
    [ 3.  5.  1.]
    

Hope this helps :)

