1 year ago

#280901

test-img

joshp

LMFIT not properly fitting where scipy does with same starting parameter values

I have a complicated curve fitting function:

def corr_function(tau: np.ndarray, BG: float, avg_C: float, vz: float):
    wxc = 8.3
    wy = 2.5
    wz = 3.35
    D = 4.4e1 
    return 1/((math.pi)**(3/2)*wxc*wy*wz*avg_C)*(1 + 4*D*tau/(wxc**2))**(-1/2)*(1 + 4*D*tau/(wy**2))**(-1/2)*(1 + 4*D*tau/(wz**2))**(-1/2)*np.exp(-((vz*tau)**2/(wz**2 + 4*D*tau))) + BG

I tried to fit this with scipy:

popt, pcov = curve_fit(corr_function, tau, corr, [0, 1e-12, 2e5])

and lmfit

model = Model(corr_function, independent_vars=['tau'])
result = model.fit(
   corr,
   tau=tau,
   BG=Parameter('BG', value=0, min=0),
   avg_C=Parameter('avg_C', value=1e-12, min=0),
   vz=Parameter('vz', value=2e5, min=0),
)

And while the scipy converges to a proper answer (blue), the lmfit doesn't (orange), where lmfit parameters don't change really at all during fitting

[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 61
    # data points      = 400
    # variables        = 3
    chi-square         = 1.5370e+12
    reduced chi-square = 3.8714e+09
    Akaike info crit   = 8833.74620
    Bayesian info crit = 8845.72059
##  Warning: uncertainties could not be estimated:
    BG_guess:     at boundary
    avg_C_guess:  at initial value
    avg_C_guess:  at boundary
[[Variables]]
    BG:     0.00000000 (init = 0)
    avg_C:  3.9999e-12 (init = 4e-12)
    vz:     8831416.63 (init = 200000)

I think I need lmfit to sample a larger parameter space (or more iterations), anyone know how to do this?

graph comparison

Also, note, I need to the input parameters to be static (can't bring them closer to proper fit), as I'll need to automate fitting for large parameter spaces

python

scipy

curve-fitting

lmfit

0 Answers

Your Answer

Accepted video resources