⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 error.cpp

📁 精密测量中常用的误差处理函数
💻 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 + -