電子測量技術-測量數據誤差處理大作業


測量數據誤差處理

一、題目要求

       設計測量數據誤差處理的通用程序,提供測試數據輸入、粗大誤差判別准則等的人機交互界面。

二、設計思路

       在對測量數據進行處理的過程中我們通常經過以下四步:首先求出這組數據的均值及標准差估計值,再檢查有無異常數據,異常數據處理之后判斷有無隨時間變化的變值系差,最后給出置信區間。要進行程序設計,我們就要對這四部分的原理進行分析。

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設計,在使用時需要數據輸入窗口、粗大誤差判別准則的選擇、確定按鍵、清除按鍵、結果顯示窗口以及流程顯示窗口,如下圖所示:
image

2. 流程圖

image

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
image

五、源代碼

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", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'黑體\'; font-size:16pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\'; font-size:9pt;\"><br /></p></body></html>"))
        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", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'黑體\'; font-size:14pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\'; font-size:9pt;\"><br /></p></body></html>"))
        self.label_5.setText(_translate("MainWindow", "置信概率(小數)"))
        self.p_ok.setText(_translate("MainWindow", "√"))
        self.input_p.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'黑體\'; font-size:16pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\'; font-size:9pt;\"><br /></p></body></html>"))
        self.label_6.setText(_translate("MainWindow", " "))



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM