python pyqt matplotlib计算GUI应用程序绘制错误

Jiabin Shen

每个人!我正在使用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()

下面是两个图:不使用GUI 和GUI

英语不是我的母语。我希望我能很好地描述问题。提前致谢!

titusjan

我的猜测是您使用的是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python pyqt matplotlib计算GUI应用程序绘制错误

来自分类Dev

关闭PyQt4 Gui应用程序后,Python内核崩溃

来自分类Dev

如何安全退出pyqt应用程序python

来自分类Dev

Python - PyQt - matplotlib:drawRectangle 方法

来自分类Dev

使用GUI分发计算机应用程序(Python)

来自分类Dev

使用GUI分发计算机应用程序(Python)

来自分类Dev

Python PyQt 将后端与 GUI 分开

来自分类Dev

Python-PyQt Matplotlib图位置

来自分类Dev

Python-PyQt Matplotlib图位置

来自分类Dev

将PyQt Gui应用程序与Django项目结合

来自分类Dev

在单独的线程中运行pyQT GUI主应用程序

来自分类Dev

在PyQT应用程序的主线程中使用回调方法在Python中启动新线程

来自分类Dev

如何隐藏PyQt4 Python应用程序的任务栏图标?

来自分类Dev

使用 PyInstaller 编译 PyQt5 Python 应用程序时遇到问题

来自分类Dev

如何在Python中使用PyQt5绘制折线?

来自分类Dev

当我在python和pyqt中关闭应用程序时未运行类析构函数

来自分类Dev

Python PyQT:如何从辅助线程调用GUI函数?

来自分类Dev

Python(PyQT)中的GUI窗口立即闪烁并关闭?

来自分类Dev

无法使PyQt5 Gui工作,python3

来自分类Dev

为什么python Subprocess.stdin.write()杀死PyQt Gui

来自分类Dev

使用 PyQt5 for Python gui 的可滚动标签

来自分类Dev

在 Pyqt5 GUI 中显示来自 Python 文件的数据

来自分类Dev

无法启动设计的pyQt应用程序

来自分类Dev

pyQt和线程应用程序崩溃

来自分类Dev

带有 Python 计算器应用程序的 GUI // 为什么按钮不显示?

来自分类Dev

Python PyQt QtoolbuttonPopup模式

来自分类Dev

无法获取程序以正确运行Python / Qt / PyQt

来自分类Dev

如何编译使用python 3.8的PyQt5程序

来自分类Dev

使用PySide / PyQt处理QFileSystemWatcher错误-Python 3.x

Related 相关文章

  1. 1

    python pyqt matplotlib计算GUI应用程序绘制错误

  2. 2

    关闭PyQt4 Gui应用程序后,Python内核崩溃

  3. 3

    如何安全退出pyqt应用程序python

  4. 4

    Python - PyQt - matplotlib:drawRectangle 方法

  5. 5

    使用GUI分发计算机应用程序(Python)

  6. 6

    使用GUI分发计算机应用程序(Python)

  7. 7

    Python PyQt 将后端与 GUI 分开

  8. 8

    Python-PyQt Matplotlib图位置

  9. 9

    Python-PyQt Matplotlib图位置

  10. 10

    将PyQt Gui应用程序与Django项目结合

  11. 11

    在单独的线程中运行pyQT GUI主应用程序

  12. 12

    在PyQT应用程序的主线程中使用回调方法在Python中启动新线程

  13. 13

    如何隐藏PyQt4 Python应用程序的任务栏图标?

  14. 14

    使用 PyInstaller 编译 PyQt5 Python 应用程序时遇到问题

  15. 15

    如何在Python中使用PyQt5绘制折线?

  16. 16

    当我在python和pyqt中关闭应用程序时未运行类析构函数

  17. 17

    Python PyQT:如何从辅助线程调用GUI函数?

  18. 18

    Python(PyQT)中的GUI窗口立即闪烁并关闭?

  19. 19

    无法使PyQt5 Gui工作,python3

  20. 20

    为什么python Subprocess.stdin.write()杀死PyQt Gui

  21. 21

    使用 PyQt5 for Python gui 的可滚动标签

  22. 22

    在 Pyqt5 GUI 中显示来自 Python 文件的数据

  23. 23

    无法启动设计的pyQt应用程序

  24. 24

    pyQt和线程应用程序崩溃

  25. 25

    带有 Python 计算器应用程序的 GUI // 为什么按钮不显示?

  26. 26

    Python PyQt QtoolbuttonPopup模式

  27. 27

    无法获取程序以正确运行Python / Qt / PyQt

  28. 28

    如何编译使用python 3.8的PyQt5程序

  29. 29

    使用PySide / PyQt处理QFileSystemWatcher错误-Python 3.x

热门标签

归档