from PyQt4.QtGui import * from PyQt4.QtCore import * import sys import numpy as np from scipy import stats from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas import matplotlib.pyplot as plt import random import math QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) class MainWidget(QWidget): def __init__(self,parent=None): super(MainWidget,self).__init__(parent) self.setWindowTitle(self.tr("电子产品寿命分布类型测定")) self.figure = plt.figure() self.canvas = FigureCanvas(self.figure) self.button = QPushButton("作图") self.button.clicked.connect(self.plot) label1=QLabel(self.tr("加速组灯泡电压V")) label2=QLabel(self.tr("加速组寿命T")) labelc=QLabel(self.tr("C:")) labeld=QLabel(self.tr("D:")) label6=QLabel(self.tr("非额定组寿命Tf")) label7=QLabel(self.tr("额定电压下寿命Te")) label8=QLabel(self.tr("Vf")) label9=QLabel(self.tr("Ve")) label10=QLabel(self.tr("计算Ve")) label16=QLabel(self.tr("非额定组寿命Tf")) label17=QLabel(self.tr("额定电压下寿命Te")) label18=QLabel(self.tr("Vf:")) label19=QLabel(self.tr("Ve:")) label40=QLabel(self.tr("输入时间:")) label41=QLabel(self.tr("时间单位:小时")) label42=QLabel(self.tr("故障概率密度f(t):")) label43=QLabel(self.tr("可靠度R(t):")) label44=QLabel(self.tr("累积故障概率F(t):")) label45=QLabel(self.tr("瞬时故障概率λ(t):")) self._40LineEdit1=QLineEdit() self._42LineEdit2=QLineEdit() self._43LineEdit3=QLineEdit() self._44LineEdit4=QLineEdit() self._45LineEdit5=QLineEdit() self.TFLineEdit1=QLineEdit() self.TFLineEdit2=QLineEdit() self.TFLineEdit3=QLineEdit() self.TFLineEdit4=QLineEdit() self.TFLineEdit5=QLineEdit() self.TFLineEdit6=QLineEdit() self.TFLineEdit7=QLineEdit() self.TFLineEdit8=QLineEdit() self.TFLineEdit9=QLineEdit() self.TFLineEdit10=QLineEdit() self.TFLineEdit11=QLineEdit() self.TFLineEdit12=QLineEdit() self.TELineEdit1=QLineEdit() self.TELineEdit2=QLineEdit() self.TELineEdit3=QLineEdit() self.TELineEdit4=QLineEdit() self.TELineEdit5=QLineEdit() self.TELineEdit6=QLineEdit() self.TELineEdit7=QLineEdit() self.TELineEdit8=QLineEdit() self.TELineEdit9=QLineEdit() self.TELineEdit10=QLineEdit() self.TELineEdit11=QLineEdit() self.TELineEdit12=QLineEdit() self.VfLineEdit=QLineEdit() self.VeLineEdit=QLineEdit() self.VLineEdit1=QLineEdit() self.VLineEdit2=QLineEdit() self.VLineEdit3=QLineEdit() self.VLineEdit4=QLineEdit() self.VLineEdit5=QLineEdit() self.VLineEdit6=QLineEdit() self.TLineEdit1=QLineEdit() self.TLineEdit2=QLineEdit() self.TLineEdit3=QLineEdit() self.TLineEdit4=QLineEdit() self.TLineEdit5=QLineEdit() self.TLineEdit6=QLineEdit() self.cLineEdit=QLineEdit() self.dLineEdit=QLineEdit() labelCol=0 contentCol=2 leftLayout=QGridLayout() leftLayout.addWidget(label1,0,labelCol) leftLayout.addWidget(self.VLineEdit1,1,labelCol) leftLayout.addWidget(self.VLineEdit2,2,labelCol) leftLayout.addWidget(self.VLineEdit3,3,labelCol) leftLayout.addWidget(self.VLineEdit4,4,labelCol) leftLayout.addWidget(self.VLineEdit5,5,labelCol) leftLayout.addWidget(self.VLineEdit6,6,labelCol) leftLayout.addWidget(label2,0,contentCol) leftLayout.addWidget(self.TLineEdit1,1,contentCol) leftLayout.addWidget(self.TLineEdit2,2,contentCol) leftLayout.addWidget(self.TLineEdit3,3,contentCol) leftLayout.addWidget(self.TLineEdit4,4,contentCol) leftLayout.addWidget(self.TLineEdit5,5,contentCol) leftLayout.addWidget(self.TLineEdit6,6,contentCol) leftLayout.addWidget(label16,10,labelCol) leftLayout.addWidget(self.TFLineEdit1,11,labelCol) leftLayout.addWidget(self.TFLineEdit2,12,labelCol) leftLayout.addWidget(self.TFLineEdit3,13,labelCol) leftLayout.addWidget(self.TFLineEdit4,14,labelCol) leftLayout.addWidget(self.TFLineEdit5,15,labelCol) leftLayout.addWidget(self.TFLineEdit6,16,labelCol) leftLayout.addWidget(self.TFLineEdit7,17,labelCol) leftLayout.addWidget(self.TFLineEdit8,18,labelCol) leftLayout.addWidget(self.TFLineEdit9,19,labelCol) leftLayout.addWidget(self.TFLineEdit10,20,labelCol) leftLayout.addWidget(self.TFLineEdit11,21,labelCol) leftLayout.addWidget(self.TFLineEdit12,22,labelCol) leftLayout.addWidget(label17,10,contentCol) leftLayout.addWidget(self.TELineEdit1,11,contentCol) leftLayout.addWidget(self.TELineEdit2,12,contentCol) leftLayout.addWidget(self.TELineEdit3,13,contentCol) leftLayout.addWidget(self.TELineEdit4,14,contentCol) leftLayout.addWidget(self.TELineEdit5,15,contentCol) leftLayout.addWidget(self.TELineEdit6,16,contentCol) leftLayout.addWidget(self.TELineEdit7,17,contentCol) leftLayout.addWidget(self.TELineEdit8,18,contentCol) leftLayout.addWidget(self.TELineEdit9,19,contentCol) leftLayout.addWidget(self.TELineEdit10,20,contentCol) leftLayout.addWidget(self.TELineEdit11,21,contentCol) leftLayout.addWidget(self.TELineEdit12,22,contentCol) leftLayout.setColumnStretch(0,1) leftLayout.setColumnStretch(1,1) CalButton=QPushButton(self.tr("计算C、D")) leftLayout.addWidget(CalButton,7,1) leftLayout.addWidget(labelc,8,labelCol) leftLayout.addWidget(self.cLineEdit,8,1) leftLayout.addWidget(labeld,8,contentCol) leftLayout.addWidget(self.dLineEdit,8,3) CalButton2=QPushButton(self.tr("计算Te")) leftLayout.addWidget(CalButton2,23,1) leftLayout.addWidget(label18,24,labelCol) leftLayout.addWidget(self.VfLineEdit,24,1) leftLayout.addWidget(label19,24,contentCol) leftLayout.addWidget(self.VeLineEdit,24,3) leftLayout.addWidget(label40,26,labelCol) leftLayout.addWidget(self._40LineEdit1,26,1) leftLayout.addWidget(label41,26,contentCol) leftLayout.addWidget(label42,27,labelCol) leftLayout.addWidget(self._42LineEdit2,27,1) leftLayout.addWidget(label43,27,contentCol) leftLayout.addWidget(self._43LineEdit3,27,3) leftLayout.addWidget(label44,28,labelCol) leftLayout.addWidget(self._44LineEdit4,28,1) leftLayout.addWidget(label45,28,contentCol) leftLayout.addWidget(self._45LineEdit5,28,3) timeButton=QPushButton(self.tr("可靠性特征值计算")) leftLayout.addWidget(timeButton,29,1) hLayout=QHBoxLayout() hLayout.setSpacing(20) label30=QLabel(self.tr("软件说明:")) self.descTextEdit=QTextEdit() self.descTextEdit.setPlainText(self.tr("电子产品寿命分布类型测定实验")) label31=QLabel(self.tr("分布确定:")) DistributionButton=QPushButton(self.tr("计算")) label11=QLabel(self.tr("判定系数:")) self.RTextEdit=QTextEdit() label12=QLabel(self.tr("P值:")) self.PTextEdit=QTextEdit() label13=QLabel(self.tr("寿命分布类型:")) self.DisTextEdit=QTextEdit() label14=QLabel(self.tr("参数估计:")) self.ETextEdit=QTextEdit() rightLayout=QVBoxLayout() rightLayout.setMargin(10) rightLayout.addLayout(hLayout) rightLayout.addWidget(label30) rightLayout.addWidget(self.descTextEdit) rightLayout.addWidget(label31) rightLayout.addWidget(DistributionButton) rightLayout.addWidget(label11) rightLayout.addWidget(self.RTextEdit) rightLayout.addWidget(label12) rightLayout.addWidget(self.PTextEdit) rightLayout.addWidget(label13) rightLayout.addWidget(self.DisTextEdit) rightLayout.addWidget(label14) rightLayout.addWidget(self.ETextEdit) rightLayout.addWidget(self.canvas) rightLayout.addWidget(self.button) mainLayout=QGridLayout(self) mainLayout.setMargin(15) mainLayout.setSpacing(10) mainLayout.addLayout(leftLayout,0,1) mainLayout.addLayout(rightLayout,0,2) self.connect(CalButton,SIGNAL('clicked()'), self.calculate) self.connect(CalButton2,SIGNAL('clicked()'), self.calculateTe) self.connect(DistributionButton,SIGNAL('clicked()'), self.Distribution) self.connect(timeButton,SIGNAL('clicked()'), self.time) def calculate(self): VLineEdit1 = self.VLineEdit1.text() VLineEdit2 = self.VLineEdit2.text() VLineEdit3 = self.VLineEdit3.text() VLineEdit4 = self.VLineEdit4.text() VLineEdit5 = self.VLineEdit5.text() VLineEdit6 = self.VLineEdit6.text() TLineEdit1 = self.TLineEdit1.text() TLineEdit2 = self.TLineEdit2.text() TLineEdit3 = self.TLineEdit3.text() TLineEdit4 = self.TLineEdit4.text() TLineEdit5 = self.TLineEdit5.text() TLineEdit6 = self.TLineEdit6.text() arrayV=[float(VLineEdit1),float(VLineEdit2),float(VLineEdit3),float(VLineEdit4),float(VLineEdit5),float(VLineEdit6)] arrayT=[float(TLineEdit1),float(TLineEdit2),float(TLineEdit3),float(TLineEdit4),float(TLineEdit5),float(TLineEdit6)] lnV=np.log(arrayV) lnT=np.log(arrayT) global number_c number_c,number_d = self.leastsq(lnV,lnT) self.cLineEdit.setText(str(number_c)) self.dLineEdit.setText(str(number_d)) def leastsq(self,x,y): meanx = sum(x) / len(x) meany = sum(y) / len(y) xsum = 0.0 ysum = 0.0 for i in range(len(x)): xsum += (x[i] - meanx)*(y[i]-meany) ysum += (x[i] - meanx)**2 k = xsum/ysum b = meany - k*meanx c = -k d = np.exp(-b) return c,d #返回拟合的两个参数值 def calculateTe(self):#计算Te TFLineEdit1 = self.TFLineEdit1.text() #获取TF文本框内容 TFLineEdit2 = self.TFLineEdit2.text() TFLineEdit3 = self.TFLineEdit3.text() TFLineEdit4 = self.TFLineEdit4.text() TFLineEdit5 = self.TFLineEdit5.text() TFLineEdit6 = self.TFLineEdit6.text() TFLineEdit7 = self.TFLineEdit7.text() TFLineEdit8 = self.TFLineEdit8.text() TFLineEdit9 = self.TFLineEdit9.text() TFLineEdit10 = self.TFLineEdit10.text() TFLineEdit11 = self.TFLineEdit11.text() TFLineEdit12 = self.TFLineEdit12.text() VfLineEdit=self.VfLineEdit.text() # 获取VF,VE VeLineEdit=self.VeLineEdit.text() global TELineEdit1,TELineEdit2,TELineEdit3,TELineEdit4,TELineEdit5,TELineEdit6,TELineEdit7,TELineEdit8,TELineEdit9,TELineEdit10,TELineEdit11,TELineEdit12 TELineEdit1 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit1)#计算TE TELineEdit2 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit2) TELineEdit3 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit3) TELineEdit4 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit4) TELineEdit5 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit5) TELineEdit6 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit6) TELineEdit7 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit7) TELineEdit8 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit8) TELineEdit9 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit9) TELineEdit10 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit10) TELineEdit11 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit11) TELineEdit12 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit12) self.TELineEdit1.setText(str(TELineEdit1))#设置计算结果文本 self.TELineEdit2.setText(str(TELineEdit2)) self.TELineEdit3.setText(str(TELineEdit3)) self.TELineEdit4.setText(str(TELineEdit4)) self.TELineEdit5.setText(str(TELineEdit5)) self.TELineEdit6.setText(str(TELineEdit6)) self.TELineEdit7.setText(str(TELineEdit7)) self.TELineEdit8.setText(str(TELineEdit8)) self.TELineEdit9.setText(str(TELineEdit9)) self.TELineEdit10.setText(str(TELineEdit10)) self.TELineEdit11.setText(str(TELineEdit11)) self.TELineEdit12.setText(str(TELineEdit12)) def Distribution(self): array_Te = [TELineEdit1,TELineEdit2,TELineEdit3,TELineEdit4,TELineEdit5,TELineEdit6,TELineEdit7,TELineEdit8,TELineEdit9,TELineEdit10,TELineEdit11,TELineEdit12] array_Te.sort() n = len(array_Te) fn = [(i+0.7) / (n+0.4) for i in range(n)] array_fn = np.array(fn) em = np.log(1 / (1 - array_fn)) slope, intercept, r_value1, p_value1, slope_std_error = stats.linregress(array_Te,em) z = np.log(array_fn / (1 - array_fn)) slope, intercept, r_value2, p_value2, slope_std_error = stats.linregress(np.log(array_Te),z) wei = np.log(em) slope, intercept, r_value3, p_value3, slope_std_error = stats.linregress(np.log(array_Te),wei) r = max(r_value1,r_value2*0.8,r_value3) if r == r_value1: sum = 0 for i in array_Te: sum = sum + i λ = len(array_Te) / sum r1 = r_value1 p1 = p_value1 dis1 = "指数分布" elif r == r_value2*0.8: μ,σ = stats.norm.fit(array_Te) r1 = r_value2 p1 = p_value2 dis1 = "正态分布" else: params = stats.exponweib.fit(array_Te, floc=0, f0=1) shape = params[1] scale = params[3] r1 = r_value3 p1 = p_value3 dis1 = "威布尔分布" self.RTextEdit.setText(str(r1)) self.PTextEdit.setText(str(p1)) self.DisTextEdit.setText(dis1) global lamda,flags,m_2,n_2 if dis1 == "指数分布":#参数估计 sum = 0 for i in array_Te: sum = sum + i lamda = len(array_Te) / sum flags = 1 self.ETextEdit.setText("λ = " + str(lamda)) elif dis1 == "正态分布": μ,σ = stats.norm.fit(array_Te) self.ETextEdit.setText("μ = " + str(μ) + "\nσ = " + str(σ)) else: params = stats.exponweib.fit(array_Te, floc=0, f0=1) flags = 2 m_2 = params[1] n_2 = params[3] self.ETextEdit.setText("m = " + str(m_2) + "\nη = " + str(n_2)) def plot(self): flag = flags if flag == 1: t = np.arange(0.0 ,10.0 / lamda ,0.01) s1 = lamda*(t - t + 1) s2 = np.exp(-lamda*t) s3 = 1 - np.exp(-lamda*t) s4 = lamda*np.exp(-lamda*t) ax1 = self.figure.add_subplot(221)#分割出四个图 ax2 = self.figure.add_subplot(222) ax3 = self.figure.add_subplot(223) ax4 = self.figure.add_subplot(224) ax1.hold(False) ax2.hold(False) ax3.hold(False) ax4.hold(False) ax1.plot(t, s1) ax1.set_ylabel("r(t)") ax2.plot(t, s2) ax2.set_ylabel("R(t)") ax3.plot(t, s3) ax3.set_ylabel("F(t)") ax4.plot(t, s4) ax4.set_ylabel("f(t)") # 更新canvas self.canvas.draw() else: t = np.arange(0.0 ,5.0 ,0.01) m = m_2 n = n_2 s5 = ((m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)) / (np.exp(-(t / n)**m)) s6 = np.exp(-(t / n)**m) s7 = 1 - np.exp(-(t / n)**m) s8 = (m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m) ax5 = self.figure.add_subplot(221)#分割出四个图 ax6 = self.figure.add_subplot(222) ax7 = self.figure.add_subplot(223) ax8 = self.figure.add_subplot(224) ax5.hold(False) ax6.hold(False) ax7.hold(False) ax8.hold(False) ax5.plot(t, s5) ax5.set_ylabel("r(t)") ax6.plot(t, s6) ax6.set_ylabel("R(t)") ax7.plot(t, s7) ax7.set_ylabel("F(t)") ax8.plot(t, s8) ax8.set_ylabel("f(t)") # refresh canvas self.canvas.draw() def time(self): timeLineEdit = self._40LineEdit1.text() t = float(timeLineEdit) if flags ==1: lamdal = lamda r = lamdal R = np.exp(-lamdal*t) F = 1 - np.exp(-lamdal*t) f = lamdal*np.exp(-lamdal*t) self._42LineEdit2.setText(str(f)) self._43LineEdit3.setText(str(R)) self._44LineEdit4.setText(str(F)) self._45LineEdit5.setText(str(r)) else: m = m_2 n = n_2 f = (m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m) R = np.exp(-(t / n)**m) F = 1 - np.exp(-(t / n)**m) r = ((m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)) / (np.exp(-(t / n)**m)) self._42LineEdit2.setText(str(f)) self._43LineEdit3.setText(str(R)) self._44LineEdit4.setText(str(F)) self._45LineEdit5.setText(str(r)) app=QApplication(sys.argv) main=MainWidget() main.show() app.exec_()
Python PyQt4模块编写的小型GUI程序
最新推荐文章于 2023-02-23 23:21:48 发布