測量數據誤差處理
一、題目要求
設計測量數據誤差處理的通用程序,提供測試數據輸入、粗大誤差判別准則等的人機交互界面。
二、設計思路
在對測量數據進行處理的過程中我們通常經過以下四步:首先求出這組數據的均值及標准差估計值,再檢查有無異常數據,異常數據處理之后判斷有無隨時間變化的變值系差,最后給出置信區間。要進行程序設計,我們就要對這四部分的原理進行分析。
1. 求平均值及標准偏差估計值
2. 檢查有無異常數據
剔除異常數據是一件需慎重對待的事。若有多個可疑數據同時超過檢驗所定置信區間,應逐個剔除,先剔出殘差絕對值最大的,然后重新計算標准偏差估計值,再行判別。若有多個相同數據超出范圍時,也應逐個剔除。當偏離正態分布、測量次數少時,檢驗可靠性將受影響。在一組測量數據中,可疑數據應極少;反之,說明系統工作不正常。
常用准則:
萊特准則:正態分布,n>10的情況
肖維納准則: 正態分布,n>5的情況
格拉布斯准則:正態樣本或接近正態樣本,g值根據重復測量次數n及置信概率確定,n>2的情況
3. 判斷有無隨時間變化的變值系統誤差
系統誤差分為恆值系差和變值系差。
常用校准的方法來檢查恆值系統誤差是否存在;依據儀器說明書、校准報告上的修正值,對測量結果進行修正。測量前分析測量方案或方法中可能造成系統誤差的因素,並盡力消除這些因素。用修正值對結果進行修正,估算出未能消除而殘留下來的系統誤差對最終測量結果的影響,即測量結果的不確定度 。
變值誤差一般有以下兩種判據方法:
① 馬利可夫判據:用於累進性系差的判別。
② 阿卑-赫梅特判據常用於判別周期性系差,也可用來發現累進性系差。
則認為測量中存在變值系差。
4. 給出置信區間
先求出平均值的標准偏差,根據n值,查t分布表,在給定置信概率下,查出ta的值,然后求出置信區間。
三、程序設計
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", "<!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", " "))