测量平差之附有限制条件的条件平差(概括平差模型)

版权声明:转载本博客原创文章,请标明出处并附上链接。 https://blog.csdn.net/fourierFeng/article/details/76862227

接下来要写的可看成是对前面讲过的四种经典平差方法的概括模型。
从四种基本平差算法的函数模型来看,主要包括如下两种类型的条件方程:

{ F ( L ^ , X ^ ) = 0 ϕ ( X ^ ) = 0

第一种方程中同时含有观测值和未知参数,称为一般条件方程;第二种方程则只含有未知参数而无观测值,称为限制条件方程。
一般而言,对于任何一个平差问题,设想观测值个数为 n ,必要观测数为 t ,则多余观测数 r = n + t 。若增选了 u 个参数,不论 u < t , u = t u > t ,也不论参数是否独立,每增加一个参数则相应的多产生一个方程,故总共应列出 r + u 个方程。如果在 u 个参数中有 s 个是不独立的,或者说,在这 u 个参数之间存在着 s 个函数关系式,则应列出 s 个限制条件方程,此外,还应列出 c r + u s 个一般条件方程,如此就形成了如下的函数模型:
F c 1 ( L ^ , X ^ ) = 0 ϕ s 1 ( X ^ ) = 0
这就是附有限制条件的条件平差函数模型。其线性形式可概括如下:
A c n V n 1 + B c u x ^ u 1 + W c 1 = 0 C s u x ^ u 1 + W x s 1 = 0
式中
W = F ( L , X 0 ) , W x = ϕ ( X 0 )
其中, X 0 是未知参数的初始值,一般选择在收敛值的某个开邻域 U 里,使得 U 必须和3维欧式空间 R 3 中的一个开子集是同胚的。
c = r + u s , c > r , s < u ,系数矩阵的秩分别为
R ( A ) = c , R ( B ) = u , R ( C ) = s
随机模型为
D n n = σ 0 2 Q n n = σ 0 2 P n n 1
在大多数情况下,参数之间是等价的,不需要加权,这时候 P 是单位矩阵。
上面提到过,该模型是四种平差模型的综合:

  1. 系数阵中的 B = 0 , C = 0 时,它就变成了条件平差法的函数模型。
  2. 系数阵中的 C = 0 ,它就变成了附有参数的条件平差的函数模型。
  3. 系数阵中的 A = I C = 0 时,它就变成了间接平差法的函数模型。
  4. 系数阵中的 A = I 时,就变成了附有限制条件的间接平差法的函数模型。

由此,也称之为“概括平差模型”。
回到正题来简化数学模型,上面的线性模型用拉格朗日乘子进行复合,组成函数如下:

ϕ = V T P V 2 K T ( A V + B x ^ + W ) 2 K s T ( C x ^ + W x )

注意,这里有两个拉格朗日乘子,对于拉格朗日乘子,可参看我的另外一篇文章: 拉格朗日乘子法的由来
由凸优化理论,要计算该极值,需对 V x ^ K K s 分别取极值,即是求偏导并令其为零,得
Φ V = 2 V T P 2 K T A = 0 Φ x ^ = 2 K T B 2 K s T C = 0 A V + B x ^ + W = 0 C x ^ + W x = 0

上面四式包含 n 个改正数, u 个参数, c 个对应于一般条件方程的联系数以及 s 个对应于限制条件方程的联系数,而方程个数为 c + s + n + u ,即方程个数等于未知数个数,故有唯一解。以上四式成为附有限制条件的条件平差法的基础方程。
解此基础方程,令
N A A = A Q A T

N A A K + B x ^ + W = 0 B T K + C T K s = 0 C x ^ + W x = 0

以上三式称为附有限制条件的条件平差的法方程。
由法方程得
K = N A A 1 ( W + B x ^ ) B T N A A 1 B x ^ C T K + B T N A A 1 W = 0
若令
N B B = B T N A A 1 B , W e = B T N A A 1 W
可进一步化简得
N B B x ^ C T K s + W e = 0
解出 x ^ ,得
x ^ = N B B 1 ( C T K s W e )
将上式代入 C x ^ + W x = 0 ,得
N C C K s C N B B 1 W e + W x = 0

其中 N C C = C N B B 1 C T 。解出 K s
K s = N C C 1 ( W x C N B B 1 W e )
经整理即得:
x ^ = ( N B B 1 N B B 1 C T N C C 1 C N B B 1 ) W e N B B 1 C T N C C 1 W x

下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在 矩阵算法相关代码,如有需要可以下载。

// <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;
}

下面进行精度评定,附有限制条件的条件平差的单位权方差估值也是 V T P V 除以它的自由度,即

σ ^ 0 2 = V T P V r = V T P V c u + s

另外,应用协因数传播率,可得
Q x ^ x ^ = N B B 1 N B B 1 C T N C C 1 C N B B 1
则平差值函数的中误差很容易得到,在这里不想写的太详细了,前面几篇文章详细讨论过。

参考资料:
[1] 误差理论与测量平差基础 武汉大学测绘学院测量平差学科组编著
[2] 变分学讲义 张恭庆著

转载请注明出处:http://blog.csdn.net/fourierFeng/article/details/76862227

猜你喜欢

转载自blog.csdn.net/fourierFeng/article/details/76862227
今日推荐