当前位置:文档之家› 粗大-系统-随机误差处理

粗大-系统-随机误差处理

课程设计用仪器设备名称此次课程设计用到的仪器设备和软件包括: (1) 个人计算机; (2) Matlab 软件。

课程设计过程1、课程设计处理原理:此次课程开展的数据处理包:(1)粗大误差处理;(2)系统误差处理;(3)随机误差处理。

他们的原理分别分析如下:(1)粗大误差处理对于粗大误差,采用莱以特准则和罗曼诺夫斯基准则。

莱以特准则:求出数据的算数平均值x 和标准差σ,将残差的绝对值i x v 和3σ进行比较,大于3σ的值都认为是粗大误差。

罗曼诺夫斯基准则:首先剔除该数据中的最大值,然后再按照t 分布检验,求出该项与剔除后平均值的差,即d x x −,再与()2,K n a σ−进行比较,如果前者大于等于后者,那么该数据有系统误差。

(2)系统误差处理对于系统误差,我们采用了残差总和判断法,阿贝-赫梅判别法,标准差比较法,他们的原理如下:残差总和判断法:对于等精度的系统测量数据12,,...n x x x ,设相对的残差分别是12,,...n v v v ,若有12ni i v =>∑,则怀疑测量数据有系统误差阿贝-赫梅判别法:对于等精度的系统测量数据12,,...n x x x ,设相对的残,分别是12,,...n v v v ,1223111...nn n i i i u v v v v v v v v−+==+++=∑,如果2u >,则判定该组数据含有系统误差。

标准差比较法:对于等精度的系统测量数据12,,...n x x x ,设相对的残差分别是12,,...n v v v ,用不同的公式计算标准差,通过比较可以发现存在的系统误差。

用贝塞尔公式计算,1s=,用别捷尔斯公式计算,1s=211s s ≥,则怀疑测量中存在系统误差。

(3)随机误差处理我们考虑了正态分布和t 分布两种情况,通过置信概率和自由度分别在正态分布积分表和t 分布表中找到对应的t 值,再求出极限误差lim x t ςσ=+。

2课程设计的整体流程图如图(一)所示。

在图(一)中,粗大误差分析,系统误差分析,随机误差分析都作为子程序存在。

首先我们是将存储在txt 文件中的测量数据导入到matlab 中,然后进行在子程序中用两种方式进行粗大误差分析,并返回剔除异常值以及剔除异常值后的测量数据。

接着进行系统误差分析,用了三种方法检测是否具有系统误差,并返回测量结果。

之后进行随机误差分析,返回两种分布的极限误差。

最后将本次测量结果都写入到txt 文件中。

斯基准则进行分析。

首先看莱以特准则,计算测量数据第i项的残差,之后比较残差与三倍标准差的的值大小,如果残差大于三倍标准差就剔除该项,否则进行下一项的比较,比较完成后返回剔除异常值后剩余的数据。

另外是罗曼诺夫斯基准则,首先将最大值作为怀疑对象,从测量数据中剔除出来。

然后求该值与剔除后数据的平均值之差,与t分布下的标准差进行比较,如果前者大,则进行下一次循环,否则结束循环,并把该次循环中的最大值重新放入测量数据中,最后返回剔除异常值后剩余的数据。

(3)系统误差处理计算判断方法所需要的数值,然后对各个方法的判断条件进行比较,如果满足就返回有系统误差,否则返回没有系统误差。

如(图四)所示,首先接收已经剔除异常值的数据,然后计算平均值和标准差,进行正态分布和t 分布的查表,我将正态分布和t 分布的表格数据存储到matlab 的数组中,并将它们封装成独立的子m 程序,只要输入对应的自由度和置信概率就可以得到相应的t 值。

然后将两个t 值乘上标准差得到对应的极限误差,并返回两个极限误差。

3、实验规划如何输入数据:将测量结果以行存储在txt文件中,,在matlab中利用textread函数读取txt数据,并将其存储在一维数组中。

如何使用matlab:首先新建一个主文件并保存,接着建立了5个函数,如下所示: Thick_Error.m 粗大误差处理Systematic_Error.m 系统误差处理Random_Error.m 随机误差处理Normal_distribution.m正态分布t值查找T_FenBu.m t分布t值查找如何编写程序:依照误差处理的原理一步一步进行数据分析,将所得结果进行打印在命令行窗口,并将所有数据打印在txt文件中如何程序运行、调试程序:运行上边三角运行按钮,还可以选中某些行代码右键运行。

运行错误时会设置断点,一步一步运行,并看着工作区的显示的数值是否是我想得到的那个值。

通常我还在程序中加一些打印字符串,用于发现错误之处。

4、代码分析(1)数据输入:path="C:\Users\dingshuai\Desktop\误差\课程设计\误差处理.txt";date=textread(path,'%f',15)';首先将txt文件路径存储在path中,利用textread函数读取存储在txt文件中的15个测量数据,并存储在数组date中(2)主函数粗大误差处理[result_1,rid_value_1,result_2,rid_value_2]=Thick_Error(date);%莱以特准则:rid_value_1表示剔除值 result_1表示剔除后剩余数据%罗曼诺夫斯基准则:rid_value_2表示剔除值 result_2表示剔除后剩余数据disp("莱以特准则剔除数据");disp(rid_value_1);disp("罗曼诺夫斯基准则");disp(rid_value_2);判断系统误差[answer_1,answer_2,answer_3]=Systematic_Error(result_2); %answer 是否具有系统误差% answer_1,answer_2,answer_3分别对应残差总和判断法,阿贝-赫梅判别法,标准差比较法的判断disp("残差总和判断法是否有系统误差");disp(answer_1);disp("阿贝-赫梅判别法是否有系统误差");disp(answer_2);disp("标准差比较法是否有系统误差");disp(answer_3);随机误差[limit_error_zt,limit_error_t]=Random_Error(result_2);%分别表示正态分布和t分布的极限误差disp("正态分布极限误差")disp(limit_error_zt);disp("t分布的极限误差");disp(limit_error_t);写入文件fileID=fopen(path,'w');fprintf(fileID,'%.2f ',date); fprintf(fileID,'\n');fprintf(fileID,'算数平均值: %.2f\n',mean(result_2));fprintf(fileID,'莱以特准则粗大误差剔除数据: %.2f\n',rid_value_1);fprintf(fileID,'%s',"罗曼诺夫斯基准则粗大误差剔除数据: ");fprintf(fileID,'%.2f ',rid_value_2); fprintf(fileID,'\n');fprintf(fileID,'残差总和判断法是否有系统误差是否有系统误差: %s\n',answer_1); fprintf(fileID,'阿贝-赫梅判别法是否有系统误差是否有系统误差: %s\n',answer_1);fprintf(fileID,'标准差比较法是否有系统误差是否有系统误差: %s\n',answer_1); fprintf(fileID,'按正态分布结果: %.2f+-%.2f\n',mean(result_2),limit_error_zt);fprintf(fileID,'按t分布结果: %.2f+-%.2f',mean(result_2),limit_error_t); fclose(fileID);利用子函数求出各种数值结果,将结果打印在命令行窗口,并将结果写入txt文件(3)莱以特准则a=1; %用于剔除数据的索引tem_date=date;date_avg=mean(tem_date); %求平均值date_std=std(tem_date); %求标准差residual=tem_date-date_avg; %求残差for i=1:length(tem_date) %大于三倍标准差元素进行剔除if(residual(i)>(3*date_std))rid_value_1(a)=tem_date(i); %求剔除值a=a+1; %索引加一,用于存储下次异常值tem_date(i)=[]; %剔除粗大误差endendresult_1=tem_date;首先定义a值,作为异常值数组的索引,将测量数据存储到tem_date中,然后求其平均值date_avg,标准差date_std,再求其残差residual,然后进行for循环,如果满足莱以特准则的条件,就让该索引对应的值为空,即剔除该数据,最后将剔除异常值的数据存储到result_1中,并返回到主函数。

(4)罗曼诺夫斯基准则b=1; %用于剔除数据的索引while(1)tem_date=date; %临时保存date原本数据[max_value,i]=max(tem_date); %求其最大值及其索引,作为怀疑对象rid_value_2(b)=max_value; %存储怀疑对象tem_date(i)=[]; %剔除怀疑对象avg=mean(date); %求平均值std_=std(date); %求标准差if(abs(max_value-avg)<(std_*T_FenBu((length(tem_date)-1),0.05)))rid_value_2(b)=[]; %如果不满足粗大误差条件就将怀疑对象清除break;elseb=b+1; %满足粗大误差条件就将怀疑对象增一date=tem_date;endendresult_2=date;首先定义b值,作为异常值数组的索引,接着进入while循环,其中有break 语句,所以不是死循环。

提取其最大值及其索引,将怀疑对象存储在rid_value_2中,计算平均值和标准差,再进行罗曼诺夫斯基准则的判断条件,如果该值满足,则将异常值索引加1,方便下次异常值存储,如果不满足,将该次怀疑的异常值对象去掉,并退出循环,最后再将测量数据返回主函数(5)判断系统误差输入: date 表示要进行系统误差检验的数据返回值: answer_1,answer_2,answer_3分别对应残差总和判断法,阿贝-赫梅判别法,标准差比较法的判断残差总和判断法function [answer_1,answer_2,answer_3]=Systematic_Error(date)date_avg=mean(date);%求平均值residual=abs(date-date_avg);%求残差绝对值sum_residual=sum(residual);%求残差绝对值和s=sqrt((sum(residual.*residual))/(length(date)));%贝塞尔公式求标准差if(sum_residual>(2*s*sqrt(length(date))))answer_1="数据有系统误差";elseanswer_1="数据没有系统误差";end阿贝-赫梅判别法date_1=date(1:length(date)-1);date_2=date(2:length(date));u=abs(sum(date_1.*date_2));if(u>(sqrt(length(date)-1)*std(date)*std(date)))answer_2="数据有系统误差";elseanswer_2="数据没有系统误差";end标准差比较法s1=std(date);s2=1.253*sum_residual/sqrt(length(date)*(length(date)-1));if((s2/s1)<(1+2/sqrt(length(date)-1)))answer_3="数据没有系统误差";elseanswer_3="数据有系统误差";end从主函数中获取已经剔除异常值的数据,利用三种方法进行判断,并且返回三种方法各自分析的结果。

相关主题