基于非对称电压时序数据计算二极管平均功率的矛盾问题
非对称电压下二极管平均功率计算的结果差异问题
我需要利用非对称电压-时间记录数据计算二极管的平均功率,编写了一段Python脚本,采用两种计算方式:
- 方式一:直接对电压平方后除以电阻,通过Simpson积分计算平均功率
- 方式二:先通过Simpson积分计算平均电压,再推导平均功率
方式一运行正常,但方式二得到的结果与方式一不一致:电源的结果差异不大,但二极管的推导功率始终约为直接积分结果的一半。
测试代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.signal import find_peaks import openpyxl import scipy.integrate as integral file = "CSV8.csv" data = pd.read_csv(file) #Resistance R = 1000 x = data["Second"] #0.16 to move the data to the x-axis y1 = (data["Volt1"]+0.16)**2/R y2 = (data["Volt2"]+0.16)**2/R yU1 = (data["Volt1"]+0.16) yU2 = (data["Volt2"]+0.16) #plt.plot(x, y1) #plt.plot(x, y2) plt.plot(x, yU1) plt.plot(x, yU2) peak = find_peaks(-y1, distance = 900)[0] T = x[peak[3]]-x[peak[1]] #plt.plot(x[peak], y1[peak], "x") plt.plot(x[peak], yU1[peak], "x") #Integral xint = x[peak[1]:peak[3]] y1int = y1[peak[1]:peak[3]] y2int = y2[peak[1]:peak[3]] yU1int = np.abs(yU1[peak[1]:peak[3]]) yU2int = np.abs(yU2[peak[1]:peak[3]]) int1 = integral.simpson(y1int, xint) int2 = integral.simpson(y2int, xint) intU1 = integral.simpson(yU1int, xint) intU2 = integral.simpson(yU2int, xint) print("P Source: ", int1/T, " P Diode: ", int2/T) print("U Source: ", intU1/T, " U Diode: ", intU2/T) print("P from U Source: ", (intU1/T)**2/1000, "P from U Diode: ", (intU2/T)**2/1000 ) plt.xlabel("Time t in s") plt.ylabel("Voltage U in V") plt.show()
输出结果
P Source: 0.020998072067580663 P Diode: 0.006863115468771637
U Source: 4.130740894612934 U Diode: 1.6910455615565707
P from U Source: 0.017063020338427666 P from U Diode: 0.0028596350912601775
问题原因与修正方案
核心错误
你混淆了电压平均值(整流平均值)和电压有效值的概念:
- 方式一的计算是正确的:平均功率是瞬时功率在周期内的平均值,即 $P_{avg} = \frac{1}{T}\int_{0}{T}\frac{u(t)2}{R}dt$,完全符合电路平均功率的定义。
- 方式二中,你计算的是电压绝对值的平均值 $U_{avg} = \frac{1}{T}\int_{0}^{T}|u(t)|dt$,然后用 $P = \frac{U_{avg}^2}{R}$ 推导功率,这是错误的——只有有效值的平方除以电阻才等于平均功率,有效值的定义是 $U_{rms} = \sqrt{\frac{1}{T}\int_{0}{T}u(t)2dt}$。
对于二极管的非对称波形(大部分时间电压接近0,仅小周期内有电压),平均值和有效值的差异极大,这就是为什么二极管推导功率只有直接积分结果一半的原因。
修正代码
将方式二的计算逻辑改为使用有效值推导功率:
# 替换原有的平均电压计算与推导功率代码 # 计算电源和二极管电压的有效值 U_rms1 = np.sqrt(integral.simpson(yU1[peak[1]:peak[3]]**2, xint)/T) U_rms2 = np.sqrt(integral.simpson(yU2[peak[1]:peak[3]]**2, xint)/T) # 用有效值计算平均功率 P_from_U_rms1 = U_rms1**2 / R P_from_U_rms2 = U_rms2**2 / R print("P from U_rms Source: ", P_from_U_rms1) print("P from U_rms Diode: ", P_from_U_rms2)
运行后,该结果会与方式一的直接积分功率完全一致。
内容的提问来源于stack exchange,提问作者greasygoosehat
相关产品推荐
相关产品推荐

