Python中平滑后实验数据的导数计算问题
Python中平滑后实验数据的导数计算问题
我最近在处理一组实验数据的导数计算,碰到了棘手的问题。原始暗电流数据的导数完全没有物理意义,所以我尝试先对数据做平滑处理,但得到的导数结果还是和理论预期相差甚远,想请大家帮我看看哪里出了问题。
具体来说,我需要计算暗电流随偏置电压的导数,理论上的导数应该是先为0、随后逐渐上升的形态(类似我给出的理论数据导数曲线),但我处理后的实验数据导数完全不符合这个预期。
下面是我目前使用的代码:
import matplotlib.pyplot as plt import pandas as pd import numpy as np import scipy.stats as stats import math from scipy.optimize import curve_fit bias = pd.read_csv('bias_voltage_2024_12_12__13_17_47.csv', delimiter=',', header=None) data1 = pd.read_csv('sipm_dark_DD_microfc_v1_2024_12_12__14_57_27.csv', delimiter=',', header=None) bias_voltage = bias[1][:425].values dark_current = data1[1] # 用15点滑动平均平滑数据 filt = np.ones(15)/15 smooth = np.convolve(dark_current, filt, 'valid') # 计算平滑后数据的导数 deriv = np.gradient(smooth, bias_voltage[7:-7]) # 生成理论曲线及其导数 x = np.linspace(0, 32, 100) mu = 25.4 y = np.where(x < mu, 0, 0.0002*(x - 8) * (x - mu)) deriv2 = np.gradient(y, x) # 注释掉的是实验数据导数的绘图代码 # plt.scatter(bias_voltage[7:-7], deriv, s=8, label='derivative') plt.scatter(x, deriv2, s=8, label='theoretical data') plt.xlabel('Bias Voltage (V)') plt.ylabel('Current (A) / Derivative of Current (A/V)') plt.legend() plt.savefig('theo_deriv.png') plt.show()
我附上了三张对比图:
- 第一张:实验暗电流数据与理论曲线的对比
- 第二张:我计算得到的实验数据导数结果
- 第三张:理论预期的导数曲线(这是我希望实验数据导数能呈现的样式)
用到的实验数据来自两个CSV文件:bias_voltage_2024_12_12__13_17_47.csv(偏置电压数据)和sipm_dark_DD_microfc_v1_2024_12_12__14_57_27.csv(暗电流数据)。
我现在的疑问点:
- 我用了15点的滑动平均卷积做平滑,这个窗口大小是否合适?会不会过度平滑或者平滑不足?
- 计算导数时,我取了
bias_voltage[7:-7]来对应平滑后的数据,这个轴的对齐是否正确? - 有没有其他更适合处理这类实验数据平滑+导数计算的方法?
希望有经验的朋友能帮我排查一下问题,谢谢!
备注:内容来源于stack exchange,提问作者daveidix
相关产品推荐
相关产品推荐

