python pyqt matplotlib计算GUI应用程序打印错误

2024-05-18 14:49:30 发布

您现在位置:Python中文网/ 问答频道 /正文

所有人! 我正在进行一个项目,使用python pyqt4设计一个用于计算光伏板V-I曲线的GUI。我想输入所需的参数,计算光伏板的输出电流,并使用matplotlib绘制V-I曲线。 我的代码运行得很好。然而,我发现我从应用程序得到的曲线是错误的,而直接计算它是正确的。计算方法完全相同。但是当我把计算放在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()

以下是两个图: Without using GUIWith GUI

英语不是我的第一语言。我希望我能很好地描述这个问题。 提前谢谢!你知道吗


Tags: selfdefnpvociscgridtcns
1条回答
网友
1楼 · 发布于 2024-05-18 14:49:30

我猜您使用的是Python-2,/操作符对整数的行为与对浮点的行为不同。第一种情况是整数除法:结果是整数,余数被丢弃。在第二种情况下,这是您通常期望从部门得到的结果。这是许多错误的根源,因此在Python-3中/操作符总是一个正则除法(返回一个浮点),整数除法可以用//来完成。有关详细信息,请参见PEP-238。注意,calSaturationCurrent函数包含这样一个整数除法:1/Tc在Python-2中产生0。你知道吗

要使Python-2像python3一样工作,可以使用“future import”。如果在程序顶部添加以下行(在其他import语句之前),则无论是否使用GUI,都会得到相同的结果。你知道吗

from __future__ import division

现在,您可能还将Python-2用于非GUI版本,那么为什么一开始会得到不同的结果呢?我最好的猜测是,在程序的gui版本中,从Qt得到的值略有不同(远远落后于小数点)。事实上,你的程序是容易受到这表明它可能有错误。你知道吗

例如,如果打印calSaturationCurrent函数的结果,则不带GUI时为3.42723507299e-122,带GUI时为0.0。这意味着函数f的根总是非常接近0,或者正好是0。我不相信这些结果,我会从绘制f本身开始。你知道吗

相关问题 更多 >

    热门问题