测量误差理论和测量数据处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课题名称:测量误差理论和测量数据处理
学院:海滨学院
*****
学号:********
则i x 为异常值应剔除不用。否则不存在异常值。
正态分布,n >5的情况 肖维纳检验法也是以正态分布作为前提的,假设多次重复测量所得 n 个测量值中, 当残差绝对值时,则认为是粗大误差。式中n 是系数,可通过查附录 2 的肖维纳准则 表得到。要注意的是肖维纳检验法是建立在测量数据服从正态分布的前提下,要求在 n > 5 时使用。则i x 为异常值应剔除不用。否则不存在异常值。
格拉布斯检验法是在未知总体标准偏差的情况下,对正态样本或接近正态样本异常值进行判别的一种方法,是一种从理论上就很严密、概率意义明确、经实验证明效果较 的判据。 对g 值根据重复测量次数 n 及置信概率由附录 3 的格拉布斯准则表查出。
注意以下几个问题:
(1)当偏离正态分布、测量次数少时,检验可靠性将受影响。
(2)逐个剔除原则:若有多个可疑数据同时超过检验所定置信区间,应逐个剔除,先剔出残差绝对值最大的,然后重新计算标准偏差估计值,再行判别。若有多个相同数据超出范围时,也应逐个剔除。
(3)在一组测量数据中,可疑数据应极少;反之,说明系统工作不正常。
(4)剔除异常数据是一件需慎重对待的事。
)(ˆX ch σ)(X
题目:参考例2-2-6的解题过程,用C语言或MATLAB设计测量数据处理的通用
程序,要求如下:
(1)提供测试数据输入、粗大误差判别准则等的人机界面;
(2)编写程序使用说明;
(3)通过实例来验证程序的正确性。
程序如下:
#include
#include
main()
{
float x[50],v[50],sum=0,dx,y=0,s2,vmax,v1=0,v2=0,v3=0;
double ch,g;
double
ch1[33]={1.65,1.73,1.79,1.86,1.92,1.96,2.00,2.04,2.07,2.10,2.13,2.16,2.18,2.20, 2.22,2.24,2.26,2.28,2.30,2.32,2.33,2.34,2.35,2.37,2.38,2.39,2.45,2.50,2.58,2.64 ,2.74,2.81,3.02};
double
g1[28]={1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.29,2.33,2.37,2.41,2.44,2 .47,2.50,2.53,2.56,2.58,2.60,2.62,2.64,2.66};
Double
g2[28]={1.16,1.49,1.75,1.94,2.10,2.22,2.32,2.41,2.48,2.55,2.61,2.66,2.71,2.75,2 .79,2.82,2.85,2.88,2.91,2.94,2.96,2.99,3.10};
int n,i,j,u;
printf("请输入数据个数n=");
scanf("%d",&n);
printf("请输入%d个数据:\n",n);
for(i=0;i scanf("%f",&x[i]); for(j=0;j { printf("请选择粗大误差判别准则:\n"); printf("1.莱特准侧\n2.肖维纳准则\n3.格拉布斯准则(置信度为0.95)\n4.格拉布斯准则(置信度为0.99)\n"); scanf("%d",&u); for(i=0;i sum=sum+x[i]; dx=sum/n;//求平均值 printf("输出平均值:%7.2f\n",dx); printf("输出残差值:\n"); for(i=0;i { v[i]=x[i]-dx;//求残差 printf("%7.2f:",v[i]); y=v[i]*v[i]+y; } putchar('\n'); s2=y/(n-1);//方差 printf("输出方差值:%7.2f\n",s2); if(v[0]<0) vmax=-v[0]; else vmax=v[0]; for(i=0;i { if(v[i+1]<0) v[i+1]=0-v[i+1]; if(vmax vmax=v[i+1]; } printf("输出残差最大绝对值vmax=%7.2f\n",vmax); for(i=0;i if(vmax==v[i]) { i=i+1; break; } if(u==1) { if(n<10) { printf("莱特准则不可用。请选择其他准则:\n"); scanf("%d",&u); } else if(vmax*vmax>9*s2) printf("由莱特准则可知第%d个数据为异常值。\n",i); else { printf("由莱特准则可知该数据无异常值。\n"); break; } } if(u==2)