- 导入matplotlib模块,用于画坐标图
import matplotlib.pyplot as plt
- 获取一些霍尔元件的基本数据,并进行单位换算处理
c = 0
sum_1 =0
filename ='wz.txt'
a= []
a_1 = []
d = float(input('请输入霍尔元件片d=?mm\n'))/1000
b = float(input('请输入电磁圈的磁场大小B(T)=?\n'))
b_2 = float(input('请输入霍尔元件片b=?mm\n'))/1000
v = float(input('请输入当Is=0.1mA时产生的不等位电势v = ?mv\n'))
l = float(input('请输入霍尔元件片L=?mm\n'))/1000
- 读取wz.txt下----来自第一个表格的电压值数据
with open(filename)as wztq:
#读每一行然后存列表里
lines = wztq.readlines()
- 接下来是把放入列表的每一行的数据先分割整合后放进一个大的列表中
pi_string = ''
print('-----数据呈现,byRHZ----------')
for line in lines:
pi_string+=line.rstrip()#消除空格,方便调用数据和做分割
#print(line.strip())
print('-----------------------')
lst1=[]
lst1 = pi_string.split(" ")#lst1用来存储输入的字符串,用空格分割
avglist =[]
lst =[]
for il in lst1:
i_1= float(il)
if i_1 <=0:
#把负数全部变为正数
i_1=-i_1
lst.append(float(i_1))
else:
lst.append(float(i_1))
print(lst)
- 把数据分组分类处理并加入列表,由此一来,我们的第一个表中的数据成功存进列表
def list_of_groups(init_list, children_list_len):
list_of_groups = zip(*(iter(init_list),) *children_list_len)
end_list = [list(i) for i in list_of_groups]
count = len(init_list) % children_list_len
end_list.append(init_list[-count:]) if count !=0 else end_list
return end_list
- 求均值处理,对列表中的列表进行递归处理,先求和再求均值
lst2 = list_of_groups(lst,4)
for i in lst2:
for lstnumber in i:
sum_1 +=float(lstnumber)
avg = sum_1/4.0#此处4可根据具体数据改变,科大默认每组都是四个数据
avglist.append(avg)#将每组的均值加入一个新的列表中
sum_1 =0#重置sum_1的值方便后期对每组值求和
- python下的斜率计算法即是k=vh/is,参考大佬的教程写的
- 核心代码,求斜率k=w,截距b=b_1
def fit(data_x, data_y):
m = len(data_y)
x_bar = 2.5
sum_yx = 0
sum_x2 = 0
sum_delta = 0
for i in range(m):
x = data_x[i]
y = data_y[i]
sum_yx += y * (x - x_bar)
sum_x2 += x ** 2
# 根据公式计算w
w = sum_yx / (sum_x2 - m * (x_bar ** 2))
for i in range(m):
x = data_x[i]
y = data_y[i]
sum_delta += (y - w * x)
b_1 = sum_delta / m
return w, b_1
- 传递数据
x = [0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5]#科大实验默认x轴Is是这些数据
y = avglist[:]#传递V的每一行的均值数据给y
- 绘制生成坐标图
k, b_1 = fit(x, y)
- 画出坐标图,可视化的坐标轴
def huatu():
x_values = [0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5]
y_values = avglist[:]
plt.style.use('seaborn')
fig,ax = plt.subplots()
ax.scatter(x_values,y_values,s=100)
ax.plot(x_values,y_values,linewidth =3)
#调用scatter()并使用参数s设置绘制图形时使用的点的尺寸
#设置图表标题并给坐标轴加上标签
ax.set_title('RHZ'+'\n'+'V ='+ str(k)+'* Is' + str(b_1),fontsize=20)
ax.set_xlabel('Is',fontsize=14)
ax.set_ylabel('V',fontsize=14)
#设置刻度标记的大小
ax.tick_params(axis='both',which='major',labelsize=14)
plt.show()
- 得到数据
Rh = float(k*d/b)
zlz =1/Rh/1.6/100
ddl = 0.1*l/(v*b_2*d)
qyl = ddl*Rh
print('霍尔系数Rh求得为:'+str(Rh))
print('载流子浓度n为:'+str(zlz))
print('材料的电导率为:'+str(ddl))
print('载流子迁移率为:'+str(qyl))
huatu()
print('数据处理Rh,n,电导率,迁移率分别保留5,3,2,3小数')
- 大家可在我的基础上更进一步的开发,我是写来方便最近处理实验用的,表一数据的提取,可以直接截图然后用腾讯的提取文字功能复制粘贴进wz.txt即可。
- - 数据提取得到
1.36 -1.35 -1.37 1.36
2.72 -2.71 -2.74 2.73
4.08 -4.07 -4.09 4.09
5.44 -5.43 -5.46 5.45
6.80 -6.79 -6.82 6.81
8.16 -8.15 -8.18 8.17
9.52 -9.51 -9.53 9.52
10.88 -10.87 -10.90 10.89
12.24 -12.23 -12.26 12.25
- 复制粘贴进wz.txt,运行python代码,输入霍尔元件片的数据即可,自动画出坐标图
- 数据处理结果
文章评论