按3倍中误差去除粗差(C++)

2 篇文章 0 订阅

        在测量工作中,通常采用中误差做为衡量精度的指标,而中误差不是代表观测误差的大小,而是代表观测误差分布的离散程度。中误差较小代表离散度比较小,中误差较大代表离散度较大。 因此在实际测量中,将三倍中误差作为极限误差,大于该值的观测值将作为粗差进行剔除。

现在举例说明:

有一个木棍,我们不知道其真实长度,对其n次观测获得观测值[L1、L2、L3......Ln],但观测结果不可避免受到外界或人为因素影响导观测误差,要想获得“干净”的观测值,就必须得去除其中误差较大的观测值,按照三倍中误差就是一种剔除准则。

首先先计算观测值的平均数:

                                            \bar{L}=\frac{L1+L2+L3+.......+Ln}{n}

再计算观测值与平均数的差值:

                                              v_{i}=\bar{L}-L_{i}

获得中误差:

                                            sig=\sqrt{\frac{\sum_{i=1}^{n}v_{i}^{2}}{n}}

判断观测值是否超限:

\mid \bar{L}-L_{i}\mid 与3*sig的大小关系,若大于则剔除L_{i}

下面是利用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;   
		}

	}
}

如有错误地方欢迎指正交流,谢谢。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值