from sage.numerical.optimize import find_fit
Capacitance = 1.080 # En Farad
Resistance = 50 # En Ohm
EMF = 10 # In Volt
MaxCurrent = EMF/Resistance
TimeConstant = Resistance*Capacitance
def GraphicalAnalysis(data, current=False):
LinearData = [(i, ln(abs(y))) for i, y in data]
mean = sum([i for i, y in LinearData])/(len(LinearData)-1)
k = (0.001/mean + 0.4/Resistance)*mean/Resistance if current else 0.001 # Uncertainty on measurement
Modif = lambda x: -k*x/150 + k
var('x, a, b')
model(x) = a*x+b
BestFit = find_fit(LinearData, model, solution_dict=True)
BestFunc = lambda x: BestFit[a]*x+BestFit[b]
MaxSlope = find_fit([(i, y+Modif(i)) for i, y in LinearData], model, solution_dict=True)[a]
MinSlope = find_fit([(i, y-Modif(i)) for i, y in LinearData], model, solution_dict=True)[a]
SlopeUncertainty = abs((MinSlope-MaxSlope)/2)
MaxOffset = find_fit([(i, y+k) for i, y in LinearData], model, solution_dict=True)[b]
MinOffset = find_fit([(i, y-k) for i, y in LinearData], model, solution_dict=True)[b]
OffsetUncertainty = abs((MinOffset-MaxOffset)/2)
MaxFunc = lambda x: MaxSlope*x+MaxOffset
MinFunc = lambda x: MinSlope*x+MinOffset
Plot = list_plot(LinearData) + plot(BestFunc, 0, 300, color='red') + plot(MaxFunc, 0, 300, color='red') + plot(MinFunc, 0, 300, color='red')
Uncertainties = {a: SlopeUncertainty, b: OffsetUncertainty}
return Plot, BestFit, Uncertainties
def GetData(file, current=False):
data = open(DATA+file)
data = data.read()
data = data.strip()
data = data.split('\n')
data = data[3:]
data = [i.split('\t') for i in data]
data = [(float(i[0]), float(i[1])) for i in data]
if current:
data = [(float(i[0]), float(i[1])/Resistance) for i in data]
return data
ExpectedPotentialChargeFunc = lambda x: EMF*(1-exp(-x/TimeConstant))
ExpectedCurrentChargeFunc = lambda x: MaxCurrent*exp(-x/TimeConstant)
ExpectedPotentialDischargeFunc = lambda x: EMF*exp(-x/TimeConstant)
ExpectedCurrentDischargeFunc = lambda x: -MaxCurrent*exp(-x/TimeConstant)