版权声明:转载本博客原创文章,请标明出处并附上链接。 https://blog.csdn.net/fourierFeng/article/details/76862227
接下来要写的可看成是对前面讲过的四种经典平差方法的概括模型。
从四种基本平差算法的函数模型来看,主要包括如下两种类型的条件方程:
第一种方程中同时含有观测值和未知参数,称为一般条件方程;第二种方程则只含有未知参数而无观测值,称为限制条件方程。
一般而言,对于任何一个平差问题,设想观测值个数为 ,必要观测数为 ,则多余观测数 。若增选了 个参数,不论 或 ,也不论参数是否独立,每增加一个参数则相应的多产生一个方程,故总共应列出 个方程。如果在 个参数中有 个是不独立的,或者说,在这 个参数之间存在着 个函数关系式,则应列出 个限制条件方程,此外,还应列出 个一般条件方程,如此就形成了如下的函数模型:
且 ,系数矩阵的秩分别为
上面提到过,该模型是四种平差模型的综合:
- 系数阵中的 时,它就变成了条件平差法的函数模型。
- 系数阵中的 ,它就变成了附有参数的条件平差的函数模型。
- 系数阵中的 和 时,它就变成了间接平差法的函数模型。
- 系数阵中的 时,就变成了附有限制条件的间接平差法的函数模型。
由此,也称之为“概括平差模型”。
回到正题来简化数学模型,上面的线性模型用拉格朗日乘子进行复合,组成函数如下:
注意,这里有两个拉格朗日乘子,对于拉格朗日乘子,可参看我的另外一篇文章: 拉格朗日乘子法的由来。
由凸优化理论,要计算该极值,需对 , , , 分别取极值,即是求偏导并令其为零,得
上面四式包含 个改正数, 个参数, 个对应于一般条件方程的联系数以及 个对应于限制条件方程的联系数,而方程个数为 ,即方程个数等于未知数个数,故有唯一解。以上四式成为附有限制条件的条件平差法的基础方程。
解此基础方程,令
以上三式称为附有限制条件的条件平差的法方程。
由法方程得
其中 。解出 得
下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在 矩阵算法相关代码,如有需要可以下载。
// <summary>
/// 附有限制条件的条件平差
/// </summary>
/// <param name="correction">返回的改正数</param>
/// <param name="MatrixA"></param>
/// <param name="MatrixB"></param>
/// <param name="MatrixC"></param>
/// <param name="W"></param>
/// <param name="Wx"></param>
/// <param name="C"></param>
/// <param name="N"></param>
/// <param name="U"></param>
/// <param name="S"></param>
//////////////////////////////////////////////////////////////////////////
template<class T>
void GetConditionCorrectionWithCondition(T correction[],const T matrixA[],const T matrixB[],const T matrixC[],const T W[],const T Wx[],int C,int N,int U,int S)
{
T *transposedA=new T[N*C];
T *transposedB=new T[U*C];
T *transposedC=new T[U*S];
T *Naa=new T[C*C];
T *inverseForNaa=new T[C*C];
T *Nbb=new T[U*U];
T *inverseForNbb=new T[U*U];
T *Ncc=new T[S*S];
T *inverseForNcc=new T[S*S];
T *We=new T[U];
T *x=new T[U];
MatrixTranspose(matrixA,transposedA,C,N);
MultMatrix(matrixA,transposedA,Naa,C,N,C);
MatrixAnti(Naa,inverseForNaa,C);
MatrixTranspose(matrixB,transposedB,C,U);
T *transit1=new T[U*C];
MultMatrix(transposedB,inverseForNaa,transit1,U,C,C);
MultMatrix(transit1,matrixB,Nbb,U,C,U);
MatrixAnti(Nbb,inverseForNbb,U);
T *transit2=new T[U*C];
MultMatrix(transposedB,inverseForNaa,transit2,U,C,C);
MultMatrix(transit2,W,We,U,C,1);
T *transit3=new T[S*U];
MultMatrix(matrixC,inverseForNbb,transit3,S,U,U);
MatrixTranspose(matrixC,transposedC,S,U);
MultMatrix(transit3,transposedC,Ncc,S,U,S);
MatrixAnti(Ncc,inverseForNcc,S);
T *transit4=new T[U*S];
MultMatrix(inverseForNbb,transposedC,transit4,U,U,S);
T *transit5=new T[U*S];
MultMatrix(transit4,inverseForNcc,transit5,U,S,S);
T *transit6=new T[U*U];
MultMatrix(transit5,matrixC,transit6,U,S,U);
T *transit7=new T[U*U];
MultMatrix(transit6,inverseForNbb,transit7,U,U);
MatrixMinus(inverseForNbb,transit7,transit7,U,U);
T *transit8=new T[U];
MultMatrix(transit7,We,transit8,U,U,1);
T *transit9=new T[U];
MultMatrix(transit5,Wx,transit9,U,S,1);
MatrixMinus(transit9,transit9,correction,U,1);
MatrixMinus(correction,transit8,correction,U,1);
MatrixMinus(correction,transit9,correction,U,1);
delete [] transposedA;
delete [] transposedB;
delete [] transposedC;
delete [] Naa;
delete [] inverseForNaa;
delete [] Nbb;
delete [] inverseForNbb;
delete [] Ncc;
delete [] inverseForNcc;
delete [] We;
delete [] x;
delete [] transit1;
delete [] transit2;
delete [] transit3;
delete [] transit4;
delete [] transit5;
delete [] transit6;
delete [] transit7;
delete [] transit8;
delete [] transit9;
}
下面进行精度评定,附有限制条件的条件平差的单位权方差估值也是
除以它的自由度,即
另外,应用协因数传播率,可得
参考资料:
[1] 误差理论与测量平差基础 武汉大学测绘学院测量平差学科组编著
[2] 变分学讲义 张恭庆著
转载请注明出处:http://blog.csdn.net/fourierFeng/article/details/76862227