# -*- coding: utf-8 -*- import os import numpy as np import DTAutil from scipy.optimize import curve_fit def do_fit(x,y,xmin,xmax, func = DTAutil.flin): xf = [] yf = [] for i in range(len(x)): if(xmin <= x[i] <= xmax): xf.append(x[i]) yf.append(y[i]) return curve_fit(func, xf, yf) def fitfutes(meas, ranges): params, covs = do_fit(meas.x, meas.T1, ranges[0], ranges[1]) print("\nElőszakasz illesztése, x["+str(ranges[0])+"; "+str(ranges[1])+"], y = p0*x + p1") meas.log("\nElőszakasz illesztése, x["+str(ranges[0])+"; "+str(ranges[1])+"], y = p0*x + p1") meas.fitreport(params, covs) meas.bMp1 = True meas.mp1_a = params[0] meas.mp1_b = params[1] meas.mp1_start = ranges[0] meas.mp1_end = ranges[1] perr = np.sqrt(np.diag(covs)) meas.Dmp1_a = perr[0] meas.Dmp1_b = perr[1] # futes megillesztve, ha volt max akkor azt torol meas.bMaxT1 = False def fitatalakulas(meas, ranges): params, covs = do_fit(meas.x, meas.T1, ranges[0], ranges[1]) print("\nÁtalakulási szakasz illesztése, x["+str(ranges[0])+"; "+str(ranges[1])+"], y = p0*x + p1") meas.log("\nÁtalakulási szakasz illesztése, x["+str(ranges[0])+"; "+str(ranges[1])+"], y = p0*x + p1") meas.fitreport(params, covs) meas.bMp2 = True meas.mp2_a = params[0] meas.mp2_b = params[1] meas.mp2_start = ranges[0] meas.mp2_end = ranges[1] perr = np.sqrt(np.diag(covs)) meas.Dmp2_a = perr[0] meas.Dmp2_b = perr[1] def intersection(meas): meas.bTmp = True meas.Tmp_x = (meas.mp1_b - meas.mp2_b)/(meas.mp2_a - meas.mp1_a) meas.Tmp = meas.mp1_a * meas.Tmp_x + meas.mp1_b print("Metszéspont: "+str(meas.Tmp)+" C") meas.log("Metszéspont: "+str(meas.Tmp)+" C") def fitbase(meas, ranges): meas.base_start = ranges[0] meas.base_end = ranges[3] fitx = [] fity = [] for i in range(len(meas.x)): if (ranges[0] <= meas.x[i] <= ranges[1]) or (ranges[2] <= meas.x[i] <= ranges[3]): fitx.append(meas.x[i]) fity.append(meas.dT[i]) meas.base_start = fitx[0] meas.base_end = fitx[-1] params, covs = curve_fit(DTAutil.flin, fitx, fity) print("Alapvonal illesztése, x["+str(ranges[0])+", "+str(ranges[1])+" ; "+str(ranges[2])+", "+str(ranges[3])+"], y = p0*x + p1") meas.log("\nAlapvonal illesztése, x["+str(ranges[0])+", "+str(ranges[1])+" ; "+str(ranges[2])+", "+str(ranges[3])+"], y = p0*x + p1") meas.fitreport(params, covs) meas.base_a = params[0] meas.base_b = params[1] perr = np.sqrt(np.diag(covs)) meas.Dbase_a = perr[0] meas.Dbase_b = perr[1] meas.bBase = True # also new base was fitted, require new difference meas.bDiff = False meas.bComplexBase = False def fitComplexBase(meas, ranges): # fit base with spline in middle meas.base_start = ranges[0] meas.base_end = ranges[1] meas.baseUp_start = ranges[2] meas.baseUp_end = ranges[3] fitx1 = [] fity1 = [] fitx2 = [] fity2 = [] fitspl_x = [] fitspl_y = [] for i in range(len(meas.x)): if ranges[0] <= meas.x[i] <= ranges[1] : fitx1.append(meas.x[i]) fity1.append(meas.dT[i]) if ranges[1] - 20 <= meas.x[i] <= ranges[1]: fitspl_x.append(meas.x[i]) fitspl_y.append(meas.dT[i]) if ranges[2] <= meas.x[i] <= ranges[3] : fitx2.append(meas.x[i]) fity2.append(meas.dT[i]) if ranges[3] <= meas.x[i] <= ranges[3] +20: fitspl_x.append(meas.x[i]) fitspl_y.append(meas.dT[i]) params, covs = curve_fit(DTAutil.flin, fitx1, fity1) meas.log("\nAlapvonal illesztése 1, x["+str(ranges[0])+"; "+str(ranges[1])+"], y = p0*x + p1") meas.fitreport(params, covs) meas.base_a = params[0] meas.base_b = params[1] perr = np.sqrt(np.diag(covs)) meas.Dbase_a = perr[0] meas.Dbase_b = perr[1] params, covs = curve_fit(DTAutil.flin, fitx2, fity2) meas.log("\nAlapvonal illesztése 2, x["+str(ranges[2])+"; "+str(ranges[3])+"], y = p0*x + p1") meas.fitreport(params, covs) meas.baseUp_a = params[0] meas.baseUp_b = params[1] perr = np.sqrt(np.diag(covs)) meas.DbaseUp_a = perr[0] meas.DbaseUp_b = perr[1] from scipy.interpolate import CubicSpline meas.basespline = CubicSpline(fitspl_x, fitspl_y) meas.log("\nKöztes szakasz illesztése köbös spline-al, x["+str(ranges[1])+"; "+str(ranges[2])+"]") meas.bBase = True # also new base was fitted, require new difference meas.bDiff = False meas.bComplexBase = True def difference(meas): meas.dTdiffed = [] if meas.bComplexBase: for i in range(len(meas.x)): if meas.x[i] < meas.base_end: meas.dTdiffed.append(meas.dT[i] - DTAutil.flin(meas.x[i], meas.base_a, meas.base_b)) elif meas.x[i] < meas.baseUp_start: meas.dTdiffed.append(meas.dT[i] - float(meas.basespline(meas.x[i]))) else: meas.dTdiffed.append(meas.dT[i] - DTAutil.flin(meas.x[i], meas.baseUp_a, meas.baseUp_b)) else: for i in range(len(meas.x)): meas.dTdiffed.append(meas.dT[i] - DTAutil.flin(meas.x[i], meas.base_a, meas.base_b)) meas.bDiff = True def getTh(meas, ranges): meas.Th_xmin = 0 meas.Th_xmax = 0 for i in range(len(meas.x)): if meas.Th_xmin == 0 and meas.x[i] >= ranges[0]: meas.Th_xmin = i if meas.Th_xmax == 0 and meas.x[i] >= ranges[1]: meas.Th_xmax = i break Thx = (meas.x[meas.Th_xmin] + meas.x[meas.Th_xmax]) / 2 meas.Th_x = 0 for i in range(len(meas.x)): if meas.x[i] >= Thx: meas.Th_x = i break if(meas.T1[meas.Th_x] > meas.T2[meas.Th_x]): meas.Th_ymax = meas.T1[meas.Th_x] meas.Th_ymin = meas.T2[meas.Th_x] else: meas.Th_ymax = meas.T2[meas.Th_x] meas.Th_ymin = meas.T1[meas.Th_x] meas.Th = (meas.Th_ymax + meas.Th_ymin) / 2 meas.bTh = True print("Átalakulás kezdete: "+str(meas.x[meas.Th_xmin])+" s") print("Átalakulás vége: "+str(meas.x[meas.Th_xmax])+" s") print("Átalakulás fele: "+str(meas.x[meas.Th_x])+" s") print("Mintatartó hőmérséklete: "+str(meas.T1[meas.Th_x])+" C") print("Környezet hőmérséklete: "+str(meas.T2[meas.Th_x])+" C") print("=======================") print("Th: "+str(meas.Th)+" C") meas.log("Átalakulás kezdete: "+str(meas.x[meas.Th_xmin])+" s") meas.log("Átalakulás vége: "+str(meas.x[meas.Th_xmax])+" s") meas.log("Átalakulás fele: "+str(meas.x[meas.Th_x])+" s") meas.log("Mintatartó hőmérséklete: "+str(meas.T1[meas.Th_x])+" C") meas.log("Környezet hőmérséklete: "+str(meas.T2[meas.Th_x])+" C") meas.log("=======================") meas.log("Th: "+str(meas.Th)+" C") def getMaximumT1(meas, ranges): meas.maxT1 = 0 for i in range(len(meas.x)): if meas.x[i] >= ranges[0]: if meas.T1[i] > meas.maxT1: meas.maxT1 = meas.T1[i] if meas.x[i] >= ranges[1]: break meas.bMaxT1 = True meas.bTmp = False print("Az átalakulás során a mintartartó maximális elért hőmérséklete: "+str(meas.maxT1)+" C") meas.log("Az átalakulás során a mintartartó maximális elért hőmérséklete: "+str(meas.maxT1)+" C") def integrate(meas, ranges): xmin = ranges[0] xmax = ranges[1] xf = [] yf = [] for i in range(len(meas.x)): if(xmin <= meas.x[i] <= xmax): xf.append(meas.x[i]) yf.append(meas.dTdiffed[i]) integ = DTAutil.trapcalc(xf,yf) meas.bIntegrated = True meas.integrals.append(integ) print("Integrál alsó határ: "+str(xmin)+" s") print("Integrál felső határ: "+str(xmax)+" s") print("Integrál = "+str(integ)+" Cs") print("=======================") print("Összes integrál = ("+str(np.average(meas.integrals))+" +/- "+str(np.std(meas.integrals))+") Cs") meas.log("Integrál alsó határ: "+str(xmin)+" s") meas.log("Integrál felső határ: "+str(xmax)+" s") meas.log("Integrál = "+str(integ)+" Cs") meas.log("=======================") meas.log("Összes integrál = ("+str(np.average(meas.integrals))+" +/- "+str(np.std(meas.integrals))+") Cs")