def test_model_io(): # get example data data = np.genfromtxt('./data/exampleData.csv', delimiter=',') frequencies = data[:, 0] Z = data[:, 1] + 1j * data[:, 2] randles = CustomCircuit(initial_guess=[.01, .005, .1, .005, .1, .001, 200], circuit='R_0-p(R_1,C_1)-p(R_1,C_1)-W_1/W_2') randles.fit(frequencies, Z) print(randles) model_export(randles, './test_io.json') randles2 = model_import('./test_io.json') print(randles2) assert randles == randles2
def test_CustomCircuit(): initial_guess = [.01, .005, .1, .005, .1, .001, 200] custom_string = 'R0-p(R1,C1)-p(R2,C2)-W1' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string) # check get_param_names() print(custom_circuit.get_param_names()) assert custom_circuit.get_param_names() == \ ['R0', 'R1', 'C1', 'R2', 'C2', 'W1_0', 'W1_1'] # check _is_fit() assert not custom_circuit._is_fit() initial_guess = [.01, .005, .1] custom_string = 'R_0-p(R_1,C_1)' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string, name='Test') line = '\n-------------------------------\n' assert str(custom_circuit) == line + \ 'Circuit: Test\n' + \ 'Circuit string: R_0-p(R_1,C_1)\n' + \ 'Fit: False\n' + line + \ 'Initial guesses:\n' + \ '\tR_0 = 1.00e-02\n' + \ '\tR_1 = 5.00e-03\n' + \ '\tC_1 = 1.00e-01\n' # check that it rejects improper inputs # enforcing the length of initial_guess try: initial_guess = [.01, .005, .1, .005, .1, .001, 200] custom_string = 'R_0-p(R_1,E_1/E_2)-p(R_1,C_1)-W_1/W_2' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string) except (AssertionError): pass else: raise Exception('unhandled error occurred') return
def test_CustomCircuit(): initial_guess = [.01, .005, .1, .005, .1, .001, 200] custom_string = 'R0-p(R1,C1)-p(R2,C2)-W1' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string) # check get_param_names() full_names, all_units = custom_circuit.get_param_names() assert full_names == ['R0', 'R1', 'C1', 'R2', 'C2', 'W1_0', 'W1_1'] assert all_units == ['Ohm', 'Ohm', 'F', 'Ohm', 'F', 'Ohm', 'sec'] # check _is_fit() assert not custom_circuit._is_fit() initial_guess = [.01, .005, .1] custom_string = 'R0-p(R1,C1)' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string, name='Test') assert str(custom_circuit) == \ '\nName: Test\n' + \ 'Circuit string: R0-p(R1,C1)\n' + \ 'Fit: False\n' + \ '\nInitial guesses:\n' + \ ' R0 = 1.00e-02 [Ohm]\n' + \ ' R1 = 5.00e-03 [Ohm]\n' + \ ' C1 = 1.00e-01 [F]\n' # check that it rejects improper inputs # enforcing the length of initial_guess try: initial_guess = [.01, .005, .1, .005, .1, .001, 200] custom_string = 'R0-p(R1,E1)-p(R1,C1)-W1' custom_circuit = CustomCircuit(initial_guess=initial_guess, circuit=custom_string) except (AssertionError): pass else: raise Exception('unhandled error occurred') return
def get_fitting_data(data, model, guess): if model == "randles": circuit = Randles(initial_guess=guess) else: # circuit = Randles(initial_guess=[.01, .005, .1, .001, 200]) circuit = CustomCircuit(initial_guess=guess, circuit=model) columns = ['freq/Hz', 'Re(Z)/Ohm', '-Im(Z)/Ohm'] frequencies = data["freq/Hz"].values Z = data['Re(Z)/Ohm'].values - 1j * data['-Im(Z)/Ohm'].values instance_of_impedance_lib = circuit.fit(frequencies, Z) print(instance_of_impedance_lib) param_names = instance_of_impedance_lib.get_param_names() param_values = instance_of_impedance_lib.parameters_ param_error = instance_of_impedance_lib.conf_ # f_pred = np.logspace(5, -2) circuit_fit = circuit.predict(frequencies) return circuit_fit, param_names, param_values, param_error
if n == 000: break if n != 0: # READ EXPERIM ENT data = np.genfromtxt('Impedance -' + str(n) + '.z', skip_header=123, delimiter='') data = data[:52] frequencies = data[:, 0] Z = data[:, 4] + 1j * data[:, 5] frequencies = frequencies[np.imag(Z) < 0] Z = Z[np.imag(Z) < 0] ############## FIG. B circuitB = 'R0-p(E, R1-p(C1,R2,W1))' initial_guessB = [1, 1, 1, 1000, 1, 100, 1, 1] circuitB = CustomCircuit(circuitB, initial_guess=initial_guessB) circuitB.fit(frequencies, Z) circuitB.parameters_ print("Схема Б", circuitB) P = [ -1 * n, m.log10(circuitB.parameters_[3]), m.log10(circuitB.parameters_[4]), m.log10(circuitB.parameters_[5]) ] # ФИТТИНГ Z_fitB = circuitB.predict(frequencies) # Погрешность res_meas_real = (Z - circuitB.predict(frequencies)).real / np.abs(Z) res_meas_imag = (Z - circuitB.predict(frequencies)).imag / np.abs(Z) # ploting
#while measuring the EIS we do not want flow actions.pump_off() time.sleep(2) eis_exp = actions.eis(start_freq, end_freq, points, blockd=blockd) Zreal, Zimag, Zfreq = eis_exp['data'] Z = np.array(Zreal) + 1j * np.array(Zimag) frequencies = np.array(Zfreq) #do both a randles and custom fit and check which one works better randles = Randles(initial_guess=[.01, .005, .1, .001, 200]) RRC = CustomCircuit(circuit='R0-p(R1,C1)', initial_guess=[ np.percentile(Z.real, 5), np.percentile(Z.real, 95), 10**-5 ]) #fit them res_randles = randles.fit(frequencies, Z) res_rrc = RRC.fit(frequencies, Z) exp_results[sno] = { 'pulse_params': { 'centers': centers, 'pots': pots, 'widths': widths }, 'eis_params': { 'start_freq': start_freq,
del connection pstat.SetCell(GamryCOM.CellOff) pstat.Close() import matplotlib.pyplot as plt plt.scatter(np.array(Zreal),-np.array(Zimag),c=np.log(Zfreq)) plt.colorbar() plt.axis('equal') plt.show() from impedance.circuits import CustomCircuit frequencies = np.array(Zfreq) Z = np.array(Zreal)+1j*np.array(Zimag) circuit = 'R0-p(R1,C1)' guess = [np.min(Z.real),np.max(Z.real),10**-6] circuit_mod = CustomCircuit(circuit,initial_guess=guess) circuit_mod.fit(frequencies, Z) Z_fit = circuit_mod.predict(frequencies) import matplotlib.pyplot as plt from impedance.plotting import plot_nyquist fig, ax = plt.subplots() plot_nyquist(ax, frequencies, Z, fmt='o') plot_nyquist(ax, frequencies, Z_fit, fmt='-') plt.legend(['Data', 'Fit']) plt.show()