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

接下来要写的可看成是对前面讲过的四种经典平差方法的概括模型。
从四种基本平差算法的函数模型来看,主要包括如下两种类型的条件方程: { F ( L ^ , X ^ ) = 0 ϕ ( X ^ ) = 0 \left\{\begin{matrix} F(\hat{L},\hat{X})=0\\ \phi (\hat{X})=0 \end{matrix}\right. {F(L^,X^)=0ϕ(X^)=0
第一种方程中同时含有观测值和未知参数,称为一般条件方程;第二种方程则只含有未知参数而无观测值,称为限制条件方程。
一般而言,对于任何一个平差问题,设想观测值个数为 n n n,必要观测数为 t t t,则多余观测数 r = n + t r=n+t r=n+t。若增选了 u u u个参数,不论 u < t , u = t u<t,u=t u<t,u=t u > t u>t u>t,也不论参数是否独立,每增加一个参数则相应的多产生一个方程,故总共应列出 r + u r+u r+u个方程。如果在 u u u个参数中有 s s s个是不独立的,或者说,在这 u u u个参数之间存在着 s s s个函数关系式,则应列出 s s s个限制条件方程,此外,还应列出 c − r + u − s c-r+u-s cr+us个一般条件方程,如此就形成了如下的函数模型: F c   1 ( L ^ , X ^ ) = 0 ϕ s   1 ( X ^ ) = 0 \begin{matrix} \underset{c\,1 }{F}(\hat{L},\hat{X})=0\\ \underset{s\, 1}{\phi}(\hat{X})=0 \end{matrix} c1F(L^,X^)=0s1ϕ(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 \begin{matrix} \underset{c\,n }{A}\underset{n\,1 }{V}+\underset{c\,u }{B}\underset{u\,1}{\hat{x}}+\underset{c\,1}{W}=0\\ \underset{s\,u}{C}\underset{u\,1}{\hat{x}}+\underset{s\,1}{W_{x}}=0 \end{matrix} cnAn1V+cuBu1x^+c1W=0suCu1x^+s1Wx=0式中 W = F ( L , X 0 ) , W x = ϕ ( X 0 ) W=F(L,X^{0}),W_{x}=\phi(X^{0}) W=F(L,X0),Wx=ϕ(X0)其中, X 0 X^{0} X0是未知参数的初始值,一般选择在收敛值的某个开邻域 U U U里,使得 U U U必须和3维欧式空间 R 3 R^{3} R3中的一个开子集是同胚的。
c = r + u − s , c > r , s < u c=r+u-s,c>r,s<u c=r+us,c>r,s<u,系数矩阵的秩分别为 R ( A ) = c , R ( B ) = u , R ( C ) = s R(A)=c,R(B)=u,R(C)=s R(A)=c,R(B)=u,R(C)=s随机模型为 D n   n = σ 0 2 Q n   n = σ 0 2 P n   n − 1 \underset{n\, n}{D}=\sigma _{0}^{2} \underset{n\, n}{Q}=\sigma _{0}^{2} \underset{n\, n}{P}^{-1} nnD=σ02nnQ=σ02nnP1在大多数情况下,参数之间是等价的,不需要加权,这时候 P P P是单位矩阵。
上面提到过,该模型是四种平差模型的综合:

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

由此,也称之为“概括平差模型”。
回到正题来简化数学模型,上面的线性模型用拉格朗日乘子进行复合,组成函数如下: ϕ = V T P V − 2 K T ( A V + B x ^ + W ) − 2 K s T ( C x ^ + W x ) \phi=V^{T}PV-2K^{T}(AV+B\hat{x}+W)-2K_{s}^{T}(C\hat{x}+W_{x}) ϕ=VTPV2KT(AV+Bx^+W)2KsT(Cx^+Wx)
注意,这里有两个拉格朗日乘子,对于拉格朗日乘子,可参看我的另外一篇文章:拉格朗日乘子法的由来
由凸优化理论,要计算该极值,需对 V V V x ^ \hat{x} x^ K K K K s K_{s} Ks分别取极值,即是求偏导并令其为零,得 ∂ Φ ∂ 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 \begin{matrix} \frac{\partial \Phi }{\partial V}=2V^{T}P-2K^{T}A=0\\ \frac{\partial \Phi }{\partial \hat{x}}=-2K^{T}B-2K_{s}^{T}C=0\\ AV+B\hat{x}+W=0\\ C\hat{x}+W_{x}=0 \end{matrix} VΦ=2VTP2KTA=0x^Φ=2KTB2KsTC=0AV+Bx^+W=0Cx^+Wx=0
上面四式包含 n n n个改正数, u u u个参数, c c c个对应于一般条件方程的联系数以及 s s s个对应于限制条件方程的联系数,而方程个数为 c + s + n + u c+s+n+u c+s+n+u,即方程个数等于未知数个数,故有唯一解。以上四式成为附有限制条件的条件平差法的基础方程。
解此基础方程,令 N A A = A Q A T N_{AA}=AQA^{T} NAA=AQAT
N A A K + B x ^ + W = 0 B T K + C T K s = 0 C x ^ + W x = 0 \begin{matrix} N_{AA}K+B\hat{x}+W=0\\ B^{T}K+C^{T}K_{s}=0\\ C\hat{x}+W_{x}=0 \end{matrix} NAAK+Bx^+W=0BTK+CTKs=0Cx^+Wx=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 \begin{matrix} K=-N_{AA}^{-1}(W+B\hat{x})\\ \\ B^{T}N_{AA}^{-1}B\hat{x}-C^{T}K+B^{T}N_{AA}^{-1}W=0 \end{matrix} K=NAA1(W+Bx^)BTNAA1Bx^CTK+BTNAA1W=0若令 N B B = B T N A A − 1 B , W e = B T N A A − 1 W N_{BB}=B^{T}N_{AA}^{-1}B,W_{e}=B^{T}N_{AA}^{-1}W NBB=BTNAA1B,We=BTNAA1W可进一步化简得
N B B x ^ − C T K s + W e = 0 N_{BB}\hat{x}-C^{T}K_{s}+W_{e}=0 NBBx^CTKs+We=0解出 x ^ \hat{x} x^,得 x ^ = N B B − 1 ( C T K s − W e ) \hat{x}=N_{BB}^{-1}(C^{T}K_{s}-W_{e}) x^=NBB1(CTKsWe)将上式代入 C x ^ + W x = 0 C\hat{x}+W_{x}=0 Cx^+Wx=0,得 N C C K s − C N B B − 1 W e + W x = 0 N_{CC}K_{s}-CN_{BB}^{-1}W_{e}+W_{x}=0 NCCKsCNBB1We+Wx=0
其中 N C C = C N B B − 1 C T N_{CC}=CN_{BB}^{-1}C^{T} NCC=CNBB1CT。解出 K s K_{s} Ks K s = − N C C − 1 ( W x − C N B B − 1 W e ) K_{s}=-N_{CC}^{-1}(W_{x}-CN_{BB}^{-1}W_{e}) Ks=NCC1(WxCNBB1We)经整理即得: 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 \hat{x}=-(N_{BB}^{-1}-N_{BB}^{-1}C^{T}N_{CC}^{-1}CN_{BB}^{-1})W_{e}-N_{BB}^{-1}C^{T}N_{CC}^{-1}W_{x} x^=(NBB1NBB1CTNCC1CNBB1)WeNBB1CTNCC1Wx
下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在矩阵算法相关代码,如有需要可以下载。

// <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 V^{T}PV VTPV除以它的自由度,即
σ ^ 0 2 = V T P V r = V T P V c − u + s \hat{\sigma }_{0}^{2}=\frac{V^{T}PV}{r}=\frac{V^{T}PV}{c-u+s} σ^02=rVTPV=cu+sVTPV
另外,应用协因数传播率,可得 Q x ^ x ^ = N B B − 1 − N B B − 1 C T N C C − 1 C N B B − 1 Q_{\hat{x}\hat{x}}=N_{BB}^{-1}-N_{BB}^{-1}C^{T}N_{CC}^{-1}CN_{BB}^{-1} Qx^x^=NBB1NBB1CTNCC1CNBB1则平差值函数的中误差很容易得到,在这里不想写的太详细了,前面几篇文章详细讨论过。

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

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

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
按间接平差原理写的代码,绝对有用,真实可靠 Dim strFileName As String Dim nn%, un%, tn%, hn% '已知点个数,未知点个数,总点数,观测值个数 Dim Pname() As String '点名数组 Dim Hknown() As Double '已知高程数组,存放已知点高程和高程近似值 Dim be%(), en%() '观测值的起点和终点编号数组,存储的是点序号 Dim h#(), s#() '高差观测值数组和距离观测值数组 Dim A#(), X#(), P#(), L#() '间接平差的系数阵、解向量、权阵和常数向量 '平差计算 Private Sub mnuAdj_Click() Dim i%, j% ReDim X(1 To un) InAdjust A, P, L, X '调用间接平差的通用过程求解 '计算并显示高程平差结果 txtShow.Text = txtShow.Text & "平差计算结果:" & vbCrLf txtShow.Text = txtShow.Text & "点号 初始高程(m) 高程改正数(m) 平差后高程(m)" & vbCrLf For i = 1 To un txtShow.Text = txtShow.Text & Pname(nn + i) & " " & Format(Hknown(nn + i), "0.0000") Hknown(nn + i) = Hknown(nn + i) + X(i) txtShow.Text = txtShow.Text & " " & Format(X(i), "0.0000") & " " & Format(Hknown(nn + i), "0.0000") & vbCrLf Next i txtShow.Text = txtShow.Text & vbCrLf '计算并显示单位权中误差--------->>精度评定部分应该也包含在间接平差模块里,一起来调用 ' Dim dblT As Double ' dblT = 0 ' For i = 1 To un ' ' Next i End Sub '列立误差方程:给A、P、L赋值 Private Sub mnuEqu_Click() Dim i%, j% ReDim A(1 To hn, 1 To un), L(1 To hn), P(1 To hn, 1 To hn) '对每个观测值列误差方程 For i = 1 To hn If en(i) > nn Then A(i, en(i) - nn) = 1 '若终点未知,则给终点对应的系数矩阵元素赋值 If be(i) > nn Then A(i, be(i) - nn) = -1 '若起点未知,则给起点对应的系数矩阵元素赋值 L(i) = -(Hknown(en(i)) - Hknown(be(i)) - h(i)) '根据起终点计算常数项 P(i, i) = 1 / s(i) '以距离的倒数为权 Next i '显示误差方程 txtShow.Text = txtShow.Text & " 列立的误差方程:" & vbCrLf For i = 1 To hn For j = 1 To un txtShow.Text = txtShow.Text & A(i, j) & " " Next j txtShow.Text = txtShow.Text & " " & Format(L(i), "0.0000") & vbCrLf Next i txtShow.Text = txtShow.Text & "权矩阵:" & vbCrLf For i = 1 To hn For j = 1 To hn txtShow.Text = txtShow.Text & P(i, j) & " " Next j txtShow.Text = txtShow.Text & vbCrLf Next i End Sub '计算近似高程 Private Sub mnuHeight_Click() Dim i%, j% For i = 1 To un For j = 1 To hn If be(j) = nn + i And en(j) < nn + i Then '找到一个起点相同且终点已知的观测值 Hknown(nn + i) = Hknown(en(j)) - h(j) Exit For End If If en(j) = nn + i And be(j) < nn + i Then '找到一个终点相同且起点已知的观测值 Hknown(nn + i) = Hknown(be(j)) + h(j) Exit For End If Next j Next i '显示近似高程计算结果 txtShow.Text = txtShow.Text & " 近似高程计算结果: " & vbCrLf For i = 1 To un txtShow.Text = txtShow.Text & Pname(i + nn) & ":" & Format(Hknown(i + nn), "0.000") & vbCrLf Next i End Sub '退出程序 Private Sub mnuExit_Click() End End Sub '打开文件 Private Sub mnuOpen_Click() Dim i As Integer '循环变量 Dim strT1 As String, strT2 As String CDg1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*" CDg1.ShowOpen '打开对话框 strFileName = CDg1.FileName '获得选中的文件名和路径 Open strFileName For Input As #1 '打开文件 Input #1, nn, un, hn '读入已知点个数,未知点个数,观测值个数 tn = nn + un ReDim Pname(1 To tn), Hknown(1 To tn) ReDim h(1 To hn), s(1 To hn), be(1 To hn), en(1 To hn) For i = 1 To tn '读入点名 Input #1, Pname(i) Next i For i = 1 To nn '读入已知高程 Input #1, Hknown(i) Next i For i = 1 To hn '读入各观测值 Input #1, strT1, strT2, h(i), s(i) be(i) = Order(strT1): en(i) = Order(strT2) '给起终点数组排序 Next i '显示读入的数据 txtShow.Text = txtShow.Text & "读入的水准网数据:" & vbCrLf txtShow.Text = txtShow.Text & " 已知点" & nn & "个,未知点" & un & "个,观测值" & hn & "个。" & vbCrLf txtShow.Text = txtShow.Text & " 网中涉及的点名有:" For i = 1 To tn txtShow.Text = txtShow.Text & Pname(i) & "," Next i txtShow.Text = txtShow.Text & vbCrLf txtShow.Text = txtShow.Text & " 已知点高程为:" & vbCrLf For i = 1 To nn txtShow.Text = txtShow.Text & Pname(i) & "的高程为:" & Hknown(i) & vbCrLf Next i txtShow.Text = txtShow.Text & " 各观测值分别为:" & vbCrLf txtShow.Text = txtShow.Text & "起点" & " " & "终点" & " " & "高差观测值 " & " 距离观测值" & vbCrLf For i = 1 To hn txtShow.Text = txtShow.Text & Pname(be(i)) & " " & Pname(en(i)) & " " & Format(h(i), "0.000") & " " & Format(s(i), "0.000") & vbCrLf Next i Close #1 '不要忘记关闭文件 End Sub '点名-序号转换函数 Public Function Order(str As String) As Integer Dim i% For i = 1 To tn If str = Pname(i) Then Order = i Exit For End If Next i End Function '保存计算结果 Private Sub mnuSave_Click() CDg1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*" CDg1.ShowSave strFileName = CDg1.FileName Open strFileName For Output As #1 Print #1, txtShow.Text Close #1 End Sub

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值