平差作業八
gnss 基線平差練習,分別使用極大權約制, 與使用條件平差二種作法,比較成果差異。
基線觀測方程式
基線是三維空間中連接二個點的向量, 而三維空間中的一點由三個維度的座標決定。 所以一條基線方程式應該在三個維度上展開, 成為三條觀測方程式; 對應的未知點也應該在三維上展開,成為三個未知數。
程式中函數 expand_3d_design_matrix
可以將針對向量的設計矩陣,
在三維上展開成 x y z 座標的設計矩陣。
間接平差模型
程式
% constrain adjustment
design_vector_matrix = [
-1 1 0 0 0
0 -1 1 0 0
0 0 -1 1 0
0 0 0 -1 1
-1 0 1 0 0
0 -1 0 1 0
0 0 -1 0 1
];
function m = expand_3d_design_matrix(mv)
%% expand [1 0 -1 0 0]
%% to [1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
%% 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0
%% 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0]
m = zeros(size(mv)*3);
for i = 1:rows(m)
for j = 1:columns(m)
if (mod(j,3) == mod(i,3))
m(i,j) = mv(ceil(i/3), ceil(j/3));
else
m(i,j) = 0;
end
end
end
end
design_magrix = expand_3d_design_matrix(design_vector_matrix);
baseline_vector_vector = [
11488.973 -13224.866 19.446
-5605.975 -6047.976 -7.814
13505.271 28936.647 5.247
-14911.055 -35571.005 -6.257
5882.998 -19272.842 11.632
7899.296 22888.671 -2.567
-1405.784 -6634.358 -1.010
];
baseline_vector = reshape(
baseline_vector_vector',
1, prod(size(baseline_vector_vector)))';
constrain_matrix = expand_3d_design_matrix([1 0 0 0 0]);
constrain_value = [177597.421 2639738.678 25.375]';
priority = 100;
normal_matrix = (
design_magrix'*design_magrix +
priority * constrain_matrix' * constrain_matrix
);
point = inv(normal_matrix) * (
design_magrix' * baseline_vector +
priority * constrain_matrix' * constrain_value
);
point_vector = reshape(point, 3, rows(point)/3)';
observation_residule = baseline_vector - design_magrix * point;
variance_post = observation_residule' * observation_residule / (
rows(baseline_vector) - rows(point) + rows(constrain_value)
);
point_covariance_matrix = variance_post * inv(normal_matrix);
結果
用 matlab 計算結果誤差極小。 若照題目看來,實際上是沒有誤差的, 各基線在題目給定的有效位數上閉合差為 0。 但用 matlab 計算會產生誤差, 實際上是因為二進位浮點數無法精確表示十進位小數。 例如許多程式語言中,0.1+0.2-0.3≠0。 因此這些誤差是沒有意義的,實際上都能視作 0。
\begin{bmatrix}
A \\ B \\ C \\ D \\ E
\end{bmatrix}
=
\begin{bmatrix}
1.7760 \times 10^{+05} & 2.6397 \times 10^{+06} & 2.5375 \times 10^{+01} \\
1.8909 \times 10^{+05} & 2.6265 \times 10^{+06} & 4.4821 \times 10^{+01} \\
1.8348 \times 10^{+05} & 2.6205 \times 10^{+06} & 3.7007 \times 10^{+01} \\
1.9699 \times 10^{+05} & 2.6494 \times 10^{+06} & 4.2254 \times 10^{+01} \\
1.8207 \times 10^{+05} & 2.6138 \times 10^{+06} & 3.5997 \times 10^{+01}
\end{bmatrix}
\\
\hat {\sigma_0} = 4.4228 \times 10 ^ {-10}
\\
\begin{bmatrix}
\sigma_{A_x}^2 & \sigma_{A_y}^2 & \sigma_{A_z}^2 \\
\vdots \\
\sigma_{E_x}^2 & \sigma_{E_y}^2 & \sigma_{E_z}^2
\end{bmatrix}
=
\begin{bmatrix}
1.9561 \times 10^{-23} & 1.9561 \times 10^{-23} & 1.9561 \times 10^{-23} \\
1.2111 \times 10^{-19} & 1.2111 \times 10^{-19} & 1.2111 \times 10^{-19} \\
1.2111 \times 10^{-19} & 1.2111 \times 10^{-19} & 1.2111 \times 10^{-19} \\
1.7700 \times 10^{-19} & 1.7700 \times 10^{-19} & 1.7700 \times 10^{-19} \\
2.2357 \times 10^{-19} & 2.2357 \times 10^{-19} & 2.2357 \times 10^{-19}
\end{bmatrix}
條件觀測平差
條件觀測平差是計算量較少,但較難以程式計算的平差方法。 需要針對觀測量,列出所有不相關的條件式。
題目中有 5 未知數,7 觀測方程式,1 條件, 應列出 7-5+1=3 條條件式。 各條件式寫成向量如下,純量形式一樣是在三維上展開。
v_1 + v_2 - v_5 = \vec{A B} + \vec{B C} - \vec{A C} \\
v_2 + v_3 - v_6 = \vec{B C} + \vec{C D} - \vec{B D} \\
v_3 + v_4 - v_7 = \vec{C D} + \vec{D E} - \vec{C E}
解法則是要先解出聯系數矩陣 K, 才能解殘差 V。 因為是條件式,解出來只有觀測量的殘差, 要再將殘差修正後的觀測量組合才能得出絕對點座標。 而本次作業等權,所以 P 矩陣為單位矩陣,可以忽略。
A V = W \\
A = \begin{bmatrix}
1 & 1 & 0 & 0 & -1 & 0 & 0 \\
0 & 1 & 1 & 0 & 0 & -1 & 0 \\
0 & 0 & 1 & 1 & 0 & 0 & -1
\end{bmatrix}
\\
W = \begin{bmatrix}
\vec{A B} + \vec{B C} - \vec{A C} \\
\vec{B C} + \vec{C D} - \vec{B D} \\
\vec{C D} + \vec{D E} - \vec{C E}
\end{bmatrix}
\\
K = N^{-1} W = (A P^{-1} A^T)^{-1} W \\
V = P^{-1} A^T K
程式
condition_vector_equation = [
1 1 0 0 -1 0 0
0 1 1 0 0 -1 0
0 0 1 1 0 0 -1
];
condition_equation = expand_3d_design_matrix(condition_vector_equation);
condition_vector_value = [
baseline_vector_vector(1,:) + baseline_vector_vector(2,:) - baseline_vector_vector(5,:);
baseline_vector_vector(2,:) + baseline_vector_vector(3,:) - baseline_vector_vector(6,:);
baseline_vector_vector(3,:) + baseline_vector_vector(4,:) - baseline_vector_vector(7,:);
];
condition_value = reshape(
condition_vector_value',
prod(size(condition_vector_value)), 1);
condition_normal = condition_equation * condition_equation';
condition_K = inv(condition_normal) * condition_value;
condition_residue = condition_equation' * condition_K;
condition_variance_post = (
condition_residue' * condition_residue / rows(condition_equation)
);
結果
條件平差解出來的結果是各觀測量的殘差, 所以需要把殘差加回觀測量, 再把觀測量組合,求出各點的絕對座標。
condition_fix_observation = baseline_vector - condition_residue;
condition_fix_vector = reshape(condition_fix_observation, 3, rows(condition_fix_observation) / 3)';
condition_point = zeros(columns(design_vector_matrix), 3);
condition_point(1,:) = constrain_value';
condition_point(2,:) = condition_point(1,:) + condition_fix_vector(1,:);
condition_point(3,:) = condition_point(1,:) + condition_fix_vector(5,:);
condition_point(4,:) = condition_point(3,:) + condition_fix_vector(3,:);
condition_point(5,:) = condition_point(4,:) + condition_fix_vector(4,:);
結果應該要與間接平差的結果相同。 但已知題目的基線是無誤差的, 在間接平差時只有浮點數誤差,條件平差也有。 但這二者的誤差,又因為計算不同,浮點數誤差也不同。
\begin{bmatrix}
A \\ B \\ C \\ D \\ E
\end{bmatrix}
=
\begin{bmatrix}
1.7760 \times 10^{+05} & 2.6397 \times 10^{+06} & 2.5375 \times 10^{+01} \\
1.8909 \times 10^{+05} & 2.6265 \times 10^{+06} & 4.4821 \times 10^{+01} \\
1.8348 \times 10^{+05} & 2.6205 \times 10^{+06} & 3.7007 \times 10^{+01} \\
1.9699 \times 10^{+05} & 2.6494 \times 10^{+06} & 4.2254 \times 10^{+01} \\
1.8207 \times 10^{+05} & 2.6138 \times 10^{+06} & 3.5997 \times 10^{+01}
\end{bmatrix}
比較
浮點數誤差
條件平差結果應該會與間接觀測平差相同, 但程式計算數值上,二者的結果不同。 單純是因為計算過程不同,造成浮點數誤差不同的結果。
條件平差殘差 | 間接觀測平差殘差 |
---|---|
2.1655 e-14 | 8.9130 e-11 |
-3.4647 e-13 | 8.5311 e-10 |
6.8728 e-16 | 1.0658 e-14 |
-4.3309 e-14 | -2.3647 e-11 |
6.9295 e-13 | -2.0827 e-10 |
4.0179 e-16 | -7.1054 e-15 |
1.0827 e-13 | -7.2760 e-12 |
1.9056 e-12 | -3.4561 e-10 |
-1.1631 e-16 | -7.1054 e-15 |
1.7324 e-13 | 5.0932 e-11 |
8.6619 e-13 | 3.5652 e-10 |
1.6918 e-16 | 1.9540 e-14 |
-2.1655 e-14 | 6.5484 e-11 |
3.4647 e-13 | 6.4392 e-10 |
-6.8728 e-16 | 1.7764 e-15 |
6.4964 e-14 | -3.0923 e-11 |
-1.0394 e-12 | -5.5661 e-10 |
2.8549 e-16 | -1.4211 e-14 |
-1.7324 e-13 | 4.3201 e-11 |
-8.6619 e-13 | 7.2760 e-12 |
-1.6918 e-16 | 1.2212 e-14 |
例如以 AB BC AC 三條基線舉例, 這三條基線應該是無閉合差的, 但在 matlab 中計算後, 三條基線卻在 z 方向出現了 1.7764e-15 的誤差。
>> ( [11488.973 -13224.866 19.446] +
[-5605.975 -6047.976 -7.814] -
[5882.998 -19272.842 11.632] )
ans =
0.0000e+00 0.0000e+00 1.7764e-15
如果在以無閉合差計算,條件平差的 W 應為 0 向量, 連帶連系數矩陣 K 與殘差 V 也都會是 0。 但因為浮點數誤差,如同上面的計算 W 不為 0, 解出來的殘差 V 也就不為 0。
條件式的列式
相比間接平差直接列出所有觀測方程即可, 條件平差需要列出所有獨立的條件式。 我一開始還列不出來,把 ABCDE 連成一圈, 之後就找不到剩下的二條了。 後來用最小閉合圈去想才找到三條獨立的條件式。
而且所謂計算量較小,也是相對間接平差而已。 在計算基線平差時,由於是三維向量的平差, 一條向量式就是三條純量式,要手算也是很辛苦。 只有傳統的三角網,只有角度未知數會少一點, 用條件式可能較好算而已。