北京交通大学电子测量第二章大作业.doc
- 格式:doc
- 大小:129.56 KB
- 文档页数:10
电子测量大作业 数据处理的通用程序 一.实验要求 参考例 2-2-6 的解题过程,用 c 语言或 MATLAB设计测量数据误差处理的通用程序,要求如下: ( 1)提供测试数据输入,粗大误差判别准则选择等的人机界面; ( 2)编写程序使用说明; ( 3)通过实例来验证程序的正确性。
二.实验原理
— 1. 求平均值 U 及标准偏差估计值 (U) —1 N
U U
i
N i 1
N 2 ui N U
(U ) i 1
N 1
2. 检查有无异常数据。用于粗大误差剔除的常见方法有:
①莱特检验法:当 x i x 3 ( x) 时,该误差为粗大误差。用于数据服从正态分布的情况
下判断异常值,主要用于测量数据较多时,一般要求 n>10。
②肖维纳检验法:当 xi x ch ? ( x)
时,该误差为粗大误差。用于数据服从正态分布的
情况下判断异常值,要求在 n>5 时使用。 ③格拉布斯检验法:当 xi x g ? ( x)
时,该误差为粗大误差, g 值根据重复测量次数 n
和置信概率由附录 3 的格拉布斯准则表查出。格拉布斯检验法是在未知总体偏差的情况下,对正态样本或接近正态样本的异常值进行判别。 ④除了上述三种检验法外,还有奈尔检验法、 Q检验法、狄克逊检验法等。
3. 判断有无随时间变化的变值系统误差。
①判断有无累进性系统误差: n/ 2 n n 为偶数时,若 vi vi
v
i max i 1 i n / 2 1
( n 1)/ 2 n n 为奇数时,若 vi
viv
i
max i 1 i (n 1) / 2
则认为测量中存在累进性系统误差。 ②判断有无周期性系统误差:
n 1 2 vi vi 1
n 1
( x)
i 1
则认为测量中存在周期性系统误差。 4. 给出置信区间
先求出平均值的标准偏差(v) (v) ,根据 n 值,查 t 分布表,可以在给定置信概率下, n 查出 t a 的值。然后求出置信区间: U t a (U ),U ta (U )
三.实验程序 #include<> #include<> int w=0; /******** 求平均值 **********/ /* 形参分别为数据总量、数据 */
float ave(int b,float a[]) { float sum,average; int i; for(i=0,sum=0;i{ sum=sum+a[i]; } average=sum/b; return average; } /********* 标准差估计值 ************/
/* 形参分别为数据总量、数据、平均值 */
float sd(int b,float a[],float av) { float sum2,c,d; int i; for(i=0,sum2=0;i{ sum2=sum2+a[i]*a[i]; } c=sum2-b*av*av; d=sqrt(c/(b-1)); return d; } /****** 莱特检验法判断粗大误差 ******/
/* 形参分别为数据总量、数据、残差、标准差 */
int Wright(int count,float *p,float *q,float sd) { int i,j[100],k,a; float standard=3*sd; do { k=0; for (i=0;i{ if (fabs(*(q+i))>standard) { j[k]=i; k++; } } if (k!=0) { a=j[0]; if (k>1) { for (i=1;i{ if(*(p+j[i-1])<*(p+j[i])) a=j[i]; } }
printf(" 该组数据有异常数据 %f\n",*(p+a)); for (i=a;i<=count;i++) *(p+i)=*(p+i+1); count--; k--; } }while(k!=0); return (count); } /**** 肖维纳检验法判断粗大误差 ******/
/* 形参分别为数据总量、数据、残差、标准差 */
/********** 数据总量为 5-37*********/ int Chauvenet(int count,float *p,float *q,float sd) { int i,j[100],k,a; float ch[38]={0,0,0,0,0, ,,,,, ,,,,, ,,,,, ,,,,, ,,,,, ,,,,, ,,}; float standard=ch[count]*sd; do { k=0; for (i=0;i{ if (fabs(*(q+i))>standard) { j[k]=i; k++; } } if (k!=0) { a=j[0]; if (k>1) { for (i=1;i{ if(*(p+j[i-1])<*(p+j[i])) a=j[i]; } } printf(" 该组数据有异常数据 %f\n",*(p+a)); for (i=a;i*(p+i)=*(p+i+1); count--; k--; } }while(k!=0); return (count); } /******* 格拉布斯检验法判断粗大误差 *******/
/* 形参分别为数据总量、数据、残差、标准差 */
/************* 数据总量为 3-25*************/
int Grabus(int count,float *p,float *q,float sd) { int i,j[100],k,a; float g[26]={0,0,0,,, ,,,,, ,,,,, ,,,,, ,,,,, }; float standard=g[count]*sd; do { k=0; for (i=0;i{ if (fabs(*(q+i))>standard) { j[k]=i; k++; } } if (k!=0) { a=j[0]; if (k>1) { for (i=1;i{ if(*(p+j[i-1])<*(p+j[i])) a=j[i]; } } } printf(" 该组数据有异常数据 for (i=a;i<=count;i++) *(p+i)=*(p+i+1); count--; k--; }while(k!=0); return (count);
%f\n",*(p+a));
} /****** 马利科夫判据判断累进性系统误差 ******/ /* 形参分别为数据总量、数据、残差、标准差、平均值 */ int malikefu(int b,float a[],float v[],float sd,float av) { int i,q=0; float max,sum1=0,sum2=0,sum3=0,sum4=0,n,m; max=fabs(v[0]); for(i=0;i{ if(fabs(v[i])>max) max=fabs(v[i]); } if(b%2==0) { for(i=0;i<(b/2-1);i++) { sum1=sum1+v[i]; } for(i=b/2;i{ sum2=sum2+v[i]; } n=sum1-sum2; if(fabs(n)>fabs(max)||fabs(n)==fabs(max)) { printf(" 存在累进性系统误差 \n"); q=1; } if(fabs(n)printf(" 不存在累进性系统误差 \n");
} if(b%2!=0) { for(i=0;i<(b-1)/2;i++) { sum3=sum3+v[i]; } for(i=(b+1)/2;i{ sum4=sum4+v[i]; } m=sum3-sum4; if(fabs(m)>fabs(max)||fabs(m)==fabs(max)) { printf(" 存在累进性系统误差 \n"); q=1; } if(fabs(m)printf(" 不存在累进性系统误差 \n"); } return q; } /****** 阿卑 - 赫梅判据判断周期性系统误差 ******/