Fre = float(fields[0]) if Fre >= FreqLB and Fre <= FreqUB: F=F+[float(fields[0])] R=R+[float(fields[1])] Im=Im+[float(fields[2])] thetas=thetas+[numpy.arctan(float(fields[2])/float(fields[1]))] #Form data into complex array FArr=numpy.array(F) RArr=numpy.array(R) ImArr=numpy.array(Im)*1j TotArr=RArr+ImArr #Fit the data fit_result, ParamNames = fit.custom_fitting(F, TotArr, params) Fitted_variables = fit_result.x #Obtain the residuals residuals = fit.res_vec( Fitted_variables, FArr, TotArr) #Bootstrap to get error and generate final model boot_params, corr = boot.strap(residuals, FArr, TotArr, Fitted_variables, ParamNames) result = cir.Z(boot_params, FArr, modelname) boot_generation = result.z Real_Boot_Fit = boot_generation.real Imag_Boot_Fit = boot_generation.imag Thetas_Fit = [] i=0 for x in Real_Boot_Fit: theta = numpy.arctan(Imag_Boot_Fit[i]/Real_Boot_Fit[i])
def strap(residuals, FArr, ZArr, params, ParamNames): #Break apart complex array of original residuals length = int(len(residuals) / 2) Real_residuals = residuals[0:length] Imag_residuals = residuals[length:] #Break apart original complex array RArr = ZArr.real ImArr = ZArr.imag Modulus = numpy.sqrt(RArr**2 + ImArr**2) #Obtain the Statistical parameters of the Residuals from original fitting (Needed input = Real + Imaginary Residuals) Real_res_error = statistics.stdev(Real_residuals) Imag_res_error = statistics.stdev(Imag_residuals) Real_res_mean = statistics.mean(Real_residuals) Imag_res_mean = statistics.mean(Imag_residuals) #Initialize iterator i = 0 #Initilize Matrix to carry disributions of fitted variables Fitted_Variables_Matrix = [] #Initialize Parameters list global Param_names #Main Bootstrap. Fitting to be performed x times in i<x while i < 50: #Generate a new set of residuals based on the statistics acquired above. Boot_R_residuals = numpy.random.normal( Real_res_mean, Real_res_error, size=length) * Modulus Boot_i_residuals = numpy.random.normal( Imag_res_mean, Imag_res_error, size=length) * Modulus #Generate a new data set based on these residuals (Requires original impedance data) new_r_boot = RArr + Boot_R_residuals new_i_boot = ImArr + Boot_i_residuals total_boot = new_r_boot + 1j * new_i_boot #Check simulated impedance (uncomment to check boots) #plt.plot(new_r_boot, -new_i_boot) #plt.savefig("boots.png") #Perform a fit on newly generated data (Requires parameter guesss) fit_result, pn = fit.custom_fitting(FArr, total_boot, params) #Generate a list of variables from fit Fitted_variables = list(fit_result.x) Fitted_Variables_Matrix.append(Fitted_variables) i = i + 1 Param_names = pn Fitted_Variables_Matrix = pd.DataFrame(Fitted_Variables_Matrix, columns=ParamNames) Correlation_Matrix = Fitted_Variables_Matrix.corr() #Take the standard deviation of each of the fitted variables distributions Stds = Fitted_Variables_Matrix.std(axis=0) #Take the average fit means = Fitted_Variables_Matrix.mean(axis=0) #Compile all of the fitted variables errors into a single list evz = list(Stds) ms = list(means) #Compile and save these results to a csv Params = list(zip(Param_names, ms, evz)) Paramsdf = pd.DataFrame(data=Params, columns=['Parameters', 'Value', 'Error']) Paramsdf.to_csv('Fitted_Parameters.csv', index=False) #Clear figure at end of program plt.clf() #Return Fitted Params return ms, Correlation_Matrix