电子测量技术-测量数据误差处理大作业


测量数据误差处理

一、题目要求

       设计测量数据误差处理的通用程序,提供测试数据输入、粗大误差判别准则等的人机交互界面。

二、设计思路

       在对测量数据进行处理的过程中我们通常经过以下四步:首先求出这组数据的均值及标准差估计值,再检查有无异常数据,异常数据处理之后判断有无随时间变化的变值系差,最后给出置信区间。要进行程序设计,我们就要对这四部分的原理进行分析。

1. 求平均值及标准偏差估计值

\[\bar V = 1/N \sum_{i=1}^{N}{V_i} \]

\[\hat{\sigma}(V)=\sqrt\frac{\sum_{i=1}^{N}{u_i}-N\bar U^2}{N-1} \]

2. 检查有无异常数据

?       剔除异常数据是一件需慎重对待的事。若有多个可疑数据同时超过检验所定置信区间,应逐个剔除,先剔出残差绝对值最大的,然后重新计算标准偏差估计值,再行判别。若有多个相同数据超出范围时,也应逐个剔除。当偏离正态分布、测量次数少时,检验可靠性将受影响。在一组测量数据中,可疑数据应极少;反之,说明系统工作不正常。

常用准则:
       莱特准则:正态分布,n>10的情况

\[|x_i-\bar x|>3\hat{\sigma}(X), n>=10 \]

       肖维纳准则: 正态分布,n>5的情况

\[|x_i-\bar x|>ch\hat{\sigma}(X) \]

       格拉布斯准则:正态样本或接近正态样本,g值根据重复测量次数n及置信概率确定,n>2的情况

\[|x_i-\bar x|>g\hat{\sigma}(X) \]

3. 判断有无随时间变化的变值系统误差

       系统误差分为恒值系差和变值系差。

       常用校准的方法来检查恒值系统误差是否存在;依据仪器说明书、校准报告上的修正值,对测量结果进行修正。测量前分析测量方案或方法中可能造成系统误差的因素,并尽力消除这些因素。用修正值对结果进行修正,估算出未能消除而残留下来的系统误差对最终测量结果的影响,即测量结果的不确定度 。

       变值误差一般有以下两种判据方法:

       ① 马利可夫判据:用于累进性系差的判别。

\[M=\sum_{i=1}^{(n-1)/2}{v_i}-\sum_{i=(n+3)/2+1}^{n}{v_i},N为奇数 \]

\[M=\sum_{i=1}^{n/2}{v_i}-\sum_{i=n/2+1}^{n}{v_i},N为偶数 t_a \]

\[当|M|>=max|v_i|,存在累进性系差 \]

       ② 阿卑-赫梅特判据常用于判别周期性系差,也可用来发现累进性系差。

\[若|\sum_{i=1}^{n-1}{v_i}{v_{i+1}}|>\sqrt{n-1}\hat{\sigma}^2(X) \]

       则认为测量中存在变值系差。

4. 给出置信区间

       先求出平均值的标准偏差,根据n值,查t分布表,在给定置信概率下,查出ta的值,然后求出置信区间。

\[平均值的标准偏差:\hat{\sigma}(\bar v)=\frac{\hat{\sigma}(\bar v)}{\sqrt n} \]

\[置信区间:[\bar U-t_a\hat{\sigma}(U), \bar U+t_a\hat{\sigma}(U)] \]

三、程序设计

1. 人机界面

       人机界面使用QTdesigner设计,在使用时需要数据输入窗口、粗大误差判别准则的选择、确定按键、清除按键、结果显示窗口以及流程显示窗口,如下图所示:

2. 流程图

3. 功能函数(具体代码见main.py)

;所有功能函数均封装在MyWindow类中。
self.aver = np.mean(self.data_arrary)   # 求均值
self.var = np.var(self.data_arrary)     # 求方差
# 均值和方差的计算直接使用numpy的库函数
def get_sigema(self):           # 计算标准差估计
def get_cancha(self):           # 计算残差
def Wright_rule(self):          # 莱特准则处理数据
def Chauvenet_rule(self):       # 肖维纳准则处理数据
def Grubbs_rule(self):          # 格拉布斯准则处理数据
def cal_zone(self):			   # 计算置信区间
def malikefu_rule(self):        # 玛利科夫判据
def abei_hemeite_rule(self):    # 阿卑-赫梅特判据

四、实验结果

       测试数据:2.72,2.75,2.65,2.71,2.62,2.45,2.62,2.70,2.67,2.73,2.74

五、源代码

main.py
import mywin
import numpy as np
import sys
import time
from PyQt5 import QtWidgets



class MyWindow(mywin.Ui_MainWindow):
    # 数据
    data_arrary = []    # 存放数据数组
    data_num = 0        # 数组长度
    data_flag = 0       # 判断数组是否输入
    data_p_flag = 0     # 判断概率是否输入
    data_p = 0          # 置信概率

    aver = 0            # 期望
    var = 0             # 方差
    sigema = 0          # 标准差估计
    cancha = []         # 残差
    str_rule = ''       # 粗大误差处理准则
    cal_flag = 1

    def __init__(self,ui):
        super().setupUi(ui)         #调用父类的setupUI函数
        
        self.num_ok.clicked.connect(self.get_num)   # 输入栏后面的 √ 按钮点击后获取输入数据
        self.clear.clicked.connect(self.cclear)     # 清除按钮
        self.comboBox.activated.connect(self.choose_rule)   # 选择粗大误差处理准则
        self.p_ok.clicked.connect(self.get_p)
        self.start_run.clicked.connect(self.start)
        return

    def get_p(self):
        
        if ( self.data_flag == 0 ):
            self.output.append("请先输入数据!")
            return
        
        self.data_p = self.input_p.toPlainText()
        
        if ( self.data_p == ''):                    
            self.output.append("请输入概率!")
            return
        
        self.data_p = float(self.data_p)

        if ( self.data_p > 1 or self.data_p <= 0):  # 概率在(0,1)之间
            self.data_p = 0
            self.output.append("概率输入错误!")
            return
        
        self.data_p_flag = 1
        return     
    def get_sigema(self):               # 计算标准差估计
        sigema2 = 0
        for i in range(self.data_num):
            sigema2 = sigema2 + self.data_arrary[i]*self.data_arrary[i]
        sigema2 = (sigema2-self.data_num*self.aver*self.aver)/(self.data_num-1)
        sigema = np.sqrt(sigema2)
        return sigema
    
    def get_num(self):
        str = self.input.toPlainText()  # 从输入栏获取输入的信息
        if(str == ''):
            self.output.append("请输入数据!")
            return
        count = 0
        # 判断输入数据中的非法字符
        for s in str:
            if ( ord(s) >= 48 and ord(s) <= 57 or ord(s) == 32 or ord(s) == 46):    # 32是空格,46是小数点
                count = count + 1
        
        if ( count < len(str) ):
            self.output.append("数据输入有误,请重试")
            str = ''
            count = 0
            return
        # 字符串分割
        self.data_arrary = str.split(' ')
        
        self.data_num = len(self.data_arrary)
        # 按空格分割后转为数字
        for index in range(self.data_num):
            self.data_arrary[index] = eval(self.data_arrary[index])
        
        if ( self.data_num <=2  ):
            self.output.append("数据过少,请重试")
            self.data_num = 0
            self.data_arrary = []
            return
        self.data_flag = 1                         # 表示数据已经输入
        # print(self.data_arrary)
        self.aver = np.mean(self.data_arrary)   # 求均值
        self.var = np.var(self.data_arrary)     # 求方差
        self.sigema = self.get_sigema()  # 求标准差估计
        self.cancha = self.get_cancha()         # 残差
        # print(self.aver,self.var)

        self.output.append("均值为{:6f}".format(self.aver))
        self.output.append("方差为{:6f}".format(self.var))
        self.output.append("标准差估计为{:6f}".format(self.sigema))

        return

    def get_cancha(self):           # 计算残差
        self.cancha = []
        for i in range(self.data_num):
            self.cancha.append(self.data_arrary[i]-self.aver)

    def cclear(self):
        self.input.clear()
        self.data_arrary = []    # 存放数据数组
        self.data_num = 0        # 数组长度
        self.data_flag = 0       # 表示数据未输入
        self.var = 0             # 方差
        self.aver = 0            # 均值
        self.sigema = 0          # 标准差估计
        self.str_rule = ''       # 粗大误差准则
        self.data_p = 0          # 置信概率
        self.data_p_flag = 0     # 概率未输入
        self.cancha = []         # 残差
        self.cal_flag = 1
        self.output.clear()
        self.result.clear()
        self.input_p.clear()

    def choose_rule(self):
        if ( self.data_flag == 0 ):
            self.output.append("请先输入数据!")
            return                  
        # 先输入数据,再选准则(与数据量有关)
        self.str_rule = self.comboBox.currentText()     # 获取选项

        if ( self.str_rule == "莱特准则"):              # 莱特准则要在n>10时使用    
            if self.data_num < 10:
                self.output.append("有{}个数据,不可用{},请重新选择".format(self.data_num,self.str_rule))
                self.str_rule = ''
                return
       
        if ( self.str_rule == "肖维纳准则"):              # 肖维纳准则要在n>5时使用    
            if self.data_num < 5:
                self.output.append("有{}个数据,不可用{},请重新选择".format(self.data_num,self.str_rule))
                self.str_rule = ''
                return
        
        if ( self.str_rule == "格拉布斯准则"):              # 格拉布斯准则要在n>2时使用    
            if self.data_num < 2:
                self.output.append("有{}个数据,不可用{},请重新选择".format(self.data_num,self.str_rule))
                self.str_rule = ''
                return
        self.output.append("已选择{}".format(self.str_rule))
        
        # print(self.str_rule)
    def start(self):
        
        if ( self.data_flag == 0 ):
            self.output.append("请先输入数据")
            return

        if ( self.data_p_flag == 0 ):
            self.output.append("请输入置信概率")
            return
        
        if ( self.str_rule == ""):
            self.output.append("请先选择粗大误差处理准则")
            return

        # 粗大误差处理
        if ( self.str_rule == "莱特准则"):              # 莱特准则要在n>10时使用    
            self.Wright_rule()
        if ( self.str_rule == "肖维纳准则"):              # 肖维纳准则要在n>5时使用   
            self.Chauvenet_rule()
        if ( self.str_rule == "格拉布斯准则"):              # 格拉布斯准则要在n>2时使用    
            self.Grubbs_rule()

        # 判断变值系统误差
        self.malikefu_rule()        # 玛利科夫判据
        self.abei_hemeite_rule()      # 阿卑-赫梅特判据
        if ( self.cal_flag == 1 ):
        # 根据t分布表计算置信区间
            self.cal_zone()
        else:
            self.cclear()

    def cal_zone(self):
        sigema_bar = self.sigema/np.sqrt(self.data_num) # 平均值的标准偏差
        dict_t = {   3 : {0.9 : 1.638, 0.95 : 2.353, 0.975 : 3.182, 0.99 : 4.541, 0.995 : 5.841 },
                     4 : {0.9 : 1.533, 0.95 : 2.132, 0.975 : 2.766, 0.99 : 3.747, 0.995 : 4.604 },
                     5 : {0.9 : 1.476, 0.95 : 2.015, 0.975 : 2.571, 0.99 : 3.365, 0.995 : 4.032 },
                     6 : {0.9 : 1.44 , 0.95 : 1.943, 0.975 : 2.447, 0.99 : 3.143, 0.995 : 3.707 },
                     7 : {0.9 : 1.415, 0.95 : 1.895, 0.975 : 2.365, 0.99 : 2.998, 0.995 : 3.499 },
                     8 : {0.9 : 1.397, 0.95 : 1.860, 0.975 : 2.306, 0.99 : 2.896, 0.995 : 3.355 },
                     9 : {0.9 : 1.383, 0.95 : 1.833, 0.975 : 2.262, 0.99 : 2.821, 0.995 : 3.250 },
                    10 : {0.9 : 1.372, 0.95 : 1.812, 0.975 : 2.228, 0.99 : 2.764, 0.995 : 3.169 },
                    11 : {0.9 : 1.363, 0.95 : 1.796, 0.975 : 2.201, 0.99 : 2.718, 0.995 : 3.106 },
                    12 : {0.9 : 1.356, 0.95 : 1.782, 0.975 : 2.179, 0.99 : 2.681, 0.995 : 3.055 },
                    13 : {0.9 : 1.350, 0.95 : 1.771, 0.975 : 2.160, 0.99 : 2.650, 0.995 : 3.012 },}     # t分布表(部分)
        ta = dict_t[self.data_num][self.data_p]
        self.output.append("根据t分布表,ta的取值为{}".format(ta))
        min = self.aver - ta * sigema_bar
        max = self.aver + ta * sigema_bar       # 计算置信区间
        self.result.append('({:.2f},{:.2f})'.format(min,max))     # 显示结果


    def malikefu_rule(self):            # 玛利科夫判据
        M = 0
        self.get_cancha()
        if (self.data_num % 2 == 0):     # N为偶数时
            # print(type(self.data_num))
            for i in range(int(self.data_num/2)):
                M = M + self.cancha[i] - self.cancha[i+int((self.data_num)/2)]
        else:
            for i in range(int((self.data_num-1)/2)):
                M = M + self.cancha[i] - self.cancha[i+int((self.data_num+1)/2)]
        max = 0
        for i in range(self.data_num):
            if (max < abs(self.cancha[i]) ):
                max = abs(self.cancha[i])
        if (abs(M) >= max):
            self.output.append("根据玛利科夫判据,发现累进性系差")
            
            pass        # 修正累进系差,这里没修正,pass了
       
        else:
            self.output.append("根据玛利科夫判据,未发现累进性系差")

    
    def abei_hemeite_rule(self):          # 阿卑-赫梅特判据
        summ = 0
        self.get_cancha()
        for i in range(self.data_num-1):
            summ += self.cancha[i]*self.cancha[i+1]

        if (abs(summ) > self.sigema*self.sigema*np.sqrt(self.data_num-1)):
            self.output.append("根据阿卑-赫梅判据,发现周期性系差")
            pass            # 修正周期性系差,这里没修正,pass了
        else:
            self.output.append("根据阿卑-赫梅判据,未发现周期性系差")
    
    def Wright_rule(self):          # 莱特准则处理数据
        for i in range(self.data_num):
            if (abs(self.data_arrary[i]-self.aver) > 3*self.sigema):
                # 剔除坏值
                self.data_num -= 1
                if(self.data_num < 2 ):         # 数据剔除完说明...实验测量失败了
                    self.output.append("实验测量有问题...数据3s后清除")
                    time.sleep(3)
                    self.cal_flag = 0
                    return  
                self.output.append("根据{},{}可能为坏值,已剔除,剩余{}个数据".format(self.str_rule, self.data_arrary[i],self.data_num))
                del self.data_arrary[i]
                # 剔除坏值后运算要重修进行
                self.aver = np.mean(self.data_arrary)   # 求均值
                self.var = np.var(self.data_arrary)     # 求方差
                self.sigema = self.get_sigema()  # 求标准差估计
                 # 数据更新后从头开始算,即将执行的这一层出来之后直接break循环,退出程序
                self.output.append("重新开始计算")
                self.output.append("均值为{:6f}".format(self.aver))
                self.output.append("方差为{:6f}".format(self.var))
                self.output.append("标准差估计为{:6f}".format(self.sigema))
                if(self.data_num > 10):
                    self.Wright_rule()
                else:                       # 剔除至数量少于10时用肖维纳
                    self.str_rule = "肖维纳准则"
                    self.output.append("剩余数值较少,切换为{}".format(self.str_rule))
                    self.Chauvenet_rule()
                break
        return

    def Chauvenet_rule(self):          # 肖维纳准则处理数据
        dict_Chauvenet = { 5 : 1.68, 
                           6 : 1.73,
                           7 : 1.79,
                           8 : 1.86,
                           9 : 1.92,
                          10 : 1.96,
                          11 : 2.00,
                          12 : 2.03,
                          13 : 2.07,
                          14 : 2.10,
                          15 : 2.13,
                          16 : 2.16,
                          17 : 2.18,
                          18 : 2.20,
                          19 : 2.22,
                          20 : 2.24,
                          30 : 2.39,
                          35 : 2.45,
                          40 : 2.50,
                          50 : 2.58,
                         100 : 2.81}    # 肖维纳准则表
        ch = dict_Chauvenet[self.data_num]
        self.output.append("ch的值为{}".format(ch))
        for i in range(self.data_num):
            if(abs(self.data_arrary[i]-self.aver) > ch*self.sigema):
                # 剔除坏值
                self.data_num -= 1
                if(self.data_num < 2 ):         # 数据剔除完说明...实验测量失败了
                    self.output.append("实验测量有问题...数据3s后清除")
                    time.sleep(3)
                    self.cal_flag = 0
                    return             
                self.output.append("根据{},{}可能为坏值,已剔除,剩余{}个数据".format(self.str_rule, self.data_arrary[i],self.data_num))
                del self.data_arrary[i]
                # 剔除坏值后运算要重修进行
                self.aver = np.mean(self.data_arrary)   # 求均值
                self.var = np.var(self.data_arrary)     # 求方差
                self.sigema = self.get_sigema()  # 求标准差估计
                self.cancha = self.get_cancha()         # 残差
                # 数据更新后从头开始算,即将执行的这一层出来之后直接break循环,退出程序
                self.output.append("重新开始计算")
                self.output.append("均值为{:6f}".format(self.aver))
                self.output.append("方差为{:6f}".format(self.var))
                self.output.append("标准差估计为{:6f}".format(self.sigema))
                if(self.data_num > 5):
                    self.Chauvenet_rule()
                else:                       # 剔除至数量少于10时用肖维纳
                    self.str_rule = "格拉布斯准则"
                    self.output.append("剩余数值较少,切换为{}".format(self.str_rule))
                    self.Grubbs_rule()
                
                break

        return

    def Grubbs_rule(self):          # 格拉布斯准则处理数据
        dict_Grubbs = {  3 : {0.9 : 1.148, 0.95 : 1.153, 0.975 : 1.155, 0.99 : 1.155, 0.995 : 1.155 },
                         4 : {0.9 : 1.425, 0.95 : 1.463, 0.975 : 1.481, 0.99 : 1.492, 0.995 : 1.496 },
                         5 : {0.9 : 1.602, 0.95 : 1.672, 0.975 : 1.715, 0.99 : 1.749, 0.995 : 1.764 },
                         6 : {0.9 : 1.729, 0.95 : 1.822, 0.975 : 1.887, 0.99 : 1.944, 0.995 : 1.973 },
                         7 : {0.9 : 1.828, 0.95 : 1.938, 0.975 : 2.020, 0.99 : 2.097, 0.995 : 2.139 },
                         8 : {0.9 : 1.909, 0.95 : 2.032, 0.975 : 2.126, 0.99 : 2.221, 0.995 : 2.274 },
                         9 : {0.9 : 1.977, 0.95 : 2.110, 0.975 : 2.215, 0.99 : 2.323, 0.995 : 2.387 },
                        10 : {0.9 : 2.036, 0.95 : 2.176, 0.975 : 2.290, 0.99 : 2.410, 0.995 : 2.482 },
                        11 : {0.9 : 2.088, 0.95 : 2.234, 0.975 : 2.355, 0.99 : 2.485, 0.995 : 2.564 },
                        12 : {0.9 : 2.134, 0.95 : 2.285, 0.975 : 2.412, 0.99 : 2.550, 0.995 : 2.636 },
                        13 : {0.9 : 2.175, 0.95 : 2.331, 0.975 : 2.462, 0.99 : 2.670, 0.995 : 2.699 },
                        14 : {0.9 : 2.213, 0.95 : 2.371, 0.975 : 2.507, 0.99 : 2.659, 0.995 : 2.755 },
                        15 : {0.9 : 2.247, 0.95 : 2.409, 0.975 : 2.549, 0.99 : 2.705, 0.995 : 2.806 },}
        g = dict_Grubbs[self.data_num][self.data_p]
        self.output.append("g的值为{}".format(g))
        for i in range(self.data_num):
            if(abs(self.data_arrary[i]-self.aver) > g*self.sigema):
                # 剔除坏值
                self.data_num -= 1
                if(self.data_num <= 2 ):         # 数据剔除完说明...实验测量失败了
                    self.output.append("实验测量有问题...数据3s后清除")
                    time.sleep(3)
                    self.cal_flag = 0
                    return  
                self.output.append("根据{},{}可能为坏值,已剔除,剩余{}个数据".format(self.str_rule, self.data_arrary[i],self.data_num))
                del self.data_arrary[i]
                # 剔除坏值后运算要重修进行
                self.aver = np.mean(self.data_arrary)   # 求均值
                self.var = np.var(self.data_arrary)     # 求方差
                self.sigema = self.get_sigema()  # 求标准差估计
                self.cancha = self.get_cancha()         # 残差
                # 数据更新后从头开始算,即将执行的这一层出来之后直接break循环,退出程序
                self.output.append("重新开始计算")
                self.output.append("均值为{:6f}".format(self.aver))
                self.output.append("方差为{:6f}".format(self.var))
                self.output.append("标准差估计为{:6f}".format(self.sigema))
                self.Grubbs_rule()
                break
        return 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  #监听当前app,来自QtWidgets.QApplication
    MainWindow = QtWidgets.QMainWindow()
    ui = MyWindow(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())       #退出app

my_ui.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'e:\学!\电子测量技术\大作业\测量数据误差处理\my_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(816, 401)
        MainWindow.setMinimumSize(QtCore.QSize(816, 401))
        MainWindow.setMaximumSize(QtCore.QSize(816, 401))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.start_run = QtWidgets.QPushButton(self.centralwidget)
        self.start_run.setGeometry(QtCore.QRect(50, 300, 161, 51))
        self.start_run.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(16)
        self.start_run.setFont(font)
        self.start_run.setObjectName("start_run")
        self.clear = QtWidgets.QPushButton(self.centralwidget)
        self.clear.setGeometry(QtCore.QRect(250, 300, 161, 51))
        self.clear.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.clear.setFont(font)
        self.clear.setObjectName("clear")
        self.output = QtWidgets.QTextBrowser(self.centralwidget)
        self.output.setGeometry(QtCore.QRect(510, 30, 271, 341))
        self.output.setMaximumSize(QtCore.QSize(271, 16777215))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(14)
        self.output.setFont(font)
        self.output.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.output.setObjectName("output")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 0, 381, 71))
        self.label.setMaximumSize(QtCore.QSize(381, 16777215))
        font = QtGui.QFont()
        font.setFamily("隶书")
        font.setPointSize(28)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.input = QtWidgets.QTextEdit(self.centralwidget)
        self.input.setGeometry(QtCore.QRect(40, 90, 401, 41))
        self.input.setMaximumSize(QtCore.QSize(401, 16777215))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(16)
        self.input.setFont(font)
        self.input.setObjectName("input")
        self.num_ok = QtWidgets.QPushButton(self.centralwidget)
        self.num_ok.setGeometry(QtCore.QRect(440, 90, 31, 41))
        self.num_ok.setMaximumSize(QtCore.QSize(31, 16777215))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(12)
        self.num_ok.setFont(font)
        self.num_ok.setObjectName("num_ok")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(40, 70, 441, 16))
        self.label_2.setMaximumSize(QtCore.QSize(441, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(50, 160, 161, 16))
        self.label_3.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(250, 140, 161, 41))
        self.comboBox.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(12)
        self.comboBox.setFont(font)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(50, 260, 161, 16))
        self.label_4.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(12)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.result = QtWidgets.QTextBrowser(self.centralwidget)
        self.result.setGeometry(QtCore.QRect(250, 250, 221, 41))
        self.result.setMaximumSize(QtCore.QSize(221, 16777215))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(14)
        self.result.setFont(font)
        self.result.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.result.setObjectName("result")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(480, 0, 20, 371))
        self.line.setMaximumSize(QtCore.QSize(20, 16777215))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(50, 210, 161, 21))
        self.label_5.setMaximumSize(QtCore.QSize(161, 16777215))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.p_ok = QtWidgets.QPushButton(self.centralwidget)
        self.p_ok.setGeometry(QtCore.QRect(410, 200, 31, 41))
        self.p_ok.setMaximumSize(QtCore.QSize(31, 16777215))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(12)
        self.p_ok.setFont(font)
        self.p_ok.setObjectName("p_ok")
        self.input_p = QtWidgets.QTextEdit(self.centralwidget)
        self.input_p.setGeometry(QtCore.QRect(250, 200, 161, 41))
        self.input_p.setMaximumSize(QtCore.QSize(401, 16777215))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(16)
        self.input_p.setFont(font)
        self.input_p.setObjectName("input_p")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(520, 10, 261, 16))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(11)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.start_run.setText(_translate("MainWindow", "确 定"))
        self.clear.setText(_translate("MainWindow", "清 除"))
        self.label.setText(_translate("MainWindow", "测量数据误差处理"))
        self.input.setHtml(_translate("MainWindow", "\n"
"\n"
"


")) self.num_ok.setText(_translate("MainWindow", "√")) self.label_2.setText(_translate("MainWindow", "输入数据,用空格隔开,全部输入完成后点击√")) self.label_3.setText(_translate("MainWindow", "去除粗大误差准则")) self.comboBox.setItemText(0, _translate("MainWindow", "莱特准则")) self.comboBox.setItemText(1, _translate("MainWindow", "肖维纳准则")) self.comboBox.setItemText(2, _translate("MainWindow", "格拉布斯准则")) self.label_4.setText(_translate("MainWindow", "置信区间(结果)")) self.result.setHtml(_translate("MainWindow", "\n" "\n" "


")) self.label_5.setText(_translate("MainWindow", "置信概率(小数)")) self.p_ok.setText(_translate("MainWindow", "√")) self.input_p.setHtml(_translate("MainWindow", "\n" "\n" "


")) self.label_6.setText(_translate("MainWindow", " "))