光电效应及普朗克常数的测定数据处理 Python实现

内容仅供参考,如有错误,欢迎指正,如有疑问,欢迎交流。 

因为我不会Excel所以只能用Python来处理

祝大家早日摆脱物理实验的苦海

用到的一些方法

PCHIP (分段三次埃尔米特插值多项式)

因为实验时记录的数据比较少,记录的也比较随便,直接将这些数据连起来的话画出的图像十分的直,而伏安特性曲线顾名思义应该是一条曲线,因此我们需要进行数据拟合,但是呢我们发现直接进行数据拟合会出现下面的情况,即在某些区间内,电压上升电流反而下降了,这很不合理,所以我让AI帮我想到了PCHIP插值法进行数据点的扩展,具体是啥我也不知道,反正用就完了

利用导数找拐点

看了示范报告,一开始把零点当成拐点算了,爆炸了

找拐点的方法我试了好多种,二阶导等于零、一阶导的极值、一阶导作差、一阶导和各种阈值比较等等,最后我用的是区间斜率与整体斜率的比较,也算是一阶导和阈值比较的一种吧。

这些方法的核心思想都是在伏安特性曲线上找到电流变化陡峭的拐点,并将其对应的电压作为截止电压,关键是怎样才算陡峭。本文用到的方法中,先计算电流随电压的平均变化率(即平均斜率),作为基准值 threshold =(I_max - I_min) / (U_max - U_min),随后遍历所有插值后的数据点,利用五点差分法计算其局部斜率,如果这个局部斜率是基准斜率的1.5倍,就将其认为是拐点,记录并退出循环。但是因为找到了第一个就退出循环了并且“1.5倍”不一定是每组数据的最佳选择,所以结果可能会出现较大误差。

threshold = (max(y_dense) - min(y_dense)) / (x_max - x_min)  # 导数阈值for i in range(nums_data):if (y_dense[i + 5] - y_dense[i]) / (x_dense[i + 5] - x_dense[i]) > threshold * 1.5:cutoff_voltage = x_dense[i]break

代码

import openpyxl
import matplotlib.pyplot as plt
import numpy as np
import os
from matplotlib.ticker import FormatStrFormatter
from scipy.interpolate import PchipInterpolator
from docx import Document
from docx.shared import Inches# 设置支持中文的字体和正常显示负号
plt.rcParams['font.sans-serif'] = ['SimHei']  # 或者 ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False# ------------------------------------------控制台--------------------------------------------------
N = 5  # 数据组数cutoff_voltages = [] # 截止电压 (V)
calculate = 1 # 数据计算+图片输出
save_to_word = 0 # 将图片保存到 Word 文档output_dir = r"C:\Users\86138\Desktop\这是文件夹\这是文件夹里的文件夹" # 指定图片保存目录
excel_file = r"C:\Users\86138\Desktop\这是文件夹\这是xlsx.xlsx"  # Excel 文件路径 (用于加载原始数据和储存计算后的数据)
word_file = r"C:\Users\86138\Desktop\这是文件夹\这是docx.docx"  # Word 文件路径(用于读取图片并保存)# --------------------------------------------------------------------------------------------------auto = 0 if cutoff_voltages else 1
os.makedirs(output_dir, exist_ok=True)  # 确保目标文件夹存在def Htlang():# 物理常数c = 3.0e8  # 光速,单位 m/s# 1. 加载 Excel 文件wb = openpyxl.load_workbook(excel_file)sheet = wb.active# 2. 确定数据组的行间隔(第一组从第 1 行开始,每组占 2 行)group_start_rows = [1 + i * 2 for i in range(N)]  # 生成 [1, 3, 5, 7, 9]# 3. 存储所有数据以便后续绘图wavelengths = []     # 波长 (nm)frequencies = []     # 频率 (10^-14 Hz)# 4. 处理每一组数据for group_idx, start_row in enumerate(group_start_rows, start=1):# 读取表格名称、坐标轴标签table_name = sheet.cell(row=start_row, column=1).value  # A列存储波长信息(例如 "365nm")x_label = sheet.cell(row=start_row, column=2).value       # B列第一行: 横坐标标签(电压)y_label = sheet.cell(row=start_row + 1, column=2).value     # B列第二行: 纵坐标标签(电流)# **处理 y_label,将乘方变为上标**if y_label:y_label = y_label.replace("10-10", r"$10^{-10}$") \.replace("10-11", r"$10^{-11}$") \.replace("10-12", r"$10^{-12}$")# 读取电压与电流数据(从 C 到 L 列)voltage_data = []current_data = []for col in range(3, 13):  # C(3)到L(12)v = sheet.cell(row=start_row, column=col).value  # 电压数据i = sheet.cell(row=start_row + 1, column=col).value  # 电流数据voltage_data.append(v)current_data.append(i)# 计算频率# 从 table_name 中去除末尾两个字符(例如 "nm")转换为 int 得到波长wavelength_nm = int(table_name[:-2])wavelength_m = wavelength_nm * 1e-9  # 转换为 mfrequency = c / wavelength_m  # 计算频率 (Hz)frequency_14 = frequency / 1e14  # 以 10^-14 Hz 为单位wavelengths.append(wavelength_nm)frequencies.append(frequency_14)# 过滤并排序有效数据valid_indices = [i for i, (v, i_val) in enumerate(zip(voltage_data, current_data))if v is not None and i_val is not None]x = np.array([voltage_data[i] for i in valid_indices])y = np.array([current_data[i] for i in valid_indices])# 按电压升序排列sort_idx = np.argsort(x)x_sorted = x[sort_idx]y_sorted = y[sort_idx]if auto:cutoff_voltage = Noneelse:cutoff_voltage = cutoff_voltages[group_idx - 1]try:# 使用保形插值(保证单调性)pchip = PchipInterpolator(x_sorted, y_sorted)nums_data = 300# 生成密集采样点,用于绘制曲线(扩展范围为原数据范围两侧各扩展10%)x_min, x_max = np.min(x_sorted), np.max(x_sorted)x_range = x_max - x_minx_dense = np.linspace(x_min - 0.1*x_range, x_max + 0.1*x_range, nums_data)y_dense = pchip(x_dense)if auto:threshold = (max(y_dense) - min(y_dense)) / (x_max - x_min)  # 导数阈值for i in range(nums_data):if (y_dense[i + 5] - y_dense[i]) / (x_dense[i + 5] - x_dense[i]) > threshold * 1.5:cutoff_voltage = x_dense[i]breakexcept Exception as e:print(f"[{group_idx}] 插值失败,使用线性连接: {str(e)}")cutoff_voltage = Nonex_dense = x_sortedy_dense = y_sortedif auto:if cutoff_voltage is not None:print(f"[{group_idx}] 拐点确定的截止电压: {cutoff_voltage:.3f} V")else:print(f"[{group_idx}] 未检测到拐点,截止电压无法确定")cutoff_voltages.append(cutoff_voltage)# 绘制伏安特性曲线plt.figure(figsize=(10, 7))plt.plot(x_dense, y_dense, 'b-', linewidth=2, label="拟合曲线")plt.scatter(x_sorted, y_sorted, c='red', s=50, marker='o',edgecolors='k', label="实验数据")if cutoff_voltage is not None:plt.axvline(cutoff_voltage, color='red', linestyle='--', label=f"截止电压: {cutoff_voltage:.2f} V")plt.xlabel(x_label)plt.ylabel(y_label)plt.title(f"伏安特性曲线,波长 {table_name}")plt.grid(True)plt.legend()plt.tight_layout()output_path = os.path.join(output_dir, f"output_{group_idx}.png")plt.savefig(output_path, dpi=300)plt.close()print(f"[{group_idx}] 图像已保存至: {output_path}")# 5. 线性拟合:截止电压 vs 频率(计算拟合参数及其不确定度)freq_array = np.array(frequencies)volt_array = np.array(cutoff_voltages, dtype=float)# 使用 cov=True 得到参数协方差矩阵coeffs, cov = np.polyfit(freq_array, volt_array, 1, cov=True)k, b = coeffserr_k = np.sqrt(cov[0, 0])  # 斜率 k 的标准差,即不确定度# 6. 绘制截止电压 vs 频率 图(增加数据点连接线,并设置刻度格式)plt.figure(figsize=(8, 6))plt.scatter(freq_array, volt_array, color='blue', label="实验数据")plt.plot(freq_array, volt_array, 'b-', label="数据连接线")plt.plot(freq_array, k * freq_array + b, 'r--', label=f"拟合直线: $U_s = {k:.4f}f + {b:.4f}$\n斜率不确定度: ±{err_k:.4f}")plt.xlabel(r"频率 ($10^{-14}$ Hz)")plt.ylabel("截止电压 (V)")plt.title("截止电压-频率图线")plt.grid(True)plt.legend()ax = plt.gca()ax.xaxis.set_major_formatter(FormatStrFormatter('%.3f'))  # 横轴保留三位小数ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))  # 纵轴保留两位小数plt.tight_layout()output_path = os.path.join(output_dir, f"output_{N + 1}.png")plt.savefig(output_path, dpi=300)plt.close()print(f"截止电压-频率图已保存至: {output_path}")# 7. 计算普朗克常数h0 = 6.64 * 10**(-34)  # 公认普朗克常数 (J·s)e = 1.6 * 10**(-19)  # 电子电荷量 (C)h = e * (-k) * 1e-14  # 计算出的普朗克常数 (J·s)_h = e * err_k * 1e-14  # 计算出的普朗克常数的不确定度 (J·s)Ep = (h - h0) * 100 / h0# 8. 写入 Excel# 将标题写入 A15, A16, A17sheet["A15"] = "波长 (nm)"sheet["A16"] = "频率 (10^-14 Hz)"sheet["A17"] = "截止电压 (V)"# 假设数据组数为 5,对应写入 B 到 F 列for i, (w, f, u) in enumerate(zip(wavelengths, frequencies, cutoff_voltages)):col_letter = chr(ord('B') + i)  # B, C, D, E, Fsheet[f"{col_letter}15"] = f"{w:.0f}"sheet[f"{col_letter}16"] = f"{f:.2f}"sheet[f"{col_letter}17"] = f"{u:.2f}"# 将计算结果写入 Excel(从 A19 开始)sheet["A19"] = "h"sheet["B19"] = f"{h * 10 ** 34:.2f} × 10^(-34) J·s"sheet["A20"] = "Δh"sheet["B20"] = f"{_h * 10 ** 34:.2f} × 10^(-34) J·s"sheet["A21"] = "h±Δh"sheet["B21"] = f"{h * 10 ** 34:.2f} ± {_h * 10 ** 34:.2f} × 10^(-34) J·s"sheet["A22"] = "Ep"sheet["B22"] = f"{Ep:.2f}%"wb.save(excel_file)print("计算结果已写入 Excel")print(f"{Ep:.2f}%")if save_to_word:from docx import Documentfrom docx.shared import Inchesdef Htlanglanglang():doc = Document()# 创建表格(3 行 2 列),确保六张图片能排在一页上table = doc.add_table(rows=3, cols=2)table.autofit = True  # 自动调整列宽img_index = 0  # 计数器for i in range(1, N + 2):  # 遍历所有图片(包括截止电压-频率图)image_path = os.path.join(output_dir, f"output_{i}.png")if os.path.exists(image_path):row = img_index // 2  # 计算行号col = img_index % 2   # 计算列号cell = table.cell(row, col)  # 获取单元格paragraph = cell.paragraphs[0]run = paragraph.add_run()run.add_picture(image_path, width=Inches(3))  # 调整宽度,确保 3 张图片一行img_index += 1doc.save(word_file)print(f"实验结果已保存至 Word: {word_file}")if calculate:Htlang()
if save_to_word:Htlanglanglang()

 操作步骤

第0步 创建所需文件

在电脑某个位置新建一个文件夹,然后在新建的文件夹里新建一个.xlsx文件、一个.py文件、一个.docx文件以及一个文件夹,完成后大概长下面这样

第1步 填入数据、粘贴代码

打开excel文件,将原始数据输入,格式如下

注意:A列的几个单元格要合并一下不然会报错(我懒的调了),电流的单位中的-11次方这些不需要在excel中就给它改为上标不然不知道会不会报错(我懒的试了)

打开Python文件,将代码粘贴进去,并在代码中注释了控制台的部分对文件路径进行修改

第2步 安装必要的Python扩展库

打开cmd,输入以下代码(二选一)

pip install scipy
pip install python-docx
pip install openpyxl
pip install matplotlib
pip install numpy
pip install openpyxl matplotlib numpy scipy python-docx

第3步 运行代码

一切顺利的话运行结果大致如下

 此外,打开excel,会发现多了一些数据

文件夹里也会多出6张图片

第4步 发现问题并稍加调整

因为找拐点的方法比较粗略,所以可能会存在较大的误差,导致算出来的百分差严重超标,所以我们需要进行手动调整,然后将五个截止电压在代码中事先输入,如下图

第5步 再次运行代码

我们需要不断的调整和尝试,直到把百分差降到10%以下

注意:运行时记得把excel关掉否则会报错

第6步 把图片保存到word中

经过不断的调整,将百分差控制在10以内之后,将代码中的save_to_word这个变量设置为1(当然一开始就设置为1也不是不行,开始教学之前我忘记改了),再次运行代码(此时可以将变量calculate设置为0,不过无所谓,数据量不大,运行也耗不了多长时间),会发现输出多了一句话

然后就可以打开word,按自己的需求调整图片的大小(代码已经初步调好了),然后去打印店打印结果了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025最新3个wordpress好用的主题

红色大气的wordpress企业主题,适合服务行业的公司搭建企业官方网站使用。是一款专为中小企业和个人开发者设计的WordPress主题,旨在提供专业的网站构建解决方案。 通过此WordPress主题,用户可以轻松创建和维护一个专业的企业网站&#xff0c…

OLLVM 增加 CC++ 字符串加密功能

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 当我们如果没有对字符串进行加密&#xff0c;使用 IDA 反汇编一下 so 可以看到 C 代码中的字符串就直接暴露了。 字符串加密原理 sobf.c #include <…

桑福德·韦尔策划美国捷运公司收购南美银行案例分析

桑福德韦尔(Sanford I. Weill)在1981年策划美国捷运公司(American Express)以5.5亿美元收购南美贸易发展银行所属外国银行机构的案例中,展现了其作为战略家与执行者的双重能力。这一交易的流程和韦尔的具体行为可从以下六个关键环节解析: 一、战略定位与目标筛选 战略目标…

人工智能与区块链融合:开启数字信任新时代

引言 在当今数字化飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;与区块链技术正以前所未有的速度改变着我们的生活和工作方式。AI以其强大的数据处理和智能决策能力&#xff0c;为各行业带来了效率的飞跃&#xff1b;而区块链则以其去中心化、不可篡改的特性…

自动化逆向框架使用(Objection+Radare2)

1. 工具链架构与核心优势 1.1 动静结合逆向体系 graph LR A[动态分析] -->|Objection实时Hook| B[关键点定位] B --> C[行为数据捕获] D[静态分析] -->|Radare2深度解析| E[控制流重建] E --> F[漏洞模式识别] B --> F C --> F 组合优势对比&…

流式ETL配置指南:从MySQL到Elasticsearch的实时数据同步

流式ETL配置指南&#xff1a;从MySQL到Elasticsearch的实时数据同步 场景介绍 假设您运营一个电商平台&#xff0c;需要将MySQL数据库中的订单、用户和产品信息实时同步到Elasticsearch&#xff0c;以支持实时搜索、分析和仪表盘展示。传统的批处理ETL无法满足实时性要求&…

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …

单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》

目录 四、单片机和微控制器 4.1 单片机(MCU/MPU/SOC) 一、定义 二、主要特点 三、工作原理 四、主要类型 五、应用领域 六、选型与设计注意事项 七、发展趋势 4.2 数字信号处理器(DSP/DSC) ​编辑​编辑 一、定义 二、工作原理 三、结构特点 四、应用领域 五、选型与设计注…

macOS 安装 Miniconda

macOS 安装 Miniconda 1. Quickstart install instructions2. 执行3. shell 上初始化 conda4. 关闭 终端登录用户名前的 base参考 1. Quickstart install instructions mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o…

高数下---8.1平面与直线

目录 平面的确定 直线的确定 若要求某一直线或平面就根据要素来求。 例题 平面中的特殊情况 平面中的解题思路 直线的解题思路 平面的确定 两要素 一 一点 二 倾斜角 即法向量 点法式 可化为一般式 Ax By Cz D 0; (A,B,C) 即法向量&#xff1b; 改变D 即…

CMS迁移中SEO优化整合步骤详解

内容概要 在CMS迁移过程中&#xff0c;系统化的规划与执行是保障SEO排名稳定性的核心。首先需明确迁移流程的关键阶段&#xff0c;包括数据备份、URL适配、元数据同步及安全配置等环节。其中&#xff0c;数据备份不仅需覆盖原始数据库与静态资源&#xff0c;还需验证备份文件的…

存储过程、存储函数与触发器详解(MySQL 案例)

存储过程、存储函数与触发器详解&#xff08;MySQL 案例&#xff09; 一、存储过程&#xff08;Stored Procedure&#xff09; 定义 存储过程是预先编译好并存储在数据库中的一段 SQL 代码集合&#xff0c;可以接收参数、执行逻辑操作&#xff08;如条件判断、循环&#xff09;…

Python:进程间的通信,进程的操作队列

进程间的队列&#xff1a; 队列的基本操作&#xff1a; 入队&#xff1a;将数据放到队列尾部 出队&#xff1a;从队列的头部取出一个元素 maxsize&#xff1a;队列中能存放数据个数的上限(整数)&#xff0c;一旦达到上限插入会导致阻塞&#xff0c;直到队列中的数据被消费掉 …

【C++初阶】--- 类与对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;我们主要需要掌握前4个&#xff0c;后两个了解以下即可&#xff0c;默认…

python处理音频相关的库

1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数&#xff0c;生成wav文件 def record(file_name):try:os.close(file_…

[M模拟] lc2711. 对角线上不同值的数量差(对角线遍历+前后缀分解)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;2711. 对角线上不同值的数量差 前置题&#xff1a; [M模拟] lc3446. 按对角线进行矩阵排序(对角线遍历公式推导模板题) 矩形的对角线遍历的基础题。 题单&#xff1a; 待补充 2. 题目解析 2025年03月25日…

设计一个基于机器学习的光伏发电功率预测模型,以Python和Scikit - learn库为例

下面为你设计一个基于机器学习的光伏发电功率预测模型&#xff0c;以Python和Scikit - learn库为例。此模型借助历史气象数据和光伏发电功率数据来预测未来的光伏发电功率。 模型设计思路 数据收集&#xff1a;收集历史气象数据&#xff08;像温度、光照强度、湿度等&#xf…

洛谷 P1351 [NOIP 2014 提高组] 联合权值(树)

题目描述 无向连通图 G 有 n 个点&#xff0c;n−1 条边。点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi​&#xff0c;每条边的长度均为 1。图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离。对于图 G 上的点对 (u,v)&#xff0c;若它们的距离为 2&#xff0c;则它们之间…

YoloV8训练和平精英人物检测模型

概述 和平精英人物检测&#xff0c;可以识别游戏中所有人物角色&#xff0c;并通过绘制框将人物选中&#xff0c;训练的模型仅仅具有识别功能&#xff0c;可以识别游戏中的视频、图片等文件&#xff0c;搭配Autox.js可以推理&#xff0c;实现实时绘制&#xff0c;但是对手机性…

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天&#xff0c;美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;凭借其卓越的技术实力和前瞻性的设计理念&#xff0c;为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案&#xff0c;一个集高效性、智…