经验证,计算结果无误。
源代码:
#include
float x[50],v[50],sum=0,y=0,dx,s1,s2,vmax,v1=0,v2=0,v3=0,a,b; double ch,g,t; 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};//格拉布斯准则表0.95 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.01};//格拉布斯准则表0.99 double
t1[30]={12.706,4.303,3.182,2.776,2.571,2.447,2.365,2.306,2.262,2.228,2.201,2.179,2.160,2.145,2.131,2.120,2.110,2.101,2.093,2.086,2.080,2.074,2.069,2.064,2.060,2.056,2.052,2.048,2.045,2.042};//t分布表0.95 double
t2[30]={63.657,9.925,5.841,4.604,4.032,3.707,3.499,3.355,3.250,3.169,3.106,3.054,3.012,2.977,2.947,2.921,2.898,2.878,2.861,2.845,2.831,2.819,2.807,2.797,2.787,2.779,2.771,2.763,2.756,2.750};//t分布表0.99 int i,j,n,u;
printf(\请输入数据个数(不超过30个)n=\ scanf(\
printf(\请输入%d个数据:\\n\ for(i=0;i y=0; printf(\请选择粗大误差判别准则:\\n\ printf(\莱特准侧\\n2.肖维纳准则\\n3.格拉布斯准则(置信概率为0.95)\\n4.格拉布斯准则(置信概率为0.99)\\n\\n\ scanf(\ for(i=0;i dx=sum/n;//求平均值 printf(\输出平均值:%.4f\\n\ printf(\输出残差值:\\n\ for(i=0;i v[i]=x[i]-dx;//求残差 printf(\:\ y=x[i]*x[i]+y; } putchar('\\n'); s2=sqrt((y-n*dx*dx)/(n-1));//求标准差 printf(\输出标准差值:%.6f\\n\ 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 printf(\输出残差最大绝对值vmax=%.4f\\n\\n\ for(i=0;i i=i+1;//第i个数残差绝对值最大 break; } if(u==1) { if(n<10) { printf(\莱特准则不可用。请选择其他准则:\\n\\n\ scanf(\ } else if(vmax>3*s2) printf(\由莱特准则可知第%d个数据为异常值\\n\\n\ else { printf(\由莱特准则可知该数据无异常值\\n\\n\ break; } } if(u==2) { ch=ch1[n-5]; printf(\ if(vmax>ch*s2) printf(\由肖维纳准则可知第%d个数据为异常值\\n\\n\ else { printf(\由肖维纳准则可知该数据无异常值\\n\\n\ break; } } if(u==3) { if(n<=25) g=g1[n-3]; else { if(n==30) g=2.74; if(n==35) g=2.81; if(n==40) g=2.87; if(n==50) g=2.96; if(n==100) g=3.17; } printf(\ if(vmax>g*s2) printf(\由格拉布斯准则可知第%d个数据为异常值\\n\\n\ else { printf(\由格拉布斯准则可知该数据无异常值\\n\\n\ break; } } if(u==4) { if(n<=25) g=g2[n-3]; else { if(n==30) g=3.10; if(n==35) g=3.18; if(n==40) g=3.24; if(n==50) g=3.34; if(n==100) g=3.58; } printf(\ if(vmax>g*s2) printf(\由格拉布斯准则可知第%d个数据为异常值\\n\\n\ else { printf(\由格拉布斯准则可知该数据无异常值\\n\\n\ break; } } if(i for(i=i-1;i printf(\判断数据系统误差:\\n\if(n/2==0) //偶数个数据 { for(i=0;i for(i=n/2;i if(v1>v2&&v1-v2>=vmax) printf(\由马利科夫判据知该数据存在累进性系统误差\\n\ else printf(\由马利科夫判据知该数据不存在累进性系统误差\\n\ if(v1 printf(\由马利科夫判据知该数据存在累进性系统误差\\n\ else printf(\由马利科夫判据知该数据不存在累进性系统误差\\n\} else //奇数个数据 { for(i=0;i<(n-1)/2;i++) v1=v1+v[i]; for(i=(n-1)/2;i if(v1-v2>=vmax) printf(\由马利科夫判据知该数据存在累进性系统误差\\n\ else printf(\由马利科夫判据知该数据不存在累进性系统误差\\n\ if(v1 if(v2-v1>=vmax) printf(\由马利科夫判据知该数据存在累进性系统误差\\n\ else printf(\由马利科夫判据知该数据不存在累进性系统误差\\n\} for(i=0;i printf(\由阿卑-赫梅特判据知该数据存在周期性系统误差\\n\\n\else printf(\由阿卑-赫梅特判据知该数据不存在周期性系统误差\\n\\n\ printf(\给出置信区间:(请选择置信概率)\\n\printf(\置信概率0.95\\n2.置信概率0.99\\n\\n\scanf(\if(u==1) { s1=s2/sqrt(n); t=t1[n-2]; printf(\