def get_params_global(data): # First curve fit a single experiment to get a decent # initial guess for the global fit # parms = (2.0e-9*1e-4, 9.0e-3/1e-4, 1.0, 1.0) #parms = 1e-7, 1e-3, -1000, 1000 parms = 1e-7, 1e-3, -3000, 3000 i = 1 pg, pcovg = curve_fit(lambda times, *p0: wvtr_vec_global( data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *p0), data[i].ts, data[i].js, p0=parms) # This is global fit using function above eg = lambda par: esq_global(par, data) pg2 = minimize(eg, pg, method='Nelder-Mead', tol=1.0e-4, options={ "maxfev": 100000, "maxiter": 100000 }) print "Global fitting residual: ", eg(pg2.x) return pg2.x
def esq_global(par, data): L = 0.0 for i in range(len(data)): fsim = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *par) L = L + np.sum((fsim - data[i].js)**2) return L * 1e12 # Scale so that it is O(1)
def lnlike(par, data): L = 0.0 for i in range(len(data)): fsim = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *par) inv_sigma2 = 1 / (data[i].sigma * data[i].sigma) L = L - 0.5 * np.sum((fsim - data[i].js)**2 * inv_sigma2) / len(fsim) return L
# # plt.plot(err) # # plt.show() # plt.plot(fsim) # plt.plot(data[i].js) # plt.show() # L = L - 0.5 * np.sum( (fsim - data[i].js)**2 * inv_sigma2) # # print "loglikelihood = ", L # # end explore likelihood computation # Plot out global and fits of fits for i in range(len(data)): ax = plt.subplot(nrows, ncols, i) thisfit_global_2step = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *pg_2step) thisfit_global = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *pg_1step) thisfit = wvtr_vec(data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *pfits[i]) ax = plt.subplot(nrows, ncols, i) l = ax.plot(data[i].ts, data[i].js, 'x') ax.plot(data[i].ts, data[i].js + 2 * data[i].sigma, '--g') ax.plot(data[i].ts, data[i].js - 2 * data[i].sigma, '--g') ax.plot(data[i].ts, thisfit_global_2step, '--r', lw=2) ax.plot(data[i].ts, thisfit_global, '--m', lw=2) ax.plot(data[i].ts, thisfit, '--b', lw=2)