版权声明:转载本博客原创文章,请标明出处并附上链接。 https://blog.csdn.net/fourierFeng/article/details/47272167
今年3月份的时候我在公司写一个算法接触到测量平差理论,感慨于它的算法的优美,利用最小二乘而又独成体系,在测量拟合中发挥着巨大的作用。但网上关于它的描述甚少,更不用说好的实现代码,我将写两篇文章来说一下间接平差和附加限制条件的间接平差,这一篇先说间接平差。
在测量拟合中,由于观测结果不可避免地存在着误差,因此,如何处理带有误差的观测值,找出待求量的最佳估值,是最小二乘平差所研究的内容。在一个平差问题中,当所选的独立参数
的个数等于必要观测数
时,可将每个观测值表达成这
个参数的函数,组成观测方程,这种以观测方程为函数模型的平差方法,就是间接平差。用数学语言描述就是:通过在映射
的像上的平差间接地反映原像上的平差过程的算法。
一般而言,如果某平差问题有
个观测值,
个必要观测值,选择
个独立量作为平差参数
,则每个观测值必定可以表达成这
个参数的函数,即有:
平差时,一般对参数 都要取近似值 ,令
设有 个观测值方程为:
上述方程与 联立,解得:
下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在 矩阵算法相关代码,如有需要可以下载。
template<class T>
void GetWu1(T Wu1[],const T *matrixB,const T *l,int N,int U)
{
T *transposedB=new T[N*U];
MatrixTranspose(matrixB,transposedB,N,U);
MultMatrix(transposedB,l,Wu1,U,N,1);
delete [] transposedB;
}
template<class T>
void GetNBB(T nbb[],const T *matrixB,int N,int U)
{
T *transposedB=new T[N*U];
MatrixTranspose(matrixB,transposedB,N,U);
MultMatrix(transposedB,matrixB,nbb,U,N,U);
delete [] transposedB;
}
/// <summary>
/// 间接平差
/// </summary>
/// <param name="correction">返回的改正数</param>
/// <param name="matrixB"></param>
/// <param name="l"></param>
/// <param name="N"></param>
/// <param name="U"></param>
//////////////////////////////////////////////////////////////////////////
template<class T>
void GetCorrection(T correction[],const T *matrixB,const T *l,int N,int U)
{
T *nbb=new T[U*U];
T *inverseForNbb=new T[U*U];
T *Wu1=new T[U];
GetNBB(nbb,matrixB,N,U);
MatrixAnti(nbb,inverseForNbb,U);
GetWu1(Wu1,matrixB,l,N,U);
MultMatrix(inverseForNbb,Wu1,correction,U,U,1);
delete [] nbb;
delete [] inverseForNbb;
delete [] Wu1;
}
最后再说一下精度评定,首先通过下面的公式得到单位权中误差:
最后由下面公式可算得平差值函数的中误差:
参考文献:
[1] 误差理论与测量平差基础 武汉大学测绘学院测量平差学科组编著
转载请注明出处:http://blog.csdn.net/fourierFeng/article/details/47272167