拟合门控概率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit

path = '/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)