使用电压(时间)数据计算二极管的平均功率



我正试图使用记录的电压(时间(数据来计算多个二极管的平均功率,这是不对称的。我写了一个脚本,使用scipy.integral包中的simpson函数来计算平均电压,该函数可用于计算平均功率,也可用于通过将数据平方并除以电阻来直接计算平均功率。它似乎运行良好
我的问题是,如果我使用平均电压的积分来计算功率,结果与我从simpson积分得到的结果不同
Source的结果并不遥远,但对于二极管来说,它总是大约是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来源:0.020998072067580663 p二极管:0.006863115468771637
U来源:4.130740894612934 U二极管:1.6910455615565707
p来自U来源:0.017063020338427666 p来自U二极管:0.0028596350912601775

使用此数据集:https://pastebin.com/WtTdZVi5

电压(时间(-电源图(蓝色(和二极管图(橙色(我试过降低噪音,但积分没有太大变化。

希望粗体文本能让更易读一点

这不是编码问题,您的代码很好。问题是物理学不太正确。

如你所知,瞬时功率p是V**2/R。然后,您将平均功率计算为总能量(即一段时间内的积分功率(除以该段时间。一切都很好。

然而,如果你想从"平均电压"计算平均功率,你必须取RMS值(均方根,即对电压的平方进行积分,然后在最后对所有值求平方根(。当然,当你做v_{rms}**2时,你只需要"撤消"平方根,基本上再次得到相同的积分。

让我们看看这是如何工作的:

def rms(y: np.array) -> float:
return np.sqrt(np.mean(y**2))
y1rms = rms(yU1int)
y2rms = rms(yU2int)
P1 = y1rms**2 / 1000
P2 = y2rms**2 / 1000
int1 = integral.simpson(y1int, xint) / T
int2 = integral.simpson(y2int, xint) / T
print(P1, int1)
print(P2, int2)

0.020994432904029910.020998072067580663

0.006865154632322394 0.006863115468771637

所以,总之,你不能只积分电压的绝对值,然后期望得到正确的平均功率,你需要取rms平均值。

最新更新