Punov/Project/program_files/analize.py

57 lines
1.1 KiB
Python
Raw Permalink Normal View History

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]