在测量工作中,通常采用中误差做为衡量精度的指标,而中误差不是代表观测误差的大小,而是代表观测误差分布的离散程度。中误差较小代表离散度比较小,中误差较大代表离散度较大。 因此在实际测量中,将三倍中误差作为极限误差,大于该值的观测值将作为粗差进行剔除。
现在举例说明:
有一个木棍,我们不知道其真实长度,对其n次观测获得观测值[L1、L2、L3......Ln],但观测结果不可避免受到外界或人为因素影响导观测误差,要想获得“干净”的观测值,就必须得去除其中误差较大的观测值,按照三倍中误差就是一种剔除准则。
首先先计算观测值的平均数:
再计算观测值与平均数的差值:
获得中误差:
判断观测值是否超限:
与
的大小关系,若大于则剔除
。
下面是利用C++中vector容器书写的计算函数
//按照三倍中误差剔除数据,并返回新的数据
void del_3_sig( vector<double>&a)
{
bool exist=true;
int itera=0;
//开始迭代直到没有数据与平均值之差大于三倍中误差为止
while (exist)
{
itera++;
cout<<"第"<<itera<<"次迭代:"<<endl;
int n=a.size();
double sum=0;
int ndel=0;
double sig=0;
for (int i = 0; i<a.size(); i++)
{
sum+=a[i];
}
double avg=sum/n;
for (int i = 0; i < n; i++)
{
cout<<a[i]<<"\t";
sig +=pow((avg-a[i]),2); //计算中误差
}
cout<<endl;
sig=sqrt(sig/n);
cout<<"sig: "<<sig<<endl;
//判断初始数据有无超限
for (vector<double>::iterator it=a.begin();it !=a.end();)
{
if (abs(avg-*it)>3*sig)//3倍中误差
{
ndel+=1;
it=a.erase(it); //删除该数据
}
else
{
it++;
}
}
//当没有删除数据时退出
if (ndel==0)
{
exist=false;
}
}
}
如有错误地方欢迎指正交流,谢谢。