您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > C语言实现测量数据误差处理
0误差处理程序(C语言)电子信息工程学院通信100910211159高子豪1实验目的实现对输入数据的误差处理:剔除粗大误差。判断累进性系统误差和周期性系统误差。计算平均值,方差,不确定度。程序代码#includestdio.h#includemath.hdoubleSUM(doublex[],intn);doubleAVRG(doublex[],intn);doubleSD(doublex[],intn);intPauTa(doublex[],intn);intChauvenet(doublex[],intn);intGrubbs_1(doublex[],intn);intGrubbs_2(doublex[],intn);staticintn;staticdoublea[500];intmain(){inti,choose,leap=1;doubleavg,sd,v[500],M=0,AH=0,vmax=0;doubleP,PX[]={12.706,4.303,3.182,2.776,2.571,2.447,2.365,2.306,2.262,2.228,2.131,2.086,2.060,2.042,2.021,2.000,1.980,1.960};printf(请输入数据总个数:\n);scanf(%d,&n);printf(请输入数据:\n);for(i=0;in;i++)scanf(%lf,&a[i]);avg=AVRG(a,n);sd=SD(a,n);printf(\n输入数据的平均值为%lf,标准差为%lf\n,avg,sd);while(leap){printf(请选择粗大误差的检验法:\n1.莱特检验法\n2.肖维纳检验法\n3.格拉布斯检验法(置信概率99%%)\n4.格拉布斯检验法(置信概率95%%)\n5.停止检验\n);scanf(%d,&choose);if(choose==1&&n10)printf(数据总量小于10,不能使用莱特检验法。\n);elseif(choose==2&&n5)printf(数据总量小于5,不能使用肖维纳检验法。\n);elseswitch(choose){case1:leap=PauTa(a,n);break;case2:leap=Chauvenet(a,n);break;2case3:leap=Grubbs_1(a,n);break;case4:leap=Grubbs_2(a,n);break;case5:leap=0;break;default:printf(输入错误,请重新选择\n);break;}}avg=AVRG(a,n);sd=SD(a,n);for(i=0;in;i++){v[i]=a[i]-avg;if(vmax*vmax=v[i]*v[i])vmax=v[i];}printf(粗大误差剔除完毕,剩余数据如下(括号内为残差):\n);for(i=0;in;i++)printf(%f(%f),a[i],v[i]);printf(平均值为%lf,标准差为%lf\n,avg,sd);for(i=0;in/2;i++)M+=v[i];for(i=(n+1)/2;in;i++)M-=v[i];M=sqrt(M*M);vmax=sqrt(vmax*vmax);if(M=vmax)printf(\n根据马利科夫判据,存在累进性系统误差。\n);elseprintf(\n根据马利科夫判据,不存在累进性系统误差。\n);for(i=0;in-1;i++)AH+=v[i]*v[i+1];if((AH*AH)=((n-1)*sd*sd*sd*sd))printf(\n根据阿卑-赫梅特准则,存在周期性系统误差。\n);elseprintf(\n根据阿卑-赫梅特准则,不存在周期性系统误差。\n);if(n120)P=PX[17];elseif(n60)P=PX[16];elseif(n40)P=PX[15];elseif(n30)P=PX[14];elseif(n25)P=PX[13];elseif(n20)P=PX[12];elseif(n15)P=PX[11];elseif(n10)P=PX[10];elseP=PX[n-1];printf(\n该组数组的置信区间为[%lf,%lf](置信概率为95%%)\n,(avg-P*sd),(avg+P*sd));return0;}doubleSUM(doublex[],intn){doubles=0;inti;for(i=0;in;i++)s+=x[i];3returns;}doubleAVRG(doublex[],intn){doubleaver=0;aver=SUM(x,n)/n;returnaver;}doubleSD(doublex[],intn){doubleaver,sd,SUM=0;inti;aver=AVRG(x,n);for(i=0;i=n;i++)SUM+=x[i]*x[i];sd=sqrt((SUM-n*aver*aver)/(n-1));returnsd;}intPauTa(doublex[],intn){inti,j=0,leap;doublev[500],temp=0,aver,sd;aver=AVRG(x,n);sd=SD(x,n);for(i=0;in;i++)v[i]=x[i]-aver;for(i=0;in;i++){if((v[i]*v[i]=9*sd*sd)&&(v[i]*v[i]temp*temp)){temp=v[i];j=i+1;}}if(j){for(i=j-1;in-1;i++)x[i]=x[i+1];n--;printf(根据莱特检验法,本次剔除的数据为%lf\n%d,x[j-1],n);leap=1;}else{printf(依据莱特检验法,没有要剔除的数据\n);leap=0;}4returnleap;}intChauvenet(doublex[],intn){inti,j=0,leap;doublev[500],temp=0,ch,aver,sd;doublechx[]={0,0,0,0,1.65,1.73,1.79,1.86,1.92,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};if(n36)ch=chx[36];elsech=chx[n-1];aver=AVRG(x,n);sd=SD(x,n);for(i=0;in;i++)v[i]=x[i]-aver;for(i=0;in;i++){if((v[i]*v[i])=(ch*ch*sd*sd)&&(v[i]*v[i])=(temp*temp)){j=i+1;temp=v[i];}}if(j){printf(依据肖维纳检验法,本次剔除了第%d个数据%lf\n,j,x[j-1]);for(i=j-1;in-1;i++)x[i]=x[i+1];leap=1;n--;}else{printf(依据肖维纳检验法,没有要剔除的数据\n);leap=0;}returnleap;}intGrubbs_1(doublex[],intn){inti,max=0,min=0,leap;doublev[500],temp=0,g,sd,aver;doublegx[30]={0,0,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,2.74,2.81,2.87,2.96,3.17};5if(n=100)g=gx[29];elseif(n=50)g=gx[28];elseif(n=40)g=gx[27];elseif(n=35)g=gx[26];elseif(n=30)g=gx[25];elseif(n=25)g=gx[24];elseg=gx[n-1];aver=AVRG(x,n);sd=SD(x,n);for(i=0;in;i++){v[i]=x[i]-aver;if(x[min]x[i])min=i;if(maxx[i])max=i;}if(v[max]*v[max]v[min]*v[min])max=min;if(v[max]*v[max]g*g*sd*sd){printf(根据格拉布斯检验法,本次剔除了第%d个数据%lf(置信概率99%%)\n,max,x[max]);for(i=max;in-1;i++)x[i]=x[i+1];leap=1;n--;}else{printf(根据格拉布斯检验法,没有要剔除的数据\n);leap=0;}returnleap;}intGrubbs_2(doublex[],intn){inti,max=0,min=0,leap;doublev[500],temp=0,g,sd,aver;doublegx[30]={0,0,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.01,3.10,3.18,3.24,3.34,3.58};if(n=100)g=gx[29];elseif(n=50)g=gx[28];elseif(n=40)g=gx[27];elseif(n=35)g=gx[26];elseif(n=30)g=gx[25];elseif(n=25)g=gx[24];6elseg=gx[n-1];aver=AVRG(x,n);sd=SD(x,n);for(i=0;in;i++){v[i]=x[i]-aver;if(x[min]x[i])min=i;if(maxx[i])max=i;}if(v[max]*v[max]v[min]*v[min])max=min;if(v[max]*v[max]g*g*sd*sd){printf(根据格拉布斯检验法,本次剔除了第%d个数据%lf(置信概率95%%)\n,max,x[max]);for(i=max;in-1;i++)x[i]=x[i+1];leap=1;n--;}else{printf(根据格拉布斯检验法,没有要剔除的数据\n);leap=0;}returnleap;}测试输入2.722.752.652.622.452.622.702.672.732.74测试结果依次使用了:PauTa检验法。Chauvenet检验法。Grubbs检验法(置信概率99%)。78
本文标题:C语言实现测量数据误差处理
链接地址:https://www.777doc.com/doc-4457976 .html