You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:23:05