在间接平差中我们,我们由正规方程使平差准则
V
T
P
V
=
m
i
n
V^TPV=min
VTPV=min,也就像线性回归中我们使用梯度下降找到了J的最小值,这些问题都可以简单看成在下面的图形中找到最低点,无论是正规方程还是梯度下降,都是力求导数趋近于零,此时对应的点就是最低点
而在附有限制条件的间接平差中,我们可以理解为依然要找到这个图形的最低点,只不过我们必须在要某个条件中,比如图中的平面。这时平面和曲面有一条交线,我们就需要在这条交线上寻找最低点,这里也就是左下角的点。这就是添加了限制条件的间接平差
对间接平差附加了限制条件,就使它的收敛过程完全按照某一规范进行,这可以使得拟合的过程非常规范,但是会影响收敛速度。在优化中有无约束、线性约束和非线性约束三种优化,无约束最简单,只需要求导等于零即可;在有等式约束时使用拉格朗日乘子法;在有不等约束时需要使用KKT条件。附有限制条件的间接平差就是在间接平差的基础上利用拉格朗日乘子法,关于拉格朗日乘子和KKT可以参考这篇博客。下面我们还是由一道简单的题说起
如题
首先我们肯定能想到,从A点出发,又回到A点,高程一定没有改变。可是这里呢, h = L 1 + L 2 + L 3 = − 0.006 h=L_1+L_2+L_3=-0.006 h=L1+L2+L3=−0.006,就不对了吧,就要搞它一下才行。这里给了 X A B X_{AB} XAB、 X B C X_{BC} XBC和 X C A X_{CA} XCA三个未知数,所以未知数个数 u = 3 u=3 u=3。由于只要知道了任意两个两点间的高差,就可以算出第三个两点之间的高差,所以必要观测数 t = 2 t=2 t=2。这里我们发现未知数个数比必要观测数还多了,所以就必须设定 s = u − t = 1 s=u-t=1 s=u−t=1个限制的条件才行,就不像间接平差中的必要观测数等于未知数个数。现在我们让 X i ^ = L i ^ \hat{X_i}=\hat{L_i} Xi^=Li^,在让 X i ^ = L i ^ \hat{X_i}=\hat{L_i} Xi^=Li^,我们按照间接平差的要求列误差方程
v 1 = x 1 ^ v 2 = x 2 ^ v 3 = x 3 ^ \begin{aligned} &v_1 = \hat{x_1}\\ &v_2 = \hat{x_2}\\ &v_3 = \hat{x_3} \end{aligned} v1=x1^v2=x2^v3=x3^
还有一个限制条件,就是 h = L 1 + L 2 + L 3 = − 0.006 h=L_1+L_2+L_3=-0.006 h=L1+L2+L3=−0.006, h h h应该是要等于零的,所以条件方程为(这里的单位是毫米mm)
h
=
0
⇒
x
1
^
+
x
2
^
+
x
3
^
+
6
=
0
h = 0\Rightarrow \hat{x_1} + \hat{x_2} + \hat{x_3} + 6 = 0
h=0⇒x1^+x2^+x3^+6=0
这是就得到了附有限制条件的间接平差的基础方程,详细的公式方面可以参考这篇博客
v = B x ^ − l 误 差 方 程 C x ^ − W x = 0 条 件 方 程 \begin{aligned} v &= B\hat{x} - l {\qquad\qquad误差方程}\\ C\hat{x} - W_x & = 0 {\qquad\qquad\qquad\ \ 条件方程} \end{aligned} vCx^−Wx=Bx^−l误差方程=0 条件方程
现在我们按照拉格朗日乘数法得到 Φ = V T P V + 2 K s T ( C x ^ − W x ) Φ=V^TPV+2K_s^T(C\hat{x}−W_x) Φ=VTPV+2KsT(Cx^−Wx),这是在附有限制条件的间接平差中我们需要优化寻找最小值的函数。我们对其求导,并让导数为零
d ( Φ ) / d ( x ^ ) = 0 x ^ = N B B − 1 − ( N B B − 1 ) C T ( N c c − 1 ) C ( N B B − 1 ) W − ( N B B − 1 ) C T ( N c c − 1 ) W x \begin{aligned} d(Φ) / d(\hat{x}) &= 0\\ \hat{x} &= N_{BB}^{-1}- (N_{BB}^{-1})C^T(N_{cc}^{-1})C(N_{BB}^{-1})W - (N_{BB}^{-1})C^T(N_{cc}^{-1})W_x \end{aligned} d(Φ)/d(x^)x^=0=NBB−1−(NBB−1)CT(Ncc−1)C(NBB−1)W−(NBB−1)CT(Ncc−1)Wx
推导可以自行百度,其中 N B B = B T P B N_{BB}=B^TPB NBB=BTPB, N c c = C N B B − 1 C T N_{cc}=CN^{−1}_{BB}C^T Ncc=CNBB−1CT。这个看起来太复杂了,我们也可以这样写,先可以求到这个式子
d ( Φ ) / d ( x ^ ) = 0 2 V T P B + 2 K s T C = 0 B T P V + C T K s = 0 B T P B x ^ + C T K s − B T P l = 0 B T P B x ^ + C T K s = B T P l \begin{aligned} d(Φ) / d(\hat{x}) &= 0\\ 2V^TPB + 2K_s^TC& = 0\\ B^TPV + C^TK_s &= 0\\ B^TPB\hat{x} + C^TK_s − B^TPl& = 0\\ B^TPB\hat{x} + C^TK_s &= B^TPl \end{aligned} d(Φ)/d(x^)2VTPB+2KsTCBTPV+CTKsBTPBx^+CTKs−BTPlBTPBx^+CTKs=0=0=0=0=BTPl
结合
C
x
^
−
W
x
=
0
C\hat{x} - W_x = 0
Cx^−Wx=0,我们可以将两个写成一个矩阵的形式
(
B
T
P
B
C
T
C
0
)
(
x
_
h
K
s
)
=
(
B
T
P
l
W
x
)
\left( \begin{matrix} BTPB & CT\\ C & 0 \end{matrix} \right) \left( \begin{matrix} x\_h\\ Ks \end{matrix} \right) = \left( \begin{matrix} BTPl\\ Wx \end{matrix} \right)
(BTPBCCT0)(x_hKs)=(BTPlWx)
这样比较好算x_h,我们可以知道
B
=
(
1
0
0
0
1
0
0
0
1
)
P
=
(
1
0
0
0
1
0
0
0
1
)
C
=
(
1
1
1
)
l
=
(
0
0
0
)
W
x
=
(
6
)
B = \left( \begin{matrix} 1 & 0& 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{matrix} \right) P = \left( \begin{matrix} 1 & 0& 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{matrix} \right) C = \left( \begin{matrix} 1 & 1 & 1 \end{matrix} \right) l = \left( \begin{matrix} 0 \\ 0 \\ 0 \end{matrix} \right)W_x = \left( \begin{matrix} 6 \end{matrix} \right)
B=⎝⎛100010001⎠⎞P=⎝⎛100010001⎠⎞C=(111)l=⎝⎛000⎠⎞Wx=(6)
根据矩阵的分块,带入可得
(
1
0
0
1
0
1
0
1
0
0
1
1
1
1
1
0
)
(
x
1
^
x
2
^
x
3
^
K
s
)
−
(
0
0
0
6
)
=
0
\left( \begin{matrix} 1 & 0& 0 & 1\\ 0 & 1 & 0 & 1\\ 0 & 0 & 1 & 1\\ 1 & 1 & 1 & 0 \end{matrix} \right) \left( \begin{matrix} \hat{x_1}\\ \hat{x_2}\\ \hat{x_3}\\ K_s \end{matrix} \right) - \left( \begin{matrix} 0\\ 0\\ 0\\ 6 \end{matrix} \right) = 0
⎝⎜⎜⎛1001010100111110⎠⎟⎟⎞⎝⎜⎜⎛x1^x2^x3^Ks⎠⎟⎟⎞−⎝⎜⎜⎛0006⎠⎟⎟⎞=0
现在移项并乘一个逆矩阵,得到
(
x
1
^
x
2
^
x
3
^
K
s
)
=
(
1
0
0
1
0
1
0
1
0
0
1
1
1
1
1
0
)
−
1
−
(
0
0
0
6
)
\left( \begin{matrix} \hat{x_1}\\ \hat{x_2}\\ \hat{x_3}\\ K_s \end{matrix} \right) = \left( \begin{matrix} 1 & 0& 0 & 1\\ 0 & 1 & 0 & 1\\ 0 & 0 & 1 & 1\\ 1 & 1 & 1 & 0 \end{matrix} \right)^{-1}- \left( \begin{matrix} 0\\ 0\\ 0\\ 6 \end{matrix} \right)
⎝⎜⎜⎛x1^x2^x3^Ks⎠⎟⎟⎞=⎝⎜⎜⎛1001010100111110⎠⎟⎟⎞−1−⎝⎜⎜⎛0006⎠⎟⎟⎞
计算一下
BTPB = np.array([[1,0,0,1],[0,1,0,1],[0,0,1,1],[1,1,1,0]])
x_ks = np.zeros((4,1))
BTPl_Wx = np.array([[0],[0],[0],[6]])
x_ks = np.dot(np.linalg.inv(BTPB), BTPl_Wx)
print(x_ks)
得到答案如下,我们可以知道 x i ^ \hat{x_i} xi^都为 2 2 2
[[ 2.]
[ 2.]
[ 2.]
[-2.]]
现在进行改正
L 1 ^ = X 1 ^ = X 1 + x 1 ^ = 0.008 + 0.002 = 0.010 L 2 ^ = X 2 ^ = X 2 + x 2 ^ = 0.016 + 0.002 = 0.018 L 3 ^ = X 3 ^ = X 3 + x 3 ^ = 0.030 + 0.002 = − 0.028 \begin{aligned} \hat{L_1} = \hat{X_1} = X_1 + \hat{x_1} = 0.008 + 0.002 = 0.010\\ \hat{L_2} = \hat{X_2} = X_2 + \hat{x_2} = 0.016 + 0.002 = 0.018\\ \hat{L_3} = \hat{X_3} = X_3 + \hat{x_3} = 0.030 + 0.002 = -0.028 \end{aligned} L1^=X1^=X1+x1^=0.008+0.002=0.010L2^=X2^=X2+x2^=0.016+0.002=0.018L3^=X3^=X3+x3^=0.030+0.002=−0.028
这时我们计算 h = L 1 ^ + L 2 ^ + L 3 ^ = 0 h=\hat{L_1}+\hat{L_2}+\hat{L_3}=0 h=L1^+L2^+L3^=0,现在我们就在限制条件内找到了最优化,这就是附有限制条件的间接平差