📄 error.cpp
字号:
#include"iostream.h"
#include"math.h"
#include"string.h"
//#include"stdafx.h"
void syserror(float v[],int n);
void grosserror(float *a,int n);
int gtwo(int a,int b);
int gN(int n,int *a);
float max(float *a,int n);
float min(float *a,int n);
//声明区
void main()
{
//变量定义
int i,j,k,n,N,flag1,flag2,P,m1,m2,T[10],h;
//float A;
double w,A,v=0,bsdrt,bjdrt,u,drtx,ta,Elim,drtlim,g[100];
float a[100],vi[100],z[10][100],avrt[10];
float avr,s=0,temp,drt1=0,drt2=0,drt,s1=0,s2=0,sum,sum1,sum2,a0,aavr,pip,pi;
void syserror(float *v,int n);
void grosserror(float *a,int n);
double G[][23]={{1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.28,2.33,2.37,2.41,2.44,2.48,2.50,2.53,2.56,2.58,2.60,2.62,2.64,2.66},
{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.70,2.75,2.78,2.82,2.85,2.88,2.91,2.94,2.96,2.99,3.01}};
double t[][30]={{12.71,4.30,3.18,2.78,2.57,2.45,2.36,2.31,2.26,2.23,2.20,2.18,2.16,2.14,2.13,2.12,2.11,2.10,2.09,2.09,2.08,2.07,20.7,2.06,2.06,2.06,2.05,2.05,2.05,2.04},
{63.66,9.92,5.84,4.6,4.03,3.71,3.5,3.36,3.25,3.17,3.11,3.05,3.01,2.98,2.95,2.92,2.90,2.88,2.86,2.85,2.83,2.82,2.81,2.80,2.79,2.78,2.77,2.76,2.76,2.75},
{235.80,19.21,9.21,6.62,5.51,4.90,4.53,4.28,4.09,3.96,3.85,3.76,3.69,3.64,3.59,3.54,3.51,3.48,3.45,3.42,3.40,3.38,3.36,3.34,3.33,3.32,3.30,3.29,3.28,3.27}};
cout<<"请问你是想做等精度测量结果处理还是不等精度测量结果处理:(1为等精度测量,0为不等精度测量)"<<endl;
cin>>P;
if(P==1)
{
cout<<"请输入测量次数n:"<<endl;
cin>>n;
cout<<"n= "<<n<<endl;
cout<<"请输入测量值:"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
s+=a[i];
}
avr=s/n;
cout<<endl<<avr<<endl;
for(i=0;i<n;i++)
{
vi[i]=a[i]-avr;
cout<<vi[i]<<endl;
v+=vi[i];
}
//通过vi[]判断A值
w=floor(vi[n-2]+0.00001);
if ( vi[n-2]-w>1e-5)
{
if (vi[n-2]*10-floor((vi[n-2]*10+1e-4))>1e-4)
{
if (vi[n-2]*100-floor((vi[n-2]*100+1e-3))>1e-3)
{
if(vi[n-2]*1000-floor((vi[n-2]*1000+1e-2))>1e-2)
A=0.0001;
else A=0.001;
}
else A=0.01;
}
else A=0.1;
}
else A=0;
cout<<A<<endl<<endl;
//
if(v<0)
v=-v;
if(v-(n/2-0.5)*A<0)
cout<<" 根据残余误差代数和校核计算正确"<<endl<<endl;
else
cout<<"残差计算出错"<<endl;
/*______________判别粗大误差_________________________________________-
if(n<50) //n<50,采用格罗布斯法则判断
{
/*for(i=0;i<n;i++)
{
s1+=vi[i]*vi[i];
//s2+=abs(v[i]);
}
for(i=0;i<n;i++) //排序
for(j=i;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=0;i<n;i++)
cout<<a[i]<<endl;
cout<<"\n请选择精度等级(0.05为0, 0.01为1)"<<endl;
cin>>m1;
for(i=n-1;i>=0;i--)
{
for(j=0;j<n;j++)
s+=a[j];
avr=s/n;
sum0=0;
for(j=0;j<n;j++)
{
vi[j]=a[j]-avr;
sum0+=vi[i]*vi[i];
}
bsdrt=sqrt(sum0/(n-1));//求标准差
//g[i]=(max(a,n)-avr)/bsdrt;
if((max(a,n)-avr)/bsdrt>G[m1][n])
n--;
else
if((avr-min(a,n))/bsdrt<G[m1][n])
a[i]=a[i+1];
else
cout<<"该数组不存在粗大误差值"<<endl;
}
cout<<" 除去粗大误差后的测试数据组 \n"<<endl;
for(i=0;i<n;i++)
//cout<<a[i]<<endl;
cout<<a[i]<<endl;
}
else //如果采样数量大于50,采用3drt法则判断
{
sum0=0;
for(j=0;j<n;j++)
{
vi[j]=a[j]-avr;
sum0+=vi[i]*vi[i];
}
bsdrt=sqrt(sum0/(n-1));
for(i=0;i<n;i++)
{ if(vi[i]<0)
vi[i]=-vi[i];
if(vi[i]>3*bsdrt)
{
cout<<"存在粗大误差"<<endl;
//cd=vi[i];
vi[i]=vi[i+1];
a[i]=a[i+1];
}
else
cout<<"不存在粗大误差"<<endl;
}
cout<<" 除去粗大误差后的新测试数据组 \n"<<endl;
for(i=0;i<n;i++)
//cout<<a[i]<<endl;
cout<<a[i]<<endl;
}*/
//_______判别系统误差______________________________________________
for(i=0;i<(n+1)/2;i++)
{
drt1+=vi[i];
}
for(i=(n+1)/2;i<n;i++)
{
drt2+=vi[i];
}
drt=drt1-drt2;
if(drt<=0.05)
flag1=1;
else flag1=0;
for(i=0;i<n;i++)
{
s1+=vi[i]*vi[i];
if(vi[i]<0)
vi[i]=-vi[i];
s2+=vi[i];
}
bsdrt=sqrt(s1/(n-1));
cout<<bsdrt<<endl<<endl;
bjdrt=1.253*s2/sqrt(n*(n-1));
u=bjdrt/bsdrt-1;
if(u<2/sqrt(n-1))
flag2=1;
else flag2=0;
if(flag1==1&&flag2==1)
cout<<"该测量数据无系统误差"<<endl;
else
cout<<"该系统存在系统误差。"<<endl;
//______________判别粗大误差_________________________________________-
if(n<50)
{
for(i=0;i<n;i++)
{
s1+=vi[i]*vi[i];
//s2+=abs(v[i]);
}
for(i=0;i<n;i++) //排序
for(j=i;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=0;i<n;i++)
cout<<a[i]<<endl;
cout<<"\n请选择精度等级(0.05为0, 0.01为1)"<<endl;
cin>>m1;
for(i=0;i<n;i++)
{
cout<<G[m1][n]<<endl;
g[i]=(avr-a[i])/bsdrt;
g[n-1]=(a[i]-avr)/bsdrt;
if(g[i]>g[n-1])
{
if(g[i]<G[m1][n])
break; //cout<<"no"<<endl;
else
a[i]=a[i+1];
}
else
{
if(g[n-1]<G[m1][n])
break;
else
n--;
}
}
cout<<" 除去粗大误差后的新测试数据组 \n"<<endl;
for(i=0;i<n;i++)
//cout<<a[i]<<endl;
cout<<a[i]<<endl;
}
else
{
for(i=0;i<n;i++)
{ if(vi[i]<0)
vi[i]=-vi[i];
if(vi[i]>3*bsdrt)
{
cout<<"存在粗大误差"<<endl;
//cd=vi[i];
vi[i]=vi[i+1];
a[i]=a[i+1];
}
else
cout<<"不存在粗大误差"<<endl;
}
cout<<" 除去粗大误差后的新测试数据组 \n"<<endl;
for(i=0;i<n;i++)
//cout<<a[i]<<endl;
cout<<a[i]<<endl;
}
//_________求算术平均值的极限误差___________________________________________________
drtx=bsdrt/sqrt(n);
cout<<"请选择t分布表的精度(0.05-0,0.01-1,0.0027-2)\n"<<endl;
cin>>m2;
cout<<"标准差是:"<<bsdrt<<endl;
//cout<<<<endl;
cout<<t[m2][n-2]<<endl;
ta=t[m2][n-2];
Elim=ta*drtx;
cout<<"测量结果为:"<<endl;
cout<<""<<avr<<"+-"<<Elim<<endl;
}
//___________不等精度测量处理_____________________________________________
if(P==0)
{
cout<<"输入测量组数N"<<endl;
cin>>N;
cout<<"N= "<<N<<endl;
cout<<"请输入各组测量的次数T数组(请按从小到大的顺序输入)"<<endl;
for(i=0;i<N;i++)
{
cin>>T[i];
cout<<T[i]<<endl;
}
cout<<"请输入各组数据的具体值"<<endl;
for(i=0;i<N;i++)
{
sum=0;
cout<<"请输入第"<<i<<"组测量数据"<<endl;
for(j=0;j<T[i];j++)
{
cin>>z[i][j];
cout<<z[i][j]<<endl;
sum+=z[i][j];
}
avrt[i]=sum/j;
cout<<"该小组的平均值为:"<<avrt[i]<<endl;
}
cout<<avrt<<endl;
//———求权值的最简比———————————
/*for(i=2;i<=T[0];i++)
{
for(j=0;j<N;j++)
if(T[j]%i==0)
continue;
else
break;
}*/
h=gN(N,T);
//cout<<h<<endl;
for(k=0;k<N;k++)
{
T[k]=T[k]/h;
cout<<T[k]<<endl;
}
//_____求加权算数平均值_______________________________
cout<<"请输入参考值a0"<<endl;
cin>>a0;
for(i=0;i<N;i++)
{
pi=0;
pip=0;
pi+=T[i];
pip+=(T[i]*(avrt[i]-a0));
}
aavr=a0+pip/pi;
cout<<"加权算术平均值为:"<<aavr<<endl;
//______求残余误差并校核___________________________________________
sum1=0;
for(i=0;i<N;i++)
{
vi[i]=avrt[i]-aavr;
cout<<" "<<vi[i];
sum1+=(T[i]*vi[i]);
}
if(sum1==0)
cout<<"计算正确"<<endl;
else
cout<<"计算有误"<<endl;
//_____________求加权算数平均值的标准差_______________________________________________
sum2=0;
for(i=0;i<N;i++)
{
sum2+=(T[i]*vi[i]*vi[i]);
}
drtx=sqrt(sum2/((N-1)*pi));
cout<<"加权算数平均值的标准差:"<<drtx<<endl;
drtlim=3*drtx;
cout<<"最后的测量结果为:"<<endl;
cout<<aavr<<"+-"<<drtlim<<endl;
}
}
int gtwo(int a,int b)
{
while(b>0)
{
int temp;
temp=b;
b=a%b;
a=temp;
}
return a;
}
int gN(int n,int *a)//n个数的最大公约数
{
int *b;
b=new int[n-1];
if(n>2)
{
b[0]=gtwo(a[0],a[1]);
for(int i=1;i<n-1;i++)
b[i]=a[i+1];
return gN(n-1,b);
}
else
return gtwo(a[0],a[1]);
delete []b;
}
float max(float *a,int n)
{
float temp=0;
for(int i=0;i<n;i++)
if(a[i]>temp)
temp=a[i];
return temp;
}
float min(float *a,int n)
{
float temp=a[0];
for(int i=1;i<n;i++)
if(a[i]<temp)
temp=a[i];
return temp;
}
/*判断系统误差
void syserror(float *v,int n)
{
int i,flag1,flag2;
float bsdrt,bjdrt,drt1=0,drt2=0,drt,s1=0,s2=0,u;
for(i=0;i<(n+1)/2;i++)
{
drt1+=v[i];
}
for(i=(n+1)/2;i<n;i++)
{
drt2+=v[i];
}
drt=drt1-drt2;
if(drt<=0.05)
flag1=1;
else flag1=0;
for(i=0;i<n;i++)
{
s1+=v[i]*v[i];
s2+=abs(v[i]);
}
bsdrt=sqrt(s1/(n-1));
bjdrt=1.253*s2/sqrt(n*(n-1));
u=bjdrt/bsdrt-1;
if(u<2/sqrt(n-1))
flag2=1;
else flag2=0;
if(flag1==1&&flag2==1)
cout<<"该测量数据无系统误差"<<endl;
else
cout<<"该系统存在系统误差。"<<endl;
}
/*判别粗大误差
void grosserror(float *a,int n)
{
int i,j,m;
float g[100],G[1][23],vi[100];
float temp,s,avr,s1=0;
G[1][23]={{1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.28,2.33,2.37,2.41,2.44,2.48,2.50,2.53,2.56,2.58,2.60,2.62,2.64,2.66},
{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.70,2.75,2.78,2.82,2.85,2.88,2.91,2.94,2.96,2.99,3.01}}
if(n>5)
{
for(i=0;i<n;i++)
{
s=0;
s+=a[i];
}
avr=s/n;
for(i=0;i<n;i++)
{
vi[i]=a[i]-avr;
}
for(i=0;i<n;i++)
{
s1+=v[i]*v[i];
//s2+=abs(v[i]);
}
bsdrt=sqrt(s1/(n-1));
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=n-1;i>0;i--)
{
g[i]=(a[i]-avr)/bsdrt;
cout<<"0.05-0,0.01-1"<<endl;
cin>>m;
if(g[i]<G[m][n])
cout<<"no"<<endl;
else
n--;
}
cout<<" chu qu cu da wu cha hou \n"<<a<<endl;
}
else
for(i=0;i<n;i++)
{
if(abs(vi[i])>3*bsdrt)
{
cout<<"存在粗大误差"<<endl;
//cd=vi[i];
vi[i]=vi[i+1];
a[i]=a[i+1];
}
else
cout<<"no"<<endl;
}
cout<<" chu qu cu da wu cha hou \n"<<a<<endl;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -