拟合门控概率 发表于 2019-09-28 | 字数统计: 313 | 阅读时长 ≈ 1 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758import numpy as npimport mathimport matplotlib.pyplot as pltimport pandas as pdfrom scipy.optimize import curve_fitpath = '/Users/squareface/PycharmProjects/testVenv/'num = 2# 读取数据data = pd.read_csv(path+'data'+str(num)+'.csv')# x赋值x = np.array(data.iloc[:,0])G = 36# 定义方程def func1(x,m,tm,h,th): return G*m*m*(1-np.exp(-x/tm))**2*(h-(h-1)*np.exp(-x/th))def func2(x,m,tm): return G*m*m*(1-np.exp(-x/tm))**2# 结果result = []# 拟合不同电位for i in range(1,len(data.columns)): y = np.array(data.iloc[:,i]) #非线性最小二乘法拟 if i>2: popt, pcov = curve_fit(func1, x, y,maxfev = 9999999,bounds=(0,60),method='trf') else: popt, pcov = curve_fit(func2, x, y,maxfev = 9999999,bounds=(0,60),method='trf') #获取popt里面是拟合系数 if i>2: a = popt[0] b = popt[1] c = popt[2] d = popt[3] yvals = func1(x,a,b,c,d) else: a = popt[0] b = popt[1] c = np.nan d = np.nan yvals = func2(x,a,b) # 绘图 plt.cla() plot1 = plt.plot(x, y, 's',label='original values') # 原始点 plot2 = plt.plot(x, yvals, 'r',label='polyfit values') # 拟合线 plt.xlabel('t') # x轴标签 plt.ylabel('gCIR') # y轴标签 plt.legend(loc='best') # 图例 plt.title('V='+list(data.columns)[i]+'mV') # 标题 plt.savefig(path+str(num)+'_'+str(list(data.columns)[i])+'mV.png') # 保存图 result.append([list(data.columns)[i],b,d,G*a*a,a,c])# 保存数据result = pd.DataFrame(result,columns=['V','tm','th','GCIRm2','m','h'])result.to_csv(path+str(num)+'_'+'result.csv',index=False)