光学实验-光电效应(matplotlib)

        光电效应是证明光具有粒子性的经典实验,只要光的频率超过某一极限频率,受光照射的金属表面立即就会逸出光电子,发生光电效应

        本次实验验证光电效应,测量普朗克常量,并绘制光电管的伏安特性曲线。采用python和matplotlib处理数据。

首先是测定普朗克常量:

import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
import numpy as np
import 直线拟合 as line

# -------------------原始数据---------------------------
ld = [365e-9, 405e-9, 436e-9, 546e-9, 577e-9]
v = [3e8 / i for i in ld]
u1 = [1.642, 1.252, 1.012, 0.464, 0.344]
u2 = [1.644, 1.252, 1.012, 0.462, 0.342]
x = [0, 10e14]

e0 = 1.602e-19
h0 = 6.626e-34
# ------------------------------------------------------

# ------------------绘制箭头型的坐标系----------------------
# 1.创建画布并引入axisartist工具
fig = plt.figure(figsize=(8, 6))  # 创建画布
# 使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)  # 111 代表1行1列的第1个,subplot()可以用于绘制多个子图
fig.add_axes(ax)  # 将绘图区对象添加到画布中

ax.axis[:].set_visible(False)  # 隐藏了四周的方框
# ax.new_floating_axis代表添加新的坐标轴
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["x"].set_axisline_style("-|>", size=1.0)  # 给x坐标轴加上箭头
ax.axis["y"] = ax.new_floating_axis(1, 0)  # 添加y坐标轴,且加上箭头
ax.axis["y"].set_axisline_style("-|>", size=1.0)
# 设置x、y轴上刻度显示方向
ax.axis["x"].set_axis_direction("top")
ax.axis["y"].set_axis_direction("top")

# 设置坐标轴刻度
plt.xlim(0, 10e14)
plt.xticks(np.arange(0, 11e14, 1e14), ['', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'vi(10^14Hz)'])
plt.ylim((-2, 2.1))
plt.text(x=0, y=2.2, s='Uo(V)')

# 直线拟合并计算普朗克常量h
a, b = line.fit(v, u1)
y = [a*i+b for i in x]
plt.plot(x, y, 'black')
plt.plot(v, u1, '.')
plt.text(x=8.8e14, y=2.15, s='k={}'.format(round(a, 18)))

plt.show()

h = a*e0
print('h = {}'.format(h))
print("dif = {}%".format(round((h-h0)/h0, 5) * 100))

在处理数据时用到了最小二乘法直线拟合,附上代码:

import numpy as np


def fit(data_x, data_y):
    n = len(data_y)
    x_bar = np.mean(data_x)
    y_bar = np.mean(data_y)
    print('x_bar = {}'.format(x_bar))
    print('y_bar = {}'.format(y_bar))

    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0
    for i in range(n):
        x = data_x[i]
        y = data_y[i]
        sum_yx += y * x
        sum_x2 += x ** 2

    print('sum_yx  = {}'.format(sum_yx))
    print('sum_x2  = {}'.format(sum_x2))
    # 根据公式计算
    a = (sum_yx - n * x_bar * y_bar) / (sum_x2 - n * (x_bar ** 2))
    print('a = {}'.format(a))

    for i in range(n):
        x = data_x[i]
        y = data_y[i]
        sum_delta += (y - a * x)
    b = sum_delta / n
    print('b = {}'.format(b))
    return a, b

其中a是拟合直线的斜率,b是y轴上的截距

光电管直线方程为:U = \frac{h}{e}(v-v_{o}),普朗克常量即斜率a*电子带电量e

运行结果为:

 

 

相对误差为2.557%,还算精确。

然后是描绘光电管伏安特性曲线:

import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
import numpy as np


# 原始数据
u1 = [-1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47]
i1 = [0, 0.02, 0.8, 1.4, 1.9, 2.2, 2.4, 2.4, 2.5, 2.5, 2.5, 2.6, 2.6, 2.6,
      2.6, 2.6, 2.7, 2.7, 2.7, 2.7, 2.8, 2.8, 2.8, 2.9, 2.9]

u2 = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 39, 45, 50]
i2 = [0.1, 2.8, 6.5, 10.6, 17.6, 25.9, 32.8, 39.6, 46.4, 56.3, 63.1, 66.7, 67.7, 68.4, 69.0, 69.5, 70.3, 72.4, 73.1, 73.1, 73.1, 73.1, 73.1]

# 绘图
fig = plt.figure(figsize=(8, 6))  # 创建画布
# 使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)  # 将绘图区对象添加到画布中

ax.axis[:].set_visible(False)  # 隐藏了四周的方框
# ax.new_floating_axis代表添加新的坐标轴
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["x"].set_axisline_style("-|>", size=1.0)  # 给x坐标轴加上箭头
ax.axis["y"] = ax.new_floating_axis(1, 0)  # 添加y坐标轴,且加上箭头
ax.axis["y"].set_axisline_style("-|>", size=1.0)
# 设置x、y轴上刻度显示方向
ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")
# 设置坐标轴刻度
plt.yticks(np.arange(0, 80, 10), ['', '10', '20', '30', '40', '50', '60', '70'])
plt.text(x=52, y=1, s='U(V)')
plt.text(x=-1, y=79, s='I(A)')
plt.text(x=40, y=5, s='546nm Φ4')
plt.text(x=40, y=70, s='436nm Φ8')

# 绘制光电管伏安特性曲线
plt.plot(u1, i1, 'black')
plt.plot(u2, i2, 'black')

plt.show()

运行结果:

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值