为什么要平差,我们知道是因为我们测量的数据(在有多余观测的条件下)产生了矛盾。比如我们测一个三角形,如果只测了两个角,我们知道第三个角一定是180度减前两个角的和。但是如果我们测了三个角,但三个角加起来不等于180度,那就说明测得有误差,我们就需要用一些手段进行平差,消除这些误差
平差最主要的两种是间接平差和条件平差,它们的区别可以参考这里,间接平差使用的比条件平差多得多。简单的说条件平差就是以公理为条件构造条件方程,条件平差不含有独立参数,表示为观测量的隐函数形式,再使用最小二乘即可。但是方程的公理性质不容易找齐,而且这些公理之间必须是互相独立的,要保证列出的方程组无关,所以使用起来比较不容易列齐条件方程。而间接平差是先建立近似的模型,然后来找到真正的模型与近似模型间的改正数,使其平方和最小即可
还是以一个题来说,这是学校平差课的实验题,现在看着当年写的报告,不知道写的什么**玩意儿,只能重新思考了
如题(就看第一个问就行了)
我们看题中要求得
P
1
P_{1}
P1、
P
2
P_{2}
P2和
P
3
P_{3}
P3的高,必要观测只需要3条边的高差观测值,比如由
P
1
=
H
A
+
h
1
P_{1}=H_{A}+h_{1}
P1=HA+h1、
P
2
=
H
A
+
h
2
P_{2}=H_{A}+h_{2}
P2=HA+h2、
P
3
=
H
B
+
h
4
P_{3}=H_{B}+h_{4}
P3=HB+h4只要事实上我们测了
h
1
h_{1}
h1、
h
2
h_{2}
h2和
h
3
h_{3}
h3就行了,但是我们一共测了7条边,所以这里我们的必要观测数
t
=
3
t=3
t=3,总的观测数
n
=
7
n=7
n=7,所以我们多余观测数为
r
=
n
−
t
=
4
r=n-t=4
r=n−t=4。在条件平差中,有多少的多余观测,就需要多少的条件方程,所以这里我们需要4个条件方程
现在我们来看图找公理。最容易想到的是,从一个点出去转一圈回来,高程不变嘛,所以根据此我们应该可以得到下面几个公式是正确的(注意,这些公式要是无关的),但是我们测的数据加起来却不是这样的
h
1
−
h
2
+
h
5
=
0
h
5
+
h
6
−
h
7
=
0
h
3
−
h
6
−
h
4
=
0
h
1
−
h
3
+
H
A
−
H
B
=
0
h_{1}-h_{2}+h_{5}=0\\ h_{5}+h_{6}-h_{7}=0\\ h_{3}-h_{6}-h_{4}=0\\ h_{1}-h_{3}+H_{A}-H_{B}=0
h1−h2+h5=0h5+h6−h7=0h3−h6−h4=0h1−h3+HA−HB=0
这里我们根据下面两个公式化简一下。这里的第一个公式就是我们上面的条件方程,只是上面是理论的,没有写上加上
A
0
A0
A0才为零;下面的式子中
L
^
\hat{L}
L^表示改正后的值,
V
V
V是改正数,也就是真实值等于测量值加上改正值
A
L
^
+
A
0
=
0
L
^
=
L
+
V
A\hat{L}+A^{0}=0\\ \hat{L}=L+V
AL^+A0=0L^=L+V
得到了
A
V
+
W
=
0
AV+W=0
AV+W=0,此即为条件平差的函数模型,
W
W
W是之前我们算出的闭合差(也就是走一圈回到原点的高程差,这里让改正数和等于闭合差可以看成这样,比如第一个公式,我们需要
h
1
+
v
1
−
(
h
2
+
v
2
)
+
h
5
+
v
5
=
0
h_{1}+v_{1}-(h_{2}+v_{2})+h_{5}+v_{5}=0
h1+v1−(h2+v2)+h5+v5=0,推出
v
1
−
v
2
+
v
5
+
(
h
1
−
h
2
+
h
5
)
=
0
v_{1}-v_{2}+v_{5}+(h_{1}-h_{2}+h_{5})=0
v1−v2+v5+(h1−h2+h5)=0,我们计算可以得到
W
1
=
h
1
−
h
2
+
h
5
=
7
W_{1}=h_{1}-h_{2}+h_{5}=7
W1=h1−h2+h5=7,其他类似),现在我们按照这个形式列出条件方程(注意,单位是毫米mm)
v
1
−
v
2
+
v
5
+
7
=
0
v
5
+
v
6
−
v
7
+
7
=
0
v
3
−
v
6
−
v
4
+
3
=
0
v
1
−
v
3
+
H
A
−
H
B
−
4
=
0
v_{1}-v_{2}+v_{5}+7=0\\ v_{5}+v_{6}-v_{7}+7=0\\ v_{3}-v_{6}-v_{4}+3=0\\ v_{1}-v_{3}+H_{A}-H_{B}-4=0
v1−v2+v5+7=0v5+v6−v7+7=0v3−v6−v4+3=0v1−v3+HA−HB−4=0
这下我们就可以开始算了,先把知道的矩阵列出来,首先是
A
A
A和
W
W
W阵,还可以把权阵
P
P
P列出来,根据对应路线的长度,设2km为单位权,得到
A
=
[
1
−
1
0
0
1
0
0
0
0
0
0
1
1
−
1
0
0
1
−
1
0
−
1
0
1
0
−
1
0
0
0
0
]
W
=
[
7
7
3
4
]
P
=
[
2
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
1
]
A= \left[ \begin{matrix} 1 & -1 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 1 & -1\\ 0 & 0 & 1 & -1 & 0 & -1 & 0\\ 1 & 0 & -1 & 0 & 0 & 0 & 0 \end{matrix} \right] W= \left[ \begin{matrix} 7\\ 7\\ 3\\ 4 \end{matrix} \right] \\P= \left[ \begin{matrix} 2 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 2 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 2 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 2 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{matrix} \right]
A=⎣⎢⎢⎡1001−1000001−100−10110001−100−100⎦⎥⎥⎤W=⎣⎢⎢⎡7734⎦⎥⎥⎤P=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡2000000020000000100000001000000020000000200000001⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
现在我们的目标依旧没变,使得
V
T
P
V
=
m
i
n
V^{T}PV=min
VTPV=min,因为我们使用了条件方程,就像附有条件的间接平差,代价函数
V
T
P
V
V^{T}PV
VTPV限制在了条件之中,所以这里要用到拉格朗日乘子法,得到的新的代价为
Φ
=
V
T
P
V
−
2
K
T
(
A
V
+
W
)
\Phi=V^{T}PV−2K^{T}(AV+W)
Φ=VTPV−2KT(AV+W),同样的我们要将
Φ
\Phi
Φ对
V
V
V求导,并等于零,即
∂
(
Φ
)
∂
(
V
)
=
2
V
T
P
−
2
K
T
A
=
0
V
=
−
P
−
1
A
T
(
A
P
−
1
A
T
)
−
1
W
\frac{\partial(\Phi)}{\partial(V)}=2V^{T}P−2K^{T}A=0\\ V=-P^{-1}A^{T}(AP^{-1}A^{T})^{-1}W
∂(V)∂(Φ)=2VTP−2KTA=0V=−P−1AT(AP−1AT)−1W
推导的过程可以参考这里,现在我们就可以计算一下了,先输入数据,查看一下数据的维度
A = np.array([[1,-1,0,0,1,0,0],
[0,0,0,0,1,1,-1],
[0,0,1,-1,0,-1,0],
[1,0,-1,0,0,0,0]])
W = np.array([7,7,3,-4]).T.reshape(4,1)
P = np.array([[2,0,0,0,0,0,0],
[0,2,0,0,0,0,0],
[0,0,1,0,0,0,0],
[0,0,0,1,0,0,0],
[0,0,0,0,2,0,0],
[0,0,0,0,0,2,0],
[0,0,0,0,0,0,1]])
print(A.shape)
print(W.shape)
print(P.shape)
这里输出为
(4, 7)
(4, 1)
(7, 7)
好,现在开始写方程计算
Q = np.linalg.inv(P)
Naa = np.dot(np.dot(A, Q), A.T)
K = np.dot(np.linalg.inv(Naa), W)
V = -np.dot(np.dot(Q, A.T), K)
print(V)
得到结果,这里从上到下分别对应 v 1 v_{1} v1到 v 7 v_{7} v7
[[-0.42696629]
[ 2.7752809 ]
[-4.42696629]
[-0.26966292]
[-3.79775281]
[-1.15730337]
[ 2.04494382]]
现在我们改成一下
h
1
h1
h1、
h
2
h2
h2和
h
5
h5
h5,然后再算一下
h
1
−
h
2
+
h
5
=
0
h1-h2+h5=0
h1−h2+h5=0是否成立
h
1
^
=
h
1
+
v
1
=
1.358573034
h
2
^
=
h
2
+
v
2
=
2.011775281
h
5
^
=
h
5
+
v
h
=
0.653202247
\hat{h_{1}}=h_{1}+v_{1}=1.358573034\\ \hat{h_{2}}=h_{2}+v_{2}=2.011775281\\ \hat{h_{5}}=h_{5}+v_{h}=0.653202247
h1^=h1+v1=1.358573034h2^=h2+v2=2.011775281h5^=h5+vh=0.653202247
现在计算得到
h
1
−
h
2
+
h
5
=
0
h1-h2+h5=0
h1−h2+h5=0,对了完毕收工。现在再把这道题的答案算了
P
1
=
H
A
+
h
1
+
v
1
=
457.596573
P
2
=
H
A
+
h
2
+
v
2
=
458.2497753
P
3
=
H
B
+
h
4
+
v
4
=
456.5977303
P_{1}=H_{A}+h_{1}+v_{1}=457.596573\\ P_{2}=H_{A}+h_{2}+v_{2}=458.2497753\\ P_{3}=H_{B}+h_{4}+v_{4}=456.5977303
P1=HA+h1+v1=457.596573P2=HA+h2+v2=458.2497753P3=HB+h4+v4=456.5977303