版权声明:转载本博客原创文章,请标明出处并附上链接。 https://blog.csdn.net/fourierFeng/article/details/54837767
测量平差是一套完整的理论,在前面我分别简要的叙述并实现了间接平差和附有限制条件的间接平差,这是两类最常用的测量平差算法,希望能给这一方面的初学者一点点有意义的参考。下面我准备再写几篇文章来叙述一下余下经典平差算法,这一篇就说一下条件平差。
在拟合和测量工作中,为了能达到平差目的,一般要作多的观测。如果观测数据确实有限,添加条件方程一般也可以达到目的。添加条件方程本质上是降维,增加了“偏执”使得必要观测数减少。同时收敛路径也变得单调,就好像过“独木桥”,一旦独木桥无法通过,算法将无法收敛到规定误差范围内。所以添加条件方程是把“双刃剑”。但其在工业测量及最小二乘拟合中依然是一个重要的手段,很多情况下维它不行。以条件方程为函数模型的平差方法,就是条件平差。
一般而言,如果有
个观测值
,
个必要观测,则应列出
个条件方程,即
依附最小二乘原理,平差准则为
按拉格朗日乘子理论,设乘子 ,组成函数
下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在 矩阵算法相关代码,如有需要可以下载。
template<class T1,class T2,class T3>
void __declspec(dllexport) MatrixMinus(T1* M,T2* M1,int nrows,int ncols)
{
for(int i=0;i<nrows;++i)
for(int j=0;j<ncols;++j)
M1[i*ncols+j]=-1*M[i*ncols+j];
}
// <summary>
/// 条件平差
/// </summary>
/// <param name="correction">返回的改正数</param>
/// <param name="MatrixA"></param>
/// <param name="w"></param>
/// <param name="R"></param>
/// <param name="N"></param>
//////////////////////////////////////////////////////////////////////////
template<class T>
void GetConditionCorrection(T correction[],const T matrixA[],const T w[],int R,int N)
{
T *transposedA=new T[R*N];
T *Naa=new T[R*R];
T *inverseForNaa=new T[R*R];
T *K=new T[R];
MatrixTranspose(matrixA,transposedA,R,N);
MultMatrix(matrixA,transposedA,Naa,R,N,R);
MatrixAnti(Naa,inverseForNaa,R);
MultMatrix(inverseForNaa,w,K,R,R,1);
MatrixMinus(K,K,R,1);
MultMatrix(transposedA,K,correction,N,R,1);
delete [] transposedA;
delete [] Naa;
delete [] inverseForNaa;
delete [] K;
}
最后进行误差分析,设平差值函数为
设 , ,则上式可简写为 ,由此即得
平差值函数的中误差为
参考资料:
[1] 误差理论与测量平差基础 武汉大学测绘学院测量平差学科组编著
转载请注明出处:http://blog.csdn.net/fourierFeng/article/details/54837767