宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

直接放代码

import matplotlib.pyplot as pltimport sysimport mathimport pandas as pdfrom scipy import optimizefrom scipy import logimport matplotlib as mplfrom pylab import mplimport sysmpl.rcParams[‘font.sans-serif’] = [‘SimHei’]# mpl.rcParams[‘font.sans-serif’] = [‘Microsoft YaHei’]# 指定默认字体:解决plot不能显示中文问题mpl.rcParams[‘axes.unicode_minus’] = Falsedef ocv_socsoc,a,b,c,d,e,f): y = a+b*soc+c*powsoc,2)+d/soc+0.00001)+e*logsoc+0.00001)+f*log1+0.00001-soc) return ydef poly_ocvsocsoc,k0,k1,k2,k3,k4,k5,k6,k7,k8,k9): y = k0+k1*soc+k2*powsoc,2)+k3*powsoc,3)+k4*powsoc,4)+k5*powsoc,5)+k6*powsoc,6)+k7*powsoc,7)+k8*powsoc,8)+k9*powsoc,9) return ydef main): path = sys.argv[1] path = path.replace”&”,” “) Fit_method = sys.argv[2] ifFit_method==”多项式拟合”): try: voltages = pd.read_tablepath,header=None) voltages.columns = [‘y’] voltages.sort_valuesascending=False,by=’y’) voltages[‘x’] = list[1-i-1)/voltages.shape[0] for i in range1,voltages.shape[0]+1)]) x = voltages[‘x’].tolist)[5:-5] y =voltages[‘y’].tolist)[5:-5] except: print’格式错误,请读取OCV列向量的文本文件,并且不小于10个点!’) return k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 = optimize.curve_fitpoly_ocvsoc,x,y,method=’lm’)[0] printk0,k1,k2,k3,k4,k5,k6,k7,k8,k9) yy = [poly_ocvsocxx,k0,k1,k2,k3,k4,k5,k6,k7,k8,k9) for xx in x] printpoly_ocvsoc1,k0,k1,k2,k3,k4,k5,k6,k7,k8,k9)) else: try: voltages = pd.read_tablepath, header=None) voltages.columns = [‘y’] voltages.sort_valuesascending=False, by=’y’) voltages[‘x’] = list[1 – i – 1) / voltages.shape[0] for i in range1, voltages.shape[0] + 1)]) x = voltages[‘x’].tolist)[5:-5] y = voltages[‘y’].tolist)[5:-5] except: print’格式错误,请读取OCV列向量的文本文件,并且不小于10个点!’) return a, b, c, d, e, f = optimize.curve_fitocv_soc, x, y, method=’lm’)[0] print”a=%f b=%f c=%f d=%f e=%f f=%f” %a, b, c, d, e, f)) yy = [ocv_socxx, a, b, c, d, e, f) for xx in x] f1 = plt.figure1,figsize=8,6)) ax1 = plt.subplot2,2,1) ax2 = plt.subplot2,2,2) ax3 = plt.subplot2,2,3) ax4 = plt.subplot2,2,4) # f1.tight_layout)#调整整体空白 #绘制原先的曲线 plt.scaax1) plt.plotx,y,’g:’,label=u”原始数据”) plt.xlabel’SOC’,fontsize=14) plt.ylabel’OCV/V’,fontsize=14) plt.tight_layout) # ax1.spines[‘top’].set_visibleFalse) # ax1.spines[‘right’].set_visibleFalse) # ax1.spines[‘bottom’].set_visibleFalse) # ax1.spines[‘left’].set_visibleFalse) plt.legendfontsize=14) #绘制拟合的曲线 plt.scaax2) plt.plotx,yy,’b’,label=u”拟合曲线”) plt.xlabel’SOC’,fontsize=14) plt.ylabel’OCV/V’,fontsize=14) plt.tight_layout) plt.legendfontsize=14) #拟合曲线对比 plt.scaax3) plt.plotx,y,’r–‘,label=”原始曲线”) plt.plotx,yy,color=’gray’,label=”拟合曲线”) plt.xlabel’SOC’,fontsize=14) plt.ylabel’OCV/V’,fontsize=14) plt.tight_layout) plt.legendfontsize=14) #拟合误差曲线 plt.scaax4) error = [y1-y2 for y1,y2 in zipy,yy)] plt.plotx,error,color=’r’,label=”误差曲线”) plt.xlabel’SOC’,fontsize=14) plt.ylabel’OCV/V’,fontsize=14) plt.legendfontsize=14) plt.tight_layout) plt.show)main)

运行过程中,第一个参数是ocv所在文件的路径,第二个参数是使用的方法:“多项式拟合”或者“对数-多项式拟合”

拟合结果的图片:

使用的“对数-多项式拟合”方法,系数为:a=3.768480  b=-0.921018  c=0.441253 d=0.000037 e=0.239495 f=-0.021628;具体函数表达式见代码。