测量平差之间接平差

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

今年3月份的时候我在公司写一个算法接触到测量平差理论,感慨于它的算法的优美,利用最小二乘而又独成体系,在测量拟合中发挥着巨大的作用。但网上关于它的描述甚少,更不用说好的实现代码,我将写两篇文章来说一下间接平差和附加限制条件的间接平差,这一篇先说间接平差。
在测量拟合中,由于观测结果不可避免地存在着误差,因此,如何处理带有误差的观测值,找出待求量的最佳估值,是最小二乘平差所研究的内容。在一个平差问题中,当所选的独立参数 X ^ 的个数等于必要观测数 t 时,可将每个观测值表达成这 t 个参数的函数,组成观测方程,这种以观测方程为函数模型的平差方法,就是间接平差。用数学语言描述就是:通过在映射 B 的像上的平差间接地反映原像上的平差过程的算法
一般而言,如果某平差问题有 n 个观测值, t 个必要观测值,选择 t 个独立量作为平差参数 X ^ t 1 ,则每个观测值必定可以表达成这 t 个参数的函数,即有:

L ^ n 1 = F ( X ^ )
如果表达式是线性的,一般为:
L ^ n 1 = B n t X ^ t 1 + d n 1
其中自由度是: r = n t
平差时,一般对参数 X ^ 都要取近似值 X 0 ,令
X ^ = X 0 + x ^
代入上式,并令
l = L ( B X 0 + d ) = L L 0
L 0 = B X 0 + d 为观测值的近似值,所以 l 是观测值与其近似值之差,由此可得误差方程
V = B x ^ l
平差准则为
V T P V = m i n
以上是基本原理,下面就逐步推到得到平差公式。
设有 n 个观测值方程为:
L 1 + v 1 = a 1 X 1 ^ + b 1 X 2 ^ + + t 1 X t ^ + d 1 L 2 + v 2 = a 2 X 1 ^ + b 2 X 2 ^ + + t 2 X t ^ + d 2 L n + v n = a n X 1 ^ + b n X 2 ^ + + t n X t ^ + d n
X j ^ = X j 0 + x j ^ ( j = 1 , 2 , , t )
l i = L i ( a i X 1 ^ + b i X 2 ^ + + t i X t ^ + d i ) ( i = 1 , 2 , , n )
可得最终的误差方程为
v i = a i x 1 ^ + b i x 2 ^ + + t i x t ^ l i ( i = 1 , 2 , , n )
其中:
B n t = [ a 1 b 1 t 1 a 2 b 2 t 2 a n b n t n ]
V n 1 = [ v 1 v 2 v n ] T
x t 1 ^ = [ x ^ 1 x ^ 2 x ^ t ] T
l n 1 = [ l 1 l 2 l n ] T
按最小二乘原理,可得:
V T P V x ^ = 2 V T P V x ^ = V T P B = 0

上述方程与 V = B x ^ l 联立,解得:
B T P B x ^ B T P l = 0
N B B = B T P B , W = B T P l
上式可简写为:
N B B x ^ W = 0
式中系数阵 N B B 为满秩, x ^ 有唯一解,上式称为间接平差的法方程。解之得:
x ^ = N B B 1 W
从而平差结果为:
X ^ = X 0 + x ^
其中, P 是观测数据的协因数阵的逆矩阵,一般可认为是单位矩阵。
下面是具体的代码实现,其中基本的矩阵运算没有在下面给出,在 矩阵算法相关代码,如有需要可以下载。

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

最后再说一下精度评定,首先通过下面的公式得到单位权中误差:

σ ^ 0 = V T P V n t
其中 n 为方程数, t 为拟合向量的维数。平差值的协因数阵根据下面公式求得:
Q x ^ x ^ = N B B 1
假定间接平差问题中有 t 个参数,设参数的函数为:
φ ^ = ϕ ( X 1 ^ , X 2 ^ , , X t ^ )
为求函数 ϕ 的中误差,先对上式全微分得权函数式为:
d φ ^ = f 1 d X 1 ^ + f 2 d X 2 ^ + + f t d X t ^
F T = [ f 1 f 2 f t ] ,则函数 φ ^ 的协因数阵为:
Q φ ^ φ ^ = F T Q x ^ x ^ F = F T N B B 1 F

最后由下面公式可算得平差值函数的中误差:
σ ^ φ ^ = σ ^ 0 × Q φ ^ φ ^

参考文献:
[1] 误差理论与测量平差基础 武汉大学测绘学院测量平差学科组编著

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

猜你喜欢

转载自blog.csdn.net/fourierFeng/article/details/47272167