唐伟 钟伟 段国艳
(四川工程职业技术学院电气信息工程系 四川省德阳市 618000)
在测量数据中,无论是用仪器自动测量还是手动测量,总会包含误差,如粗大误差、系统误差、随机误差,在这些误差中粗大误差对测量数据的准确性危害最大,所以在测量结果中找出粗大误差并剔除尤为重要。然而关于误差的算法计算量巨大且复杂,因此,通过软件程序实现粗大误差分析与处理将有效提高误差处理的速度和准确性;因为测量误差跟测量条件和测量次数等有密切关系,不同的粗大误差判据有不同的优势,所以研究根据等精度有限次的测量次数选择不同的粗大误差处理算法,对数据的处理有着重要的意义。
误差是测得值与被测量的真值之间的差[1],其数学表达式为△x=x-x0,其中△x 为误差,x 为测量值,x0为真值。在测量中,真值本质上是不存在的,实际上常用满足规定精度的量值来代替真值使用。根据误差的产生的原因,通常将误差分为系统误差、随机误差、粗大误差。
粗大误差是对测量结果的明显歪曲。产生粗大误差的原因主要是因为测量人员的疏忽造成读值或记录的错误,也可能因为外界的原因造成,如振动、热冲击等引起测量仪器的示值改变。一旦发现粗大误差就应该被剔除[1]。判别粗大误差的方法有多种,同时各具优缺点。
图1:主程序框图
图2:3σ 判据子程序框图
粗大误差是明显超统计规律预期值的误差,如果测量值xi遵循公式(3)的计算结果,则说明引起该误差的测量值xi为粗大误差[2]。
λ 实际上是正态分布置信系数,可以通过查肖维纳准则表得到,也可以通过查正态分布积分表获得。
判别的依据是:先假设测量列中某个测得值xj为粗大误差,去掉xj后再计算测量列的算术平均值若式(4)成立则说明xj含有粗大误差;否则,认为xj不含有粗大误差。
图3:对101 个测量值中的包含粗大误差的数据剔除仿真结果
将测量值xi,按测得值大小顺序排成顺序统计量x(i),即规定选取为判别粗大误差的临界值,其中n 为测量次数, 为显著度。若则说明x(i)包含粗大误差。否则,x(i)则不含粗大误差。可以通过程序自动查询格罗布斯准则表得到。在计算出x(i)为粗大误差后,应该剔除x(i)并重新计算测得值的个数n。对测得值个数要求不多,判断的可靠性要求较高的场合比较适用。
根据不同的测量次数和要求,可选择不同的判断依据[3],最终做出粗大误差的优化处理选择。主流程框图如图1 所示。主程序根据测量列的数据多少和具体要求选择相应的粗大误差处理子程序,每个子程序负责将含有粗大误差的测得值挑选出来并返回给主程序,主程序剔除含有粗大误差的数据后对测量数据列重新排列,然后计算出
子程序流程样例如图2 所示,本文以莱以特准则判据为例,其余判据子程序处理流程类似图2。在每个子程序中含有计算及vi和残余误差,目的是使主程序简单。为了保证计算结果的正确性,在程序中引入了算术平均值校核算法。每个子程序结构基本上相同,保证了子程序的简洁性。子程序基本上分为4 个模块及查表模块,计算及校核模块,判据比较和数据剔除与重排模块。在数据剔除与重排时先将要剔除的数据暂存,再将数组从剔除点顺序搬移,从而构成一个新的数据列,然后将被剔除的数据放于数组的最后,待下次计算时程序不将被剔除的数据包含进去,这样用最简单的算法实现了数据的剔除与重排。
根据图1 和图2 流程图,采用C 语言实现主程序和3σ 粗大误差判别算法,以给定的101 个测量值为例,完成包含粗大误差数据的剔除。
主程序主要对粗大误差处理的子函数调用和处理后数据列的显示,根据测量列数据的规模,主程序自动调用3σ 粗大误差判断算法程序,在子程序中实现了对包含粗大误差的测量值的剔除和数据列的重新排列,最后将坏值个数返回给主程序,并整理出来不包含粗大误差的测量值。在Win-Turbo C 环境下仿真运行,可以准确的对测量数据列进行粗大误差的处理。仿真结果如图3 所示。
在运行结果中,xp 是平均值,dx 是标准差,j 是当前需要处理的数据个数,每剔除一个包含粗大误差的测量值,j 就会自减1,a是子程序处理过程中定义的数组名,org 代表原测量列数组。因为篇幅所限,这里只给出了程序运行的后期结果。从程序运行的结果可知,j=92 时表示当前还剩92 个测量数据,已经判断出9 个测量值包含粗大误差而被剔除,程序继续对剩下的92 个数据进行计算并判断,最后又剔除一个,剩下91 个测量数据不包含粗大误差。
本文针对误差处理计算量大的问题,用软件算法实现了对测量数据列中包含有粗大误差的数据剔除,并完成对原始测量数据的重新排列;同时为提高误差处理的准确性,根据等精度测量的次数,采用不同的软件算法对测量数据处理,实现了对粗大误差精确的剔除。根据文中提出的软件算法,通过程序仿真验证,软件程序计算的快速性和运行结果的准确性达到了工程使用要求。同时该软件算法程序也可以作为一个独立的粗大误差处理工具应用于科研和工程测量中。