[SciPy-user] Cannot get optimize.fmin_bfgs to work

Williamson, Ross Ross.Williamson at usap.gov
Tue Mar 3 04:15:08 EST 2009


Hi All

I'm trying to get optimize.fmin_bfgs to work with no luck - I have an x,y array of numbers (about 100) to which I'm trying to fit a curve to. Both the auto fprime calculator and my own Jacbian do not work:

ValueError: setting an array element with a sequence.

I'm presuming I'm doing something really silly but I cannot find a simple example on the web (The one using the Rosenbrock function does not help).

The reason for doing this is that I want to progress to the bounded version of this function as leastsq works (but does not allow for bounded data).

Please find code below:

from numpy import zeros
from scipy import optimize
def fitfunc(p, x):
   
   a_white = p[0]
   a_pink = p[1]
   a_red = p[2]
   a_phot = p[3]
   fk = p[4]  # photon_noise roll-off ~ 11.4 Hz mean 2008 season 
   alpha2 = p[5]
   
   #result = wlevel*(1.+(f_knee/x)^alpha)
   result = a_white + a_pink * x ** (-1.0) + a_red * x ** (-1.0 * alpha2) + a_phot / (1. + x ** 2 / fk ** 2)

   return result

def fitgrad(p,x,y,err):
   #Calculate Jacobian
   J = zeros(len(p),float)
   J[0] = 1.0
   J[1] = 1.0/x
   J[2] = x ** (-1.0 * alpha2)
   J[3] = 1.0/(1. + x ** 2 / fk ** 2)
   J[4] = (2 * a_phot * x**2)/(fk**3 * ((x**2/a_phot**2) + 1)**2)
   J[5] = a_red * x **(-1.0* alpha2) * log(x)
   
   return J

def errorfunc(p,x,y,err):
    err_r = (y-fitfunc(p,x))/err
    print err_r
    return err_r

def test(x,y,noise):

    pinit = [0.00125645, 0.00062822510, 0.00062822510,0.00062822510, 11.0, 2.0]

    out = optimize.leastsq(errorfunc,pinit,args=(x,y,noise), full_output=1)
    out2 = optimize.fmin_bfgs(errorfunc,pinit,fprime=fitgrad,args=(x,y,noise))
    print out[0]
    print out[1]

    return out




More information about the SciPy-User mailing list