陳瑋
北京理工大學(xué)珠海學(xué)院 廣東珠海 519088
在實(shí)驗(yàn)過程中,會(huì)由于實(shí)驗(yàn)方法、實(shí)驗(yàn)人員等因素造成數(shù)據(jù)異常。該異??赡苁怯纱执笳`差造成的。粗大誤差是指在測量過程中,偶爾產(chǎn)生的某些不應(yīng)有的反常因素造成的測量數(shù)值超出正常測量誤差范圍的小概率誤差[1]。含有但不屬于異常值的粗大誤差的數(shù)據(jù)會(huì)干擾對實(shí)驗(yàn)結(jié)果的分析,甚至歪曲實(shí)驗(yàn)結(jié)果。若不剔除異常值,而把一些包含較大正常誤差但不屬于異常值的數(shù)據(jù)舍棄或保留一些包含較小粗大誤差的異常值,就會(huì)錯(cuò)估了儀器的精確等級[1]。對于傳統(tǒng)的數(shù)據(jù)處理,當(dāng)數(shù)據(jù)量比較大時(shí),計(jì)算容易出現(xiàn)錯(cuò)誤,而且結(jié)果不直觀。而MATLAB軟件以其強(qiáng)大的數(shù)據(jù)處理,簡潔的程序編程,很適合作為數(shù)據(jù)處理的輔助工具。將二者結(jié)合起來,傳統(tǒng)的數(shù)據(jù)處理只需很短的時(shí)間就可以判斷出是否含有粗大誤差。
萊以特準(zhǔn)則適用測量次數(shù)較多的測量列,狄克松準(zhǔn)則適用測量次數(shù)較少而要求較高的測量列。其中萊以特準(zhǔn)則判別粗大誤差比較簡單,但當(dāng)測量次數(shù)較多時(shí),計(jì)算過程比較繁瑣;而狄克松準(zhǔn)則是對測量列中的最小值和最大值同時(shí)進(jìn)行判斷,因此一次就可以迅速判別是否含有粗大誤差。
圖1 測量數(shù)據(jù)處理流程圖
1.1.1 找出含有粗大誤差的數(shù)值
首先假設(shè)粗大誤差的序號為1,然后比較每個(gè)測量值的殘差絕對值是否和最大的殘差絕對值相等,若相等,則第一個(gè)數(shù)據(jù)含有粗差,否則n加1,一共執(zhí)行l(wèi)次。其程序如下:
n=1
%找出粗大誤差值對應(yīng)的序號
for i=1:l
if s(i)==max_
%比較殘差的絕對值和最大的殘差絕對值是否相等
break;
else
n=n+1;
end
1.1.2 剔除粗大誤差后的排序
qa是剔除一個(gè)粗差后剩余的數(shù)組x1的下標(biāo)數(shù)值,pb是還沒剔除粗差的數(shù)組x的下標(biāo)數(shù)值。程序如下:
qa=1;pb=1;
for i=1:l
if i==n
%若在賦值過程中遇到x中的粗差,則直接跳過
pb=pb+1;
else
x1(qa)=x(pb);
%剩余測量列的數(shù)據(jù)
qa=qa+1; pb=pb+1;
end
……
1.2.1 萊以特準(zhǔn)則
如果在測量列中有|vi|>3σ則可認(rèn)為該數(shù)據(jù)含有粗大誤差,應(yīng)該進(jìn)行剔除[1]。如圖1(2)所示,其主要程序?yàn)椋?/p>
s=abs(v); %對殘差求絕對值
max_=max(s);
%求殘差絕對值中的最大值
if max_>3*q
%萊以特準(zhǔn)則
while (max_>3*q)
sprintf('第 %d 次剔除誤差: ',j)
n=1 ;
%找出粗大誤差值對應(yīng)的列號
for i=1:l
if s(i)==max_
break;
else
n=n+1;
end
……
第一次粗差發(fā)現(xiàn)和剔除后,對剩余測量列要重新進(jìn)行標(biāo)準(zhǔn)差的計(jì)算來完成新一輪粗差的判別,依次循環(huán),直到|vi|>3σ測量列再無粗差為止。
1.2.2 狄克松準(zhǔn)則
狄克松準(zhǔn)則先要對測量列的數(shù)值按照大小順序排序,小數(shù)值在前,大數(shù)值在后;然后根據(jù)統(tǒng)計(jì)量rij和臨界值r0的關(guān)系,同時(shí)完成重新排序后的測量列兩端數(shù)值粗差的發(fā)現(xiàn)與剔除;剔除粗差后,根據(jù)測量次數(shù)的多少,重新選擇統(tǒng)計(jì)量rij,再次和臨界值r0進(jìn)行比較。
表1 狄克松準(zhǔn)則的統(tǒng)計(jì)量
通過選擇α顯著度,可以得到各統(tǒng)計(jì)量的臨界值r0(n,α),當(dāng)測量的統(tǒng)計(jì)值rij大于臨界值,就可以相信X(1)或X(n)含有粗大誤差的[1]。
如圖1(3)所示,其主要程序?yàn)椋?/p>
xn=sort(x);
%對測量數(shù)據(jù)進(jìn)行排序
l=length(xn);
r1=(xn(l)-xn(l-2))/(xn(l)-xn(3));
%計(jì)算最大值
r2=(xn(1)-xn(3))/(xn(1)-xn(l-2));
%計(jì)算最小值
r0=dks(l-2);
dks_f1=1;
% 最大值無誤差;
dks_f2=1;
% 最小值無誤差;
if r1>r0
dks_f1=0;
表2 MA T L A B運(yùn)行結(jié)果
% 最大值有誤差;
elseif r2>r0
dks_f2=0;
% 最小值有誤差;
else
disp('該測量列不存在粗大誤差')
end
……
以《誤差理論與數(shù)據(jù)處理》的數(shù)據(jù)為例:
對某量進(jìn)行15次測量,測得數(shù)據(jù)為28.53 28.52 28.50 29.52 28.53 28.53 28.50 28.49 28.49 28.51 28.53 28.52 28.49 28.40 28.50,如果這些測得值已消除系統(tǒng)誤差,判別是否含有粗大誤差?[1]
測量列中數(shù)據(jù)存在一個(gè)粗大誤差的條件下,萊以特準(zhǔn)則是最為簡單方便的。而當(dāng)測量列中數(shù)據(jù)存在多個(gè)粗大誤差的條件下,由于萊以特準(zhǔn)則每次只能發(fā)現(xiàn)一個(gè)粗差,剔除完還要按照原有流程再發(fā)現(xiàn),再剔除,導(dǎo)致計(jì)算過程繁瑣;而狄克松準(zhǔn)則雖然多了個(gè)排序,但由于是對數(shù)據(jù)中的最值同時(shí)進(jìn)行判斷,其處理過程還是比萊以特準(zhǔn)則快得多。
本文根據(jù)粗大誤差的特點(diǎn),以萊以特和狄克松準(zhǔn)則為例,用MATLAB軟件設(shè)計(jì)了處理粗大誤差的算法。該算法簡單易行,結(jié)果顯示明確,能形象直觀的給出處理的結(jié)果。