from scipy.optimize import curve_fit from numpy import linspace import numpy as np from numpy import tanh from scipy.constants import e, k from numpy import sqrt from numpy import array import pandas as pd # Global variables new_U = linspace(-22, 22, 1000) # Function for approximation def function_IU(U, I_n, T_e, A, B): return I_n * tanh(e*U/2/k/T_e) + A*U + B # Find the best fit params of In and Te def find_FitParams(data_I, data_U): popt, pcov = curve_fit(function_IU, data_U, data_I, p0=[0, 50000, 0, 0]) return popt, pcov # Returns disperancy of given value def discrepancy(data, popt): I = data[0] U = data[1] tmp = [] for i in range(len(U)): temp = sqrt((function_IU( U[i], *popt)-I[i])**2/len(U)/(len(U)-1)) tmp.append(temp) return tmp # Returns pandas.DataFrame with approximated Current and Voltage values def getApproxValues(data): data = data.sort_values(by=['U']) popt, pcov = find_FitParams(data['I'], data['U']) df = pd.DataFrame() df['U'] = new_U df['I'] = function_IU(df['U'], *popt) error = np.sqrt(np.diag(pcov)) return [df, popt, error]