疏失误差处理常用的算法

来源:互联网 发布:淘宝网中老年秋季女装 编辑:程序博客网 时间:2024/06/05 23:52
1引言

在计量测试中由于各种干扰因素的存在,常常会引起疏失误差,疏失误差又叫过失误差,是指显然与事实不符的误差。它通常是由于操作者失误、系统内部器件受损或接线松动、脱落、外界突发的冲击引起的。疏失误差的存在对测量结果是一种严重的歪曲,必须予以剔除。

2常用的疏失误差剔除算法

2·1莱特准则

判别疏失误差一般采用莱特准则,即把剩余误差绝对值超过3σ的数据Xi判为疏失误差点删除。但莱特准则的判据是建立在测量次数n→∞的前提下的。当n值有限,特别是当n≤值很小时,这种采用3σ作为判据的方法就不很可靠了。尤其是当n≤10时,以n=10为例,由贝塞耳公式得:

由上式可以看出:当n≤10时,即使在测量数据中含有疏失误差,应用莱特准则也无法剔除。所以,莱特准则只能用于处理大容量样本数据的疏失误差,在处理少量采集数据的疏失误差时存在着很大的局限性。

2·2格罗贝斯判据准则

格罗贝斯判据准则是另一种常用的疏失误差剔除方法,它是基于测得值服从正态分布假设上的一种递归算法。其计算步骤为:

(1)将测试数据按升序排列,并分别计算均值X、标准差σ。

(2)根据顺序统计的原理,找出统计量g的确切分布,g的定义为:

(3)在给定显著水平a(通常取0·05或0·01)后,即可用查表法找出格罗贝斯统计量的临界值g0(n,a),然后将测量顶端值与其比较,判断是否应该删除。

利用格罗贝斯准则进行判据不受样本数据容量大小的限制,对单个或多个疏失误差的剔除都有较好的效果,在实际测试分析中得到了大量的应用。

但格罗贝斯准则判据是一个递归算法,每次只能剔除一个可疑值,并要计算一次σ,需重复进行判别,直到判定无可疑值为止,而且其判别还涉及到查表操作。在用计算机编程实现时,必须引入数据库或者大容量数组,影响了程序设计的结构优化,降低了软件的运行速度,在某些需要实时响应的场合受到一定的限制。更重要的是,该准则是以测量数据列服从正态分布为前提的,在实际测量,尤其是电子测量中,很多数据服从于非正态分布(如均匀分布、三角分布等),此时还采用格罗贝斯准则就会产生较大误差,影响测试的准确性。

3利用分布图法剔除疏失误差

分布图法是一种新型的数据处理算法,其算法如下:

首先对N个测量结果从小到大进行排序,得到测量序列:

X1,X2,………XN

其中X1为下极限,XN为上极限。

再定义中位值为:

上四分位数Fu为区间[XM,XN]的中位数,下四分位数Fl为区间[X1,XM]的中位数。四分位离散度为:

认定与中位数的距离大于βdF的数据为离异数据,即无效数据的判断区间为[ρ12]:

式中的β为常数,其大小取决于系统的测量精度,通常取1、2等值。

区间[ρ1,ρ2]内的测量数据被认为是有效的一致性测量数据,利用这一有效区间的数据选定可以排除50%的离异值干扰。而且中位值XM和四分位离散度dF的选择与极值点的大小无关,仅取决于数据的分布位置,有效区间的获得与需要排除的可疑值关系不大。而且用分布图法来获得一致性测量数据的方法不受数据分布的限制,能够增强数据处理对不确定因素的适应性,即具有鲁棒性。

在实际编程实现分布图法时,由于该算法不需要复杂的数据结构,同时还具有运算量小,计算机编程容易等优点,不仅可以用于校准测试数据的后期处理,还可以将其应用于测量的实时数据处理和控制中。下面是笔者用Visual C++开发的程序源代码:

void Distri Graph(int count,float in[100])

{

∥数据排序。

qksort(in,count);

∥定义中位值和四分位离散度。

If(MOD(count,2)==1)

{

i=count+1;

xm=in[i/2];

if(MOD(i,4)==0

{

fu=(in[i/2+i/4+1]+in[i/2+i/4])/2;

fl=(in[i/4+1]+in[i/4])/2;

}

else

{

fu=in[(count+i/2)];

fl=in[(1+i/2)/2];

}

}

else

{

xm=(in[count/2+1]+in[count/2])/2;

if(MOD(count,4)==0

{

fu= (in[count/2 + count/4 + 1] + in

[count/2 count/4])/2;

fl=(in[count/4+1]+in[count/4])/2;

}

else

{

fu=in[(count+1+count/2)/2];

fl=in[(1+count/2)/2];

}

}

df=fu-fl;

∥定义判别区间并进行判断剔除。

llimit=fl-df;

hlimit=fu+df;

for(j=1;j<=count;j++)

{

if((in[j]hlimit))

delete(in,j)

}

}

在程序设计中要注意两点:

(1)中位值的选取是算法的关键,要分别根据数据长度的奇偶分别定义,而且当输入数据分成两段后,仍需要根据两个数据段的奇偶来决定上、下四分位数。

(2)在该程序的设计中,为了方便起见,数组下标以1为起始,而不是通常的以0开始。

4结束语

本文是笔者根据多年从事计量检定工作对数据处理和误差分析的研究总结而成,设计开发的程序经过多次实验运行验证,取得了较满意的分析结果。但由于本人水平有限,算法还有许多有待改进完善的地方,文中如有不妥之处,欢迎大家批评指正。

摘自:中国计量测控网

http://www.bzwz.com/html_news/News_43797.html

0 0
原创粉丝点击