每个人!我正在使用python pyqt4设计用于计算PV面板的VI曲线的GUI的项目。我想输入所需的参数并计算PV面板的输出电流,并使用matplotlib绘制VI曲线。我的代码运行良好。但是,我发现从应用程序获得的曲线是错误的,而直接计算它是正确的。计算方法完全相同。但是当我把计算放在GUI上时是不同的。代码在这里:
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
q = 1.6 * (10 ** -19)
k = 1.38 * (10 ** -23)
Tref = 25
Eg = 1.1
def calReverseSaturationCurrent(Isc,Voc,Ns,A,Tc):
a = np.exp(q*Voc/(Ns*k*A*Tc))-1
return Isc/a
def calSaturationCurrent(Irs,Tc,A):
return Irs*((Tc/Tref)**3)*np.exp(q*Eg*(1/Tref - 1/Tc)/(k*A))
def calPhotocurrent(Isc,Ki,Tc,insolation):
return (Isc + Ki*(Tc-Tref))*insolation
def calOutputCurrent(Isc,Voc,Ns,A,Tc,Ki,insolation,Np,Rs,Rsh,V):
Irs = calReverseSaturationCurrent(Isc,Voc,Ns,A,Tc)
Is = calSaturationCurrent(Irs,Tc,A)
Iph = calPhotocurrent(Isc,Ki,Tc,insolation)
I0 = 0
I = np.array([])
def f(ii,*arg):
temp_v = arg[0]
return ii - Np*Iph+Np*Is*(np.exp(q*(temp_v/Ns+ii*Rs/Np)/(k*Tc*A))-1)
for vv in V:
ii=fsolve(f,I0,args=vv)
I = np.append(I,ii)
return I
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.toolbar.hide()
self.idealFactor = QtGui.QLabel('Ideal Factor A')
self.shortCircuitCurrent = QtGui.QLabel('Short Circuit Current')
self.openCircuitVoltage = QtGui.QLabel('Open Circuit Voltage')
self.temperatureCoefficient = QtGui.QLabel('Temperature Coefficient')
self.seriesCells = QtGui.QLabel('Series Cells')
self.parallelCells = QtGui.QLabel('Parallel Cells')
self.seriesResistance = QtGui.QLabel('Series Resistance')
self.shuntResistance = QtGui.QLabel('Shunt Resistance')
self.outputVoltageMin = QtGui.QLabel('Min Output Voltage')
self.outputVoltageMax = QtGui.QLabel('Max Output Voltage')
self.workingTemperature = QtGui.QLabel('Working Temperature')
self.isolation = QtGui.QLabel('Isolation')
self.idealFactorEdit = QtGui.QDoubleSpinBox()
self.idealFactorEdit.setValue(1.0)
self.shortCircuitCurrentEdit = QtGui.QDoubleSpinBox()
self.shortCircuitCurrentEdit.setValue(3.17)
self.openCircuitVoltageEdit = QtGui.QDoubleSpinBox()
self.openCircuitVoltageEdit.setValue(21.8)
self.temperatureCoefficientEdit = QtGui.QDoubleSpinBox()
self.temperatureCoefficientEdit.setValue(0.065)
self.seriesCellsEdit = QtGui.QDoubleSpinBox()
self.seriesCellsEdit.setValue(36.0)
self.parallelCellsEdit = QtGui.QDoubleSpinBox()
self.parallelCellsEdit.setValue(1.0)
self.seriesResistanceEdit = QtGui.QDoubleSpinBox()
self.seriesResistanceEdit.setValue(0.1)
self.shuntResistanceEdit = QtGui.QDoubleSpinBox()
self.shuntResistanceEdit.setValue(float("inf"))
self.outputVoltageMinEdit = QtGui.QDoubleSpinBox()
self.outputVoltageMinEdit.setValue(8)
self.outputVoltageMaxEdit = QtGui.QDoubleSpinBox()
self.outputVoltageMaxEdit.setValue(11)
self.workingTemperatureEdit = QtGui.QDoubleSpinBox()
self.workingTemperatureEdit.setValue(25)
self.isolationEdit = QtGui.QDoubleSpinBox()
self.isolationEdit.setValue(1)
self.calBtn = QtGui.QPushButton('Get V-I',self)
self.calBtn.clicked.connect(self.getVI)
grid = QtGui.QGridLayout()
self.setLayout(grid)
grid.addWidget(self.idealFactor, 1, 0)
grid.addWidget(self.idealFactorEdit, 1, 1)
grid.addWidget(self.shortCircuitCurrent, 1, 2)
grid.addWidget(self.shortCircuitCurrentEdit, 1, 3)
grid.addWidget(self.openCircuitVoltage, 2, 0)
grid.addWidget(self.openCircuitVoltageEdit, 2, 1)
grid.addWidget(self.temperatureCoefficient, 2, 2)
grid.addWidget(self.temperatureCoefficientEdit, 2, 3)
grid.addWidget(self.seriesCells, 3, 0)
grid.addWidget(self.seriesCellsEdit, 3, 1)
grid.addWidget(self.parallelCells, 3, 2)
grid.addWidget(self.parallelCellsEdit, 3, 3)
grid.addWidget(self.seriesResistance, 4, 0)
grid.addWidget(self.seriesResistanceEdit, 4, 1)
grid.addWidget(self.shuntResistance, 4, 2)
grid.addWidget(self.shuntResistanceEdit, 4, 3)
grid.addWidget(self.outputVoltageMax, 5, 0)
grid.addWidget(self.outputVoltageMaxEdit, 5, 1)
grid.addWidget(self.outputVoltageMin, 5, 2)
grid.addWidget(self.outputVoltageMinEdit, 5, 3)
grid.addWidget(self.workingTemperature, 6, 0)
grid.addWidget(self.workingTemperatureEdit, 6, 1)
grid.addWidget(self.isolation, 6, 2)
grid.addWidget(self.isolationEdit, 6, 3)
grid.addWidget(self.calBtn, 7,0)
grid.addWidget(self.canvas, 8, 0, 6, 0)
self.setGeometry(300, 300, 1000, 800)
self.setWindowTitle('PYPV')
self.setWindowIcon(QtGui.QIcon('pvPanel.png'))
self.show()
def getVI(self):
A = self.idealFactorEdit.value()
Isc = self.shortCircuitCurrentEdit.value()
Voc = self.openCircuitVoltageEdit.value()
Ki = self.temperatureCoefficientEdit.value()
Ns = self.seriesCellsEdit.value()
Np = self.parallelCellsEdit.value()
Rs = self.seriesResistanceEdit.value()
Rsh = self.shuntResistanceEdit.value()
Vmin = self.outputVoltageMinEdit.value()
Vmax = self.outputVoltageMaxEdit.value()
V = np.linspace(Vmin,Vmax,1000)
Tc = self.workingTemperatureEdit.value()
insolation = self.isolationEdit.value()
I = calOutputCurrent(Isc,Voc,Ns,A,Tc,Ki,insolation,Np,Rs,Rsh,V)
plt.cla()
ax = self.figure.add_subplot(111)
ax.plot(V,I)
self.canvas.draw()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我确定计算方法是正确的。我没有使用GUI进行测试。结果很好。代码如下:
import numpy as np
from scipy.optimize import fsolve
from matplotlib import pyplot as plt
q = 1.6 * (10 ** -19)
k = 1.38 * (10 ** -23)
Tref = 25
Eg = 1.1
A = 1.0
V = np.linspace(8,11,1000)
Isc = 3.17
Ki = 0.07
Ns = 36.0
Np = 1.0
Voc = 21.8
Rs = 0.1
#Rsh = float("inf")
Tc = 25
insolation = 1
def calReverseSaturationCurrent(Isc,Voc,Ns,A,Tc):
a = np.exp(q*Voc/(Ns*k*A*Tc))-1
return Isc/a
def calSaturationCurrent(Irs,Tc,A):
return Irs*((Tc/Tref)**3)*np.exp(q*Eg*(1/Tref - 1/Tc)/(k*A))
def calPhotocurrent(Isc,Ki,Tc,insolation):
return (Isc + Ki*(Tc-Tref))*insolation
def calOutputCurrent(Isc,Voc,Ns,A,Tc,Ki,insolation,Np,Rs,Rsh,V):
Irs = calReverseSaturationCurrent(Isc,Voc,Ns,A,Tc)
Is = calSaturationCurrent(Irs,Tc,A)
Iph = calPhotocurrent(Isc,Ki,Tc,insolation)
I0 = 0
I = np.array([])
def f(ii,*arg):
temp_v = arg[0]
return ii - Np*Iph+Np*Is*(np.exp(q*(temp_v/Ns+ii*Rs/Np)/(k*Tc*A))-1)
for vv in V:
ii=fsolve(f,I0,args=vv)
I = np.append(I,ii)
return I
def makePlots(I,V):
plt.plot(V,I)
plt.show()
def test():
I = calOutputCurrent(Isc,Voc,Ns,A,Tc,Ki,insolation,Np,Rs,Rsh,V)
makePlots(I,V)
if __name__ == "__main__":
test()
英语不是我的母语。我希望我能很好地描述问题。提前致谢!
我的猜测是您使用的是Python-2,该/
运算符对整数的行为不同于对浮点数的行为。在第一种情况下,它是整数除法:结果是整数,其余部分被舍弃。在第二种情况下,这通常是您期望除法的结果。这是许多错误的根源,因此在Python-3中,/
运算符始终是常规除法(返回浮点数),并且可以使用进行整数除法//
。有关更多详细信息,请参阅PEP-238。请注意,您的calSaturationCurrent
函数包含这样的整数除法:1/Tc
在Python-2中产生0。
为了使Python-2的行为像Python 3一样,您可以使用“未来导入”。如果在程序的顶部(在其他导入语句之前)添加以下行,则无论有没有GUI,都将得到相同的结果。
from __future__ import division
现在,您可能还为非GUI版本使用了Python-2,那么为什么首先要获得不同的结果?我最好的猜测是,在程序的gui版本中,从Qt获得的值略有不同(远远落后于小数点)。您的程序容易受此影响的事实表明它可能存在错误。
例如,如果打印该calSaturationCurrent
函数的结果,则不带GUI时为3.42723507299e-122,带GUI时为0.0。这意味着f
您要求解其根的函数始终非常接近0或正好为0。我不相信结果,而是从对f
自身进行绘制开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句