北京交通大学电子测量第二章大作业.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; } /****** 阿卑 - 赫梅判据判断周期性系统误差 ******/