\qquad 为了解算用户位置,需要使用统一的时间参考量,合理的选择是接收时间。粗略地说,就是应用多颗卫星同时到达用户接收机的信号,求出各颗卫星发射信号时的位置和距离(伪距),用测量学上的后方交会法,解算出用户位置。
\qquad 然而,如果以接收时间为参考,则对于不同卫星,由于相对用户的距离不同,它们的被同时接收的信号就不可能是同时发射的。发射时间为接收时间减去传输时间。这个时间称为校正了传输时间的发射时间。
\qquad 这个发射时间需要经过许多其它校正。为了进行这些校正,必须首先知道发射时间的值,由此加大了处理难度。为了简化处理,可以从卫星信号中包含的周内时间(TOW)信息获得(经过传输时间校正的)发射时间粗值。而(与接收时刻相对应的)各卫星发射时刻的精确位置,只有通过卫星位置和用户位置的迭代计算才能得到。
\qquad 因此,为了求解用户位置,接收机首先需要设定定位解算时刻和完成以下处理:
- 获取卫星观测数据,计算信号发射时刻和伪距;
- 校正信号发射时刻中的卫星时钟偏差,计算校正后的卫星位置;
- 计算和校正伪距误差。
\qquad 本文不打算分析伪距合成、卫星位置计算、等等的细节,感兴趣的读者可参考源代码或阅读其它相关资料。本文随后内容包括:
- 简介接收机本地时标的获取过程和逻辑;
- 讨论定位解算的方程(模型)和算法速度优化;
- 概述与本地时标和定位解算都密切相关的1PPS时标支持。
4.6.1 接收机时间
\qquad HD-GR接收机延续了其它GNSS接收机的传统,用相对某个固定时间点算起的周数(weeks)和一周中的秒数(seconds)记录本地时间,因此基本上是一种计算出的时间。在接收机开机之后和未锁定任何卫星信号之前,它完全通过计数(来自基带模块的)时钟信号TIC来产生,时间精度为一个TIC周期(缺省为0.1 s),时间稳定性最多达到与导出TIC信号的晶振同一级别(通常为几个ppm)。通过锁定卫星信号和解码卫星星历(历书)能够获得周内时间(TOW)和完整的时间/日期信息,以及将时间准确度提高到1 ms量级。通过使用定位解算得到接收机时钟偏差并对时间进行校正,可进一步将时间准确度提高到几十 ns量级。以下是HD-GR导航软件从最初的无时钟状态到获得准确时标所历经的关键步骤:
- 接收机时钟初始设置为无时钟状态(NO_CLOCK);
- 每当接收到一个TIC信号,立即更新时钟秒计数(seconds),缺省更新率为100 ms;
- 当解码了一个星历子帧且TLM/HOW字有效,检查时钟状态是否为NO_CLOCK。如果是:
- 用HOW字中包含的时间信息设置时钟秒数(seconds),准确度约1 ms;
- 将时钟状态设置为HOW_CLOCK。这时,周数(weeks)仍然未知。
- 当成功解码了星历子帧1,检查时钟状态是否为HOW_CLOCK。如果是:
- 用子帧1包含的周数信息设置时钟周数(weeks);
- 将时钟状态设置为SF1_CLOCK。这时,时钟开始成为指示周内时间的时标。
- 当成功完成了定位解算:
- 如果是第1次解算,将时钟状态设置为FIX_CLOCK;
- 用解算得到的时钟偏差校正时钟秒数(seconds);
- 经过多次时钟偏差校正,时钟准确度逐步逼近到几十 ns量级。
4.6.2 定位解算方程
\qquad GNSS定位计算最常使用的是基于最小二乘法的方法。当方程数多于未知量时,就会用到这种方法。本小节介绍用最小二乘法导出的,根据四颗或更多颗卫星的伪距观测量,求解接收机位置的方程(模型)。
1、单系统方程
\qquad 伪距的基本观测方程为:
P i = ρ i + c ( d t − d t i ) + T i + I i + e i ( 1 ) P^i = \rho^i + c(dt - dt^i ) + T^i + I^i + e^i \qquad (1) Pi=ρi+c(dt−dti)+Ti+Ii+ei(1)
其中: P i P^i Pi是从卫星 i i i到接收机的伪距观测量; ρ i \rho^i ρi是接收机和卫星 i i i之间的几何距离; c c c是光速; d t dt dt是接收机时钟偏差; d t i dt^i dti是卫星时钟偏差; T i T^i Ti是对流层延迟; I i I^i Ii是电离层延迟; e i e^i ei是伪距附加误差。卫星 i i i和接收机之间的几何距离 ρ i \rho^i ρi计算如下:
ρ i = ( x − x i ) 2 + ( y − y i ) 2 + ( z − z i ) 2 ( 2 ) \rho^i = \sqrt {(x - x^i)^2 + (y - y^i)^2 + (z - z^i)^2} \qquad (2) ρi=(x−xi)2+(y−yi)2+(z−zi)2(2)
其中: ( x , y , z ) (x,y,z) (x,y,z)是接收机位置, ( x i , y i , z i ) (x^i, y^i, z^i) (xi,yi,zi)是卫星 i i i的位置。
\qquad 利用星历表可以计算出卫星时钟偏差 d t i dt^i dti,包括 T i T^i Ti、 I i I^i Ii在内的误差源大小也可通过模型(公式)计算得出。将校正了卫星时钟偏差 d t i dt^i dti和伪距误差 T i T^i Ti、 I i I^i Ii、 e i e^i ei的 P i P^i Pi记为 R i R^i Ri,并将(2)式代入,则(1)式可表示为
R i = ( x − x i ) 2 + ( y − y i ) 2 + ( z − z i ) 2 + c ⋅ d t ( 3 ) R^i = \sqrt {(x - x^i)^2 + (y - y^i)^2 + (z - z^i)^2} + c \cdot dt \qquad (3) Ri=(x−xi)2+(y−yi)2+(z−zi)2+c⋅dt(3)
卫星精确位置 ( x i , y i , z i ) (x^i, y^i, z^i) (xi,yi,zi)可用星历表算出,因此方程中只有四个未知量, ( x , y , z ) (x,y,z) (x,y,z)和 d t dt dt。为了计算接收机精确位置,至少需要四个伪距观测量。
2、双系统方程
\qquad 对于GPS和BDS双系统混合定位,完整的观测方程为:
R k , i = ( x − x k , i ) 2 + ( y − y k , i ) 2 + ( z − z k , i ) 2 + c ⋅ d t k ( 4 ) R^{k,i} = \sqrt {(x - x^{k,i})^2 + (y - y^{k,i})^2 + (z - z^{k,i})^2} + c \cdot dt^k \qquad (4) Rk,i=(x−xk,i)2+(y−yk,i)2+(z−zk,i)2+c⋅dtk(4)
其中: k k k表示GNSS系统类型, k k k为1表示卫星 i i i为GPS类型,为2表示卫星 i i i为BDS类型; d t 1 dt^1 dt1和 d t 2 dt^2 dt2分别为接收机时钟相对GPS系统时间和BDS系统时间的偏差。因此,最终待解方程组中有五个未知量, ( x , y , z ) (x,y,z) (x,y,z)和 d t 1 dt^1 dt1, d t 2 dt^2 dt2。为了计算接收机精确位置,至少需要五个伪距观测量。
3、线性化方程
\qquad 方程(3)和(4)都是关于接收机位置的非线性方程。下面分别给出线性化后的单系统方程(5)和双系统方程(6)。
Δ R i = ( x 0 − x i R 0 i − c ⋅ d t 0 ) Δ x + ( y 0 − y i R 0 i − c ⋅ d t 0 ) Δ y + ( z 0 − z i R 0 i − c ⋅ d t 0 ) Δ z + c ⋅ Δ t ( 5 ) \Delta R^i = \bigg (\frac{x_0-x^i}{R_0^i-c \cdot dt_0}\bigg) \Delta x + \bigg (\frac{y_0-y^i}{R_0^i-c \cdot dt_0}\bigg) \Delta y + \bigg (\frac{z_0-z^i}{R_0^i-c \cdot dt_0}\bigg) \Delta z + c \cdot \Delta t \qquad(5) ΔRi=(R0i−c⋅dt0x0−xi)Δx+(R0i−c⋅dt0y0−yi)Δy+(R0i−c⋅dt0z0−zi)Δz+c⋅Δt(5)
其中 ( x 0 , y 0 , z 0 ) (x_0,y_0, z_0) (x0,y0,z0)和 d t 0 dt_0 dt0为 ( x , y , z ) (x,y,z) (x,y,z)和 d t dt dt的估计值; R 0 i R^i_0 R0i为 R i R^i Ri的估计值, Δ R i = R i − R 0 i \Delta R^i = R^i - R^i_0 ΔRi=Ri−R0i; Δ x , Δ y , Δ z \Delta x, \Delta y, \Delta z Δx,Δy,Δz和 Δ t \Delta t Δt为这些估计值的修正值。
Δ R k , i = ( x 0 − x k , i R 0 k , i − c ⋅ d t 0 k ) Δ x + ( y 0 − y k , i R 0 k , i − c ⋅ d t 0 k ) Δ y + ( z 0 − z k , i R 0 k , i − c ⋅ d t 0 k ) Δ z + c ⋅ Δ t k ( 6 ) \Delta R^{k,i} = \bigg (\frac{x_0-x^{k,i}}{R_0^{k,i}-c \cdot dt_0^k}\bigg) \Delta x + \bigg (\frac{y_0-y^{k,i}}{R_0^{k,i}-c \cdot dt_0^k}\bigg) \Delta y + \bigg (\frac{z_0-z^{k,i}}{R_0^{k,i}-c \cdot dt_0^k}\bigg) \Delta z + c \cdot \Delta t^k \qquad(6) ΔRk,i=(R0k,i−c⋅dt0kx0−xk,i)Δx+(R0k,i−c⋅dt0ky0−yk,i)Δy+(R0k,i−c⋅dt0kz0−zk,i)Δz+c⋅Δtk(6)
其中 ( x 0 , y 0 , z 0 ) (x_0,y_0, z_0) (x0,y0,z0)和 d t 0 k dt^k_0 dt0k为 ( x , y , z ) (x,y,z) (x,y,z)和 d t k dt^k dtk的估计值; R 0 k , i R^{k,i}_0 R0k,i为 R k , i R^{k,i} Rk,i的估计值, Δ R k , i = R k , i − R 0 k , i \Delta R^{k,i} = R^{k,i} - R^{k,i}_0 ΔRk,i=Rk,i−R0k,i; Δ x , Δ y , Δ z \Delta x, \Delta y, \Delta z Δx,Δy,Δz和 Δ t k \Delta t^k Δtk为这些估计值的修正值。
4、矩阵化方程
\qquad 定位解算方程可用矩阵方法表示为:
A X = R o r X = A − 1 R AX = R \qquad or \qquad X = A^{-1}R AX=RorX=A−1R
其中 A A A为解矩阵, X X X为接收机位置和时钟校正矢量, R R R为伪距观测量差值矢量。
\qquad 更一般地,对于超定情况(超过4颗卫星),使用最小二乘法:
A X − R = ν AX - R = ν AX−R=ν
其中 ν ν ν为残差矢量。由于解矩阵不是方阵,必须使用广义逆方法:
X = ( A T W A ) − 1 A T W R ( 7 ) X = (A^TWA)^{-1}A^TWR \qquad (7) X=(ATWA)−1ATWR(7)
其中 W W W为权重矩阵。
\qquad 可以证明,最佳 W W W值是伪距的协方差逆矩阵。这可以用C/A码信号的平均功率或卫星电文中传输的卫星URAs (User Range Accuracy)来估计。
\qquad 假定可用于定位解算的卫星有m颗,下面给出对应于方程(7)的单系统方程各矩阵的具体表示:
A = ( x 0 − x 1 R 0 1 − c ⋅ d t 0 y 0 − y 1 R 0 1 − c ⋅ d t 0 z 0 − z 1 R 0 1 − c ⋅ d t 0 1 x 0 − x 2 R 0 2 − c ⋅ d t 0 y 0 − y 2 R 0 2 − c ⋅ d t 0 z 0 − z 2 R 0 2 − c ⋅ d t 0 1 x 0 − x 3 R 0 3 − c ⋅ d t 0 y 0 − y 3 R 0 3 − c ⋅ d t z 0 − z 3 R 0 3 − c ⋅ d t 0 1 ⋮ ⋮ ⋮ ⋮ x 0 − x m R 0 m − c ⋅ d t 0 y 0 − y m R 0 m − c ⋅ d t 0 z 0 − z m R 0 m − c ⋅ d t 0 1 ) ( 8 ) A= \begin{pmatrix} \frac{x_0-x^1}{R_0^1-c \cdot dt_0} & \frac{y_0-y^1}{R_0^1-c \cdot dt_0} & \frac{z_0-z^1}{R_0^1-c \cdot dt_0} & 1 \\ \frac{x_0-x^2}{R_0^2-c \cdot dt_0} & \frac{y_0-y^2}{R_0^2-c \cdot dt_0} & \frac{z_0-z^2}{R_0^2-c \cdot dt_0} & 1 \\ \frac{x_0-x^3}{R_0^3-c \cdot dt_0} & \frac{y_0-y^3}{R_0^3-c \cdot dt} & \frac{z_0-z^3}{R_0^3-c \cdot dt_0} & 1 \\ \vdots & \vdots & \vdots & \vdots \\ \frac{x_0-x^m}{R_0^m-c \cdot dt_0} & \frac{y_0-y^m}{R_0^m-c \cdot dt_0} & \frac{z_0-z^m}{R_0^m-c \cdot dt_0} & 1 \end{pmatrix} \qquad(8) A=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛R01−c⋅dt0x0−x1R02−c⋅dt0x0−x2R03−c⋅dt0x0−x3⋮R0m−c⋅dt0x0−xmR01−c⋅dt0y0−y1R02−c⋅dt0y0−y2R03−c⋅dty0−y3⋮R0m−c⋅dt0y0−ymR01−c⋅dt0z0−z1R02−c⋅dt0z0−z2R03−c⋅dt0z0−z3⋮R0m−c⋅dt0z0−zm111⋮1⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞(8)
X = ( Δ x Δ y Δ z c ⋅ d t ) T ( 9 ) X= \begin{pmatrix} \Delta x & \Delta y & \Delta z & c \cdot dt \end{pmatrix} ^T \qquad(9) X=(ΔxΔyΔzc⋅dt)T(9)
R = ( Δ R 1 Δ R 2 Δ R 3 ⋯ R m ) T ( 10 ) R= \begin{pmatrix} \Delta R^1 & \Delta R^2 & \Delta R^3 & \cdots & R^m \end{pmatrix} ^T \qquad(10) R=(ΔR1ΔR2ΔR3⋯Rm)T(10)
W = ( w 1 0 0 0 0 0 w 2 0 0 0 0 0 w 3 0 0 0 0 0 ⋱ 0 0 0 0 0 w m ) ( 11 ) W= \begin{pmatrix} w^1 & 0 & 0 & 0 & 0 \\ 0 & w^2 & 0 & 0 & 0 \\ 0 & 0 & w^3 & 0 & 0 \\ 0 & 0 & 0 & \ddots & 0 \\ 0 & 0 & 0 & 0 & w^m \end{pmatrix} \qquad(11) W=⎝⎜⎜⎜⎜⎛w100000w200000w300000⋱00000wm⎠⎟⎟⎟⎟⎞(11)
其中 w i ( i = 0 , … , m ) w^i (i =0,…, m) wi(i=0,…,m)为施加在卫星 i i i的伪距方程上的加权系数。
5、算法速度优化
\qquad 制约定位解算速度的关键算法之一是逆阵计算。对于方程(7)而言,就是计算系数矩阵 A A A的广义逆矩阵,即根据矩阵 A A A和 W W W,计算 A T W A A^TWA ATWA的逆阵 ( A T W A ) − 1 (A^TWA)^{-1} (ATWA)−1。 A T W A A^TWA ATWA为一实对称方阵,对于单系统和双系统定位,其阶数分别为4和5。在HD-GR导航软件(AGRS_GP_1)的定位解算中,逆阵计算充分利用了矩阵对称性,并使用局部变量最大程度地约化了重复计算,因而能够有效地提高算法速度。下面以5-阶逆阵计算为例,给出约化重复计算前后的代数余子式,最后给出算法速度优化的估计。
(1) 5-阶矩阵的代数余子式
\qquad 将5-阶实对称矩阵 A A A表示为:
A = ( a 11 a 12 a 13 a 14 a 15 a 12 a 22 a 23 a 24 a 25 a 13 a 23 a 33 a 34 a 35 a 14 a 24 a 34 a 44 a 45 a 15 a 25 a 35 a 45 a 55 ) A= \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} & a_{15} \\ a_{12} & a_{22} & a_{23} & a_{24} & a_{25} \\ a_{13} & a_{23} & a_{33} & a_{34} & a_{35} \\ a_{14} & a_{24} & a_{34} & a_{44} & a_{45} \\ a_{15} & a_{25} & a_{35} & a_{45} & a_{55} \end{pmatrix} A=⎝⎜⎜⎜⎜⎛a11a12a13a14a15a12a22a23a24a25a13a23a33a34a35a14a24a34a44a45a15a25a35a45a55⎠⎟⎟⎟⎟⎞
为便于随后进一步书写公式,将 A A A的元素 a i j a_{ij} aij记为 a [ i ] [ j ] a[i][j] a[i][j], A A A的代数余子式记为 A [ i ] [ j ] A[i][j] A[i][j],其中 i , j = 1 , … , 5 i, j = 1, …, 5 i,j=1,…,5。于是,可将 A [ i ] [ j ] A[i][j] A[i][j]具体写出如下。
A[1][1] = +a[2][2]*(a[3][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) +
a[3][5]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) )
-a[2][3]*(a[2][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) )
+a[2][4]*(a[2][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
-a[2][5]*(a[2][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) +
a[3][4]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) );
A[1][2] = -a[1][2]*(a[3][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) +
a[3][5]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) )
+a[2][3]*(a[1][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) )
-a[2][4]*(a[1][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
+a[2][5]*(a[1][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) );
A[1][3] = +a[1][2]*(a[2][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) )
-a[2][2]*(a[1][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) )
+a[2][4]*(a[1][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
-a[2][5]*(a[1][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[1][4] = -a[1][2]*(a[2][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
+a[2][2]*(a[1][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
-a[2][3]*(a[1][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
+a[2][5]*(a[1][3]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][3]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[3][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[1][5] = +a[1][2]*(a[2][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) +
a[3][4]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
-a[2][2]*(a[1][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
+a[2][3]*(a[1][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
-a[2][4]*(a[1][3]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][3]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[3][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[2][2] = +a[1][1]*(a[3][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) +
a[3][5]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) )
-a[1][3]*(a[1][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) )
+a[1][4]*(a[1][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
-a[1][5]*(a[1][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) );
A[2][3] = -a[1][1]*(a[2][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) )
+a[1][2]*(a[1][3]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[3][4]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) )
-a[1][4]*(a[1][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
+a[1][5]*(a[1][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[2][4] = +a[1][1]*(a[2][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[3][5]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
-a[1][2]*(a[1][3]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[3][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
+a[1][3]*(a[1][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[3][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
-a[1][5]*(a[1][3]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][3]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[3][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[2][5] = -a[1][1]*(a[2][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) +
a[3][4]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
+a[1][2]*(a[1][3]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[3][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
-a[1][3]*(a[1][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[3][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
+a[1][4]*(a[1][3]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][3]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[3][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[3][3] = +a[1][1]*(a[2][2]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[2][4]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[2][5]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) )
-a[1][2]*(a[1][2]*( a[4][4]*a[5][5] - a[4][5]*a[4][5] ) -
a[2][4]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[2][5]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) )
+a[1][4]*(a[1][2]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][2]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[2][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
-a[1][5]*(a[1][2]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][2]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[2][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[3][4] = -a[1][1]*(a[2][2]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[2][3]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) +
a[2][5]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
+a[1][2]*(a[1][2]*( a[3][4]*a[5][5] - a[3][5]*a[4][5] ) -
a[2][3]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[2][5]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
-a[1][3]*(a[1][2]*( a[2][4]*a[5][5] - a[2][5]*a[4][5] ) -
a[2][2]*( a[1][4]*a[5][5] - a[1][5]*a[4][5] ) +
a[2][5]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
+a[1][5]*(a[1][2]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][2]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[2][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[3][5] = +a[1][1]*(a[2][2]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[2][3]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) +
a[2][4]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) )
-a[1][2]*(a[1][2]*( a[3][4]*a[4][5] - a[3][5]*a[4][4] ) -
a[2][3]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[2][4]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) )
+a[1][3]*(a[1][2]*( a[2][4]*a[4][5] - a[2][5]*a[4][4] ) -
a[2][2]*( a[1][4]*a[4][5] - a[1][5]*a[4][4] ) +
a[2][4]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) )
-a[1][4]*(a[1][2]*( a[2][4]*a[3][5] - a[2][5]*a[3][4] ) -
a[2][2]*( a[1][4]*a[3][5] - a[1][5]*a[3][4] ) +
a[2][3]*( a[1][4]*a[2][5] - a[1][5]*a[2][4] ) );
A[4][4] = +a[1][1]*(a[2][2]*( a[3][3]*a[5][5] - a[3][5]*a[3][5] ) -
a[2][3]*( a[2][3]*a[5][5] - a[2][5]*a[3][5] ) +
a[2][5]*( a[2][3]*a[3][5] - a[2][5]*a[3][3] ) )
-a[1][2]*(a[1][2]*( a[3][3]*a[5][5] - a[3][5]*a[3][5] ) -
a[2][3]*( a[1][3]*a[5][5] - a[1][5]*a[3][5] ) +
a[2][5]*( a[1][3]*a[3][5] - a[1][5]*a[3][3] ) )
+a[1][3]*(a[1][2]*( a[2][3]*a[5][5] - a[2][5]*a[3][5] ) -
a[2][2]*( a[1][3]*a[5][5] - a[1][5]*a[3][5] ) +
a[2][5]*( a[1][3]*a[2][5] - a[1][5]*a[2][3] ) )
-a[1][5]*(a[1][2]*( a[2][3]*a[3][5] - a[2][5]*a[3][3] ) -
a[2][2]*( a[1][3]*a[3][5] - a[1][5]*a[3][3] ) +
a[2][3]*( a[1][3]*a[2][5] - a[1][5]*a[2][3] ) );
A[4][5] = -a[1][1]*(a[2][2]*( a[3][3]*a[4][5] - a[3][4]*a[3][5] ) -
a[2][3]*( a[2][3]*a[4][5] - a[2][5]*a[3][4] ) +
a[2][4]*( a[2][3]*a[3][5] - a[2][5]*a[3][3] ) )
+a[1][2]*(a[1][2]*( a[3][3]*a[4][5] - a[3][4]*a[3][5] ) -
a[2][3]*( a[1][3]*a[4][5] - a[1][5]*a[3][4] ) +
a[2][4]*( a[1][3]*a[3][5] - a[1][5]*a[3][3] ) )
-a[1][3]*(a[1][2]*( a[2][3]*a[4][5] - a[2][5]*a[3][4] ) -
a[2][2]*( a[1][3]*a[4][5] - a[1][5]*a[3][4] ) +
a[2][4]*( a[1][3]*a[2][5] - a[1][5]*a[2][3] ) )
+a[1][4]*(a[1][2]*( a[2][3]*a[3][5] - a[2][5]*a[3][3] ) -
a[2][2]*( a[1][3]*a[3][5] - a[1][5]*a[3][3] ) +
a[2][3]*( a[1][3]*a[2][5] - a[1][5]*a[2][3] ) );
A[5][5] = +a[1][1]*(a[2][2]*( a[3][3]*a[4][4] - a[3][4]*a[3][4] ) -
a[2][3]*( a[2][3]*a[4][4] - a[2][4]*a[3][4] ) +
a[2][4]*( a[2][3]*a[3][4] - a[2][4]*a[3][3] ) )
-a[1][2]*(a[1][2]*( a[3][3]*a[4][4] - a[3][4]*a[3][4] ) -
a[2][3]*( a[1][3]*a[4][4] - a[1][4]*a[3][4] ) +
a[2][4]*( a[1][3]*a[3][4] - a[1][4]*a[3][3] ) )
+a[1][3]*(a[1][2]*( a[2][3]*a[4][4] - a[2][4]*a[3][4] ) -
a[2][2]*( a[1][3]*a[4][4] - a[1][4]*a[3][4] ) +
a[2][4]*( a[1][3]*a[2][4] - a[1][4]*a[2][3] ) )
-a[1][4]*(a[1][2]*( a[2][3]*a[3][4] - a[2][4]*a[3][3] ) -
a[2][2]*( a[1][3]*a[3][4] - a[1][4]*a[3][3] ) +
a[2][3]*( a[1][3]*a[2][4] - a[1][4]*a[2][3] ) );
(2) 定义重复的乘法因子
\qquad 定义以下变量代替上述代数余子式中重复出现的乘法因子:
a15a34 = a[1][5]*a[3][4]; // 1
a25a34 = a[2][5]*a[3][4]; // 2
a44a55_a45a45 = a[4][4]*a[5][5] - a[4][5]*a[4][5]; // 3
a34a55_a35a45 = a[3][4]*a[5][5] - a[3][5]*a[4][5]; // 4
a34a45_a35a44 = a[3][4]*a[4][5] - a[3][5]*a[4][4]; // 5
a24a55_a25a45 = a[2][4]*a[5][5] - a[2][5]*a[4][5]; // 6
a24a45_a25a44 = a[2][4]*a[4][5] - a[2][5]*a[4][4]; // 7
a24a35_a25a34 = a[2][4]*a[3][5] - a25a34; // 8
a33_a44a55_a45a45 = a[3][3]*a44a55_a45a45; // 9
a34_a34a55_a35a45 = a[3][4]*a34a55_a35a45; // 10
a35_a34a45_a35a44 = a[3][5]*a34a45_a35a44; // 11
a23_a44a55_a45a45 = a[2][3]*a44a55_a45a45; // 12
a34_a24a55_a25a45 = a[3][4]*a24a55_a25a45; // 13
a35_a24a45_a25a44 = a[3][5]*a24a45_a25a44; // 14
a23_a34a55_a35a45 = a[2][3]*a34a55_a35a45; // 15
a33_a24a55_a25a45 = a[3][3]*a24a55_a25a45; // 16
a35_a24a35_a25a34 = a[3][5]*a24a35_a25a34; // 17
a23_a34a45_a35a44 = a[2][3]*a34a45_a35a44; // 18
a33_a24a45_a25a44 = a[3][3]*a24a45_a25a44; // 19
a34_a24a35_a25a34 = a[3][4]*a24a35_a25a34; // 20
a14a55_a15a45 = a[1][4]*a[5][5] - a[1][5]*a[4][5]; // 21
a14a45_a15a44 = a[1][4]*a[4][5] - a[1][5]*a[4][4]; // 22
a14a35_a15a34 = a[1][4]*a[3][5] - a15a34; // 23
a13_a44a55_a45a45 = a[1][3]*a44a55_a45a45; // 24
a34_a14a55_a15a45 = a[3][4]*a14a55_a15a45; // 25
a35_a14a45_a15a44 = a[3][5]*a14a45_a15a44; // 26
a13_a34a55_a35a45 = a[1][3]*a34a55_a35a45; // 27
a33_a14a55_a15a45 = a[3][3]*a14a55_a15a45; // 28
a35_a14a35_a15a34 = a[3][5]*a14a35_a15a34; // 29
a13_a34a45_a35a44 = a[1][3]*a34a45_a35a44; // 30
a33_a14a45_a15a44 = a[3][3]*a14a45_a15a44; // 31
a34_a14a35_a15a34 = a[3][4]*a14a35_a15a34; // 32
a14a25_a15a24 = a[1][4]*a[2][5] - a[1][5]*a[2][4]; // 33
a13_a24a55_a25a45 = a[1][3]*a24a55_a25a45; // 34
a23_a14a55_a15a45 = a[2][3]*a14a55_a15a45; // 35
a35_a14a25_a15a24 = a[3][5]*a14a25_a15a24; // 36
a13_a24a45_a25a44 = a[1][3]*a24a45_a25a44; // 37
a23_a14a45_a15a44 = a[2][3]*a14a45_a15a44; // 38
a34_a14a25_a15a24 = a[3][4]*a14a25_a15a24; // 39
a13_a24a35_a25a34 = a[1][3]*a24a35_a25a34; // 40
a23_a14a35_a15a34 = a[2][3]*a14a35_a15a34; // 41
a33_a14a25_a15a24 = a[3][3]*a14a25_a15a24; // 42
a22_a44a55_a45a45 = a[2][2]*a44a55_a45a45; // 43
a24_a24a55_a25a45 = a[2][4]*a24a55_a25a45; // 44
a25_a24a45_a25a44 = a[2][5]*a24a45_a25a44; // 45
a12_a44a55_a45a45 = a[1][2]*a44a55_a45a45; // 46
a24_a14a55_a15a45 = a[2][4]*a14a55_a15a45; // 47
a25_a14a45_a15a44 = a[2][5]*a14a45_a15a44; // 48
a12_a24a55_a25a45 = a[1][2]*a24a55_a25a45; // 49
a22_a14a55_a15a45 = a[2][2]*a14a55_a15a45; // 50
a25_a14a25_a15a24 = a[2][5]*a14a25_a15a24; // 51
a12_a24a45_a25a44 = a[1][2]*a24a45_a25a44; // 52
a22_a14a45_a15a44 = a[2][2]*a14a45_a15a44; // 53
a24_a14a25_a15a24 = a[2][4]*a14a25_a15a24; // 54
a22_a34a55_a35a45 = a[2][2]*a34a55_a35a45; // 55
a23_a24a55_a25a45 = a[2][3]*a24a55_a25a45; // 56
a25_a24a35_a25a34 = a[2][5]*a24a35_a25a34; // 57
a12_a34a55_a35a45 = a[1][2]*a34a55_a35a45; // 58
a25_a14a35_a15a34 = a[2][5]*a14a35_a15a34; // 59
a12_a24a35_a25a34 = a[1][2]*a24a35_a25a34; // 60
a22_a14a35_a15a34 = a[2][2]*a14a35_a15a34; // 61
a23_a14a25_a15a24 = a[2][3]*a14a25_a15a24; // 62
a22_a34a45_a35a44 = a[2][2]*a34a45_a35a44; // 63
a23_a24a45_a25a44 = a[2][3]*a24a45_a25a44; // 64
a24_a24a35_a25a34 = a[2][4]*a24a35_a25a34; // 65
a12_a34a45_a35a44 = a[1][2]*a34a45_a35a44; // 66
a24_a14a35_a15a34 = a[2][4]*a14a35_a15a34; // 67
a33a55_a35a35 = a[3][3]*a[5][5] - a[3][5]*a[3][5]; // 68
a23a55_a25a35 = a[2][3]*a[5][5] - a[2][5]*a[3][5]; // 69
a23a35_a25a33 = a[2][3]*a[3][5] - a[2][5]*a[3][3]; // 70
a13a55_a15a35 = a[1][3]*a[5][5] - a[1][5]*a[3][5]; // 71
a13a35_a15a33 = a[1][3]*a[3][5] - a[1][5]*a[3][3]; // 72
a13a25_a15a23 = a[1][3]*a[2][5] - a[1][5]*a[2][3]; // 73
a22_a33a55_a35a35 = a[2][2]*a33a55_a35a35; // 74
a23_a23a55_a25a35 = a[2][3]*a23a55_a25a35; // 75
a25_a23a35_a25a33 = a[2][5]*a23a35_a25a33; // 76
a12_a33a55_a35a35 = a[1][2]*a33a55_a35a35; // 77
a23_a13a55_a15a35 = a[2][3]*a13a55_a15a35; // 78
a25_a13a35_a15a33 = a[2][5]*a13a35_a15a33; // 79
a12_a23a55_a25a35 = a[1][2]*a23a55_a25a35; // 80
a22_a13a55_a15a35 = a[2][2]*a13a55_a15a35; // 81
a25_a13a25_a15a23 = a[2][5]*a13a25_a15a23; // 82
a12_a23a35_a25a33 = a[1][2]*a23a35_a25a33; // 83
a22_a13a35_a15a33 = a[2][2]*a13a35_a15a33; // 84
a23_a13a25_a15a23 = a[2][3]*a13a25_a15a23; // 85
a33a45_a34a35 = a[3][3]*a[4][5] - a[3][4]*a[3][5]; // 86
a23a45_a25a34 = a[2][3]*a[4][5] - a25a34; // 87
a13a45_a15a34 = a[1][3]*a[4][5] - a15a34; // 88
a22_a33a45_a34a35 = a[2][2]*a33a45_a34a35; // 89
a23_a23a45_a25a34 = a[2][3]*a23a45_a25a34; // 90
a24_a23a35_a25a33 = a[2][4]*a23a35_a25a33; // 91
a12_a33a45_a34a35 = a[1][2]*a33a45_a34a35; // 92
a23_a13a45_a15a34 = a[2][3]*a13a45_a15a34; // 93
a24_a13a35_a15a33 = a[2][4]*a13a35_a15a33; // 94
a12_a23a45_a25a34 = a[1][2]*a23a45_a25a34; // 95
a22_a13a45_a15a34 = a[2][2]*a13a45_a15a34; // 96
a24_a13a25_a15a23 = a[2][4]*a13a25_a15a23; // 97
a33a44_a34a34 = a[3][3]*a[4][4] - a[3][4]*a[3][4]; // 98
a23a44_a24a34 = a[2][3]*a[4][4] - a[2][4]*a[3][4]; // 99
a23a34_a24a33 = a[2][3]*a[3][4] - a[2][4]*a[3][3]; // 100
a13a44_a14a34 = a[1][3]*a[4][4] - a[1][4]*a[3][4]; // 101
a13a34_a14a33 = a[1][3]*a[3][4] - a[1][4]*a[3][3]; // 102
a13a24_a14a23 = a[1][3]*a[2][4] - a[1][4]*a[2][3]; // 103
a22_a33a44_a34a34 = a[2][2]*a33a44_a34a34; // 104
a23_a23a44_a24a34 = a[2][3]*a23a44_a24a34; // 105
a24_a23a34_a24a33 = a[2][4]*a23a34_a24a33; // 106
a12_a33a44_a34a34 = a[1][2]*a33a44_a34a34; // 107
a23_a13a44_a14a34 = a[2][3]*a13a44_a14a34; // 108
a24_a13a34_a14a33 = a[2][4]*a13a34_a14a33; // 109
a12_a23a44_a24a34 = a[1][2]*a23a44_a24a34; // 110
a22_a13a44_a14a34 = a[2][2]*a13a44_a14a34; // 111
a24_a13a24_a14a23 = a[2][4]*a13a24_a14a23; // 112
a12_a23a34_a24a33 = a[1][2]*a23a34_a24a33; // 113
a22_a13a34_a14a33 = a[2][2]*a13a34_a14a33; // 114
a23_a13a24_a14a23 = a[2][3]*a13a24_a14a23; // 115
(3) 约化后的代数余子式
\qquad 将(2)中定义的变量代入(1)中的各式,得到以下约化后的代数余子式:
A[1][1] = +a[2][2]*( a33_a44a55_a45a45 - a34_a34a55_a35a45 + a35_a34a45_a35a44 )
-a[2][3]*( a23_a44a55_a45a45 - a34_a24a55_a25a45 + a35_a24a45_a25a44 )
+a[2][4]*( a23_a34a55_a35a45 - a33_a24a55_a25a45 + a35_a24a35_a25a34 )
-a[2][5]*(a23_a34a45_a35a44 - a33_a24a45_a25a44 + a34_a24a35_a25a34 );
A[1][2] = -a[1][2]*( a33_a44a55_a45a45 - a34_a34a55_a35a45 + a35_a34a45_a35a44 )
+a[2][3]*( a13_a44a55_a45a45 - a34_a14a55_a15a45 + a35_a14a45_a15a44 )
-a[2][4]*( a13_a34a55_a35a45 - a33_a14a55_a15a45 + a35_a14a35_a15a34 )
+a[2][5]*(a13_a34a45_a35a44 - a33_a14a45_a15a44 + a34_a14a35_a15a34 );
A[1][3] = +a[1][2]*( a23_a44a55_a45a45 - a34_a24a55_a25a45 + a35_a24a45_a25a44 )
-a[2][2]*( a13_a44a55_a45a45 - a34_a14a55_a15a45 + a35_a14a45_a15a44 )
+a[2][4]*( a13_a24a55_a25a45 - a23_a14a55_a15a45 + a35_a14a25_a15a24 )
-a[2][5]*(a13_a24a45_a25a44 - a23_a14a45_a15a44 + a34_a14a25_a15a24 );
A[1][4] = -a[1][2]*( a23_a34a55_a35a45 - a33_a24a55_a25a45 + a35_a24a35_a25a34 )
+a[2][2]*( a13_a34a55_a35a45 - a33_a14a55_a15a45 + a35_a14a35_a15a34 )
-a[2][3]*( a13_a24a55_a25a45 - a23_a14a55_a15a45 + a35_a14a25_a15a24 )
+a[2][5]*(a13_a24a35_a25a34 - a23_a14a35_a15a34 + a33_a14a25_a15a24 );
A[1][5] = +a[1][2]*( a23_a34a45_a35a44 - a33_a24a45_a25a44 + a34_a24a35_a25a34 )
-a[2][2]*( a13_a34a45_a35a44 - a33_a14a45_a15a44 + a34_a14a35_a15a34 )
+a[2][3]*( a13_a24a45_a25a44 - a23_a14a45_a15a44 + a34_a14a25_a15a24 )
-a[2][4]*(a13_a24a35_a25a34 - a23_a14a35_a15a34 + a33_a14a25_a15a24 );
A[2][2] = +a[1][1]*( a33_a44a55_a45a45 - a34_a34a55_a35a45 + a35_a34a45_a35a44 )
-a[1][3]*( a13_a44a55_a45a45 - a34_a14a55_a15a45 + a35_a14a45_a15a44 )
+a[1][4]*( a13_a34a55_a35a45 - a33_a14a55_a15a45 + a35_a14a35_a15a34 )
-a[1][5]*(a13_a34a45_a35a44 - a33_a14a45_a15a44 + a34_a14a35_a15a34 );
A[2][3] = -a[1][1]*( a23_a44a55_a45a45 - a34_a24a55_a25a45 + a35_a24a45_a25a44 )
+a[1][2]*( a13_a44a55_a45a45 - a34_a14a55_a15a45 + a35_a14a45_a15a44 )
-a[1][4]*( a13_a24a55_a25a45 - a23_a14a55_a15a45 + a35_a14a25_a15a24 )
+a[1][5]*(a13_a24a45_a25a44 - a23_a14a45_a15a44 + a34_a14a25_a15a24 );
A[2][4] = +a[1][1]*( a23_a34a55_a35a45 - a33_a24a55_a25a45 + a35_a24a35_a25a34 )
-a[1][2]*( a13_a34a55_a35a45 - a33_a14a55_a15a45 + a35_a14a35_a15a34 )
+a[1][3]*( a13_a24a55_a25a45 - a23_a14a55_a15a45 + a35_a14a25_a15a24 )
-a[1][5]*(a13_a24a35_a25a34 - a23_a14a35_a15a34 + a33_a14a25_a15a24 );
A[2][5] = -a[1][1]*( a23_a34a45_a35a44 - a33_a24a45_a25a44 + a34_a24a35_a25a34 )
+a[1][2]*( a13_a34a45_a35a44 - a33_a14a45_a15a44 + a34_a14a35_a15a34 )
-a[1][3]*( a13_a24a45_a25a44 - a23_a14a45_a15a44 + a34_a14a25_a15a24 )
+a[1][4]*(a13_a24a35_a25a34 - a23_a14a35_a15a34 + a33_a14a25_a15a24 );
A[3][3] = +a[1][1]*( a22_a44a55_a45a45 - a24_a24a55_a25a45 + a25_a24a45_a25a44 )
-a[1][2]*( a12_a44a55_a45a45 - a24_a14a55_a15a45 + a25_a14a45_a15a44 )
+a[1][4]*( a12_a24a55_a25a45 - a22_a14a55_a15a45 + a25_a14a25_a15a24 )
-a[1][5]*(a12_a24a45_a25a44 - a22_a14a45_a15a44 + a24_a14a25_a15a24 );
A[3][4] = -a[1][1]*( a22_a34a55_a35a45 - a23_a24a55_a25a45 + a25_a24a35_a25a34 )
+a[1][2]*( a12_a34a55_a35a45 - a23_a14a55_a15a45 + a25_a14a35_a15a34 )
-a[1][3]*( a12_a24a55_a25a45 - a22_a14a55_a15a45 + a25_a14a25_a15a24 )
+a[1][5]*(a12_a24a35_a25a34 - a22_a14a35_a15a34 + a23_a14a25_a15a24 );
A[3][5] = +a[1][1]*( a22_a34a45_a35a44 - a23_a24a45_a25a44 + a24_a24a35_a25a34 )
-a[1][2]*( a12_a34a45_a35a44 - a23_a14a45_a15a44 + a24_a14a35_a15a34 )
+a[1][3]*( a12_a24a45_a25a44 - a22_a14a45_a15a44 + a24_a14a25_a15a24 )
-a[1][4]*(a12_a24a35_a25a34 - a22_a14a35_a15a34 + a23_a14a25_a15a24 );
A[4][4] = +a[1][1]*( a22_a33a55_a35a35 - a23_a23a55_a25a35 + a25_a23a35_a25a33 )
-a[1][2]*( a12_a33a55_a35a35 - a23_a13a55_a15a35 + a25_a13a35_a15a33 )
+a[1][3]*( a12_a23a55_a25a35 - a22_a13a55_a15a35 + a25_a13a25_a15a23 )
-a[1][5]*(a12_a23a35_a25a33 - a22_a13a35_a15a33 + a23_a13a25_a15a23 );
A[4][5] = -a[1][1]*( a22_a33a45_a34a35 - a23_a23a45_a25a34 + a24_a23a35_a25a33 )
+a[1][2]*( a12_a33a45_a34a35 - a23_a13a45_a15a34 + a24_a13a35_a15a33 )
-a[1][3]*( a12_a23a45_a25a34 - a22_a13a45_a15a34 + a24_a13a25_a15a23 )
+a[1][4]*(a12_a23a35_a25a33 - a22_a13a35_a15a33 + a23_a13a25_a15a23 );
A[5][5] = +a[1][1]*( a22_a33a44_a34a34 - a23_a23a44_a24a34 + a24_a23a34_a24a33 )
-a[1][2]*( a12_a33a44_a34a34 - a23_a13a44_a14a34 + a24_a13a34_a14a33 )
+a[1][3]*( a12_a23a44_a24a34 - a22_a13a44_a14a34 + a24_a13a24_a14a23 )
-a[1][4]*(a12_a23a34_a24a33 - a22_a13a34_a14a33 + a23_a13a24_a14a23 );
(4) 速度优化估计
\qquad 以下是对约化后代数余子式的计算速度优化程度的估计:
- 由于只计算逆阵的上三角元素,速度提高5/3倍。
- 计算逆阵的每个上三角元素正常需要约40次浮点乘法运算,计算15个上三角元素共计需要超过600次浮点乘法运算。使用局部变量对重复计算进行约化,能够将总的浮点乘法运算减少为201次,速度提高3倍。
- 总的逆阵计算速度提高5倍。
4.6.3 1PPS时标支持
\qquad 我们常常希望,定位解算所得到的时间能与UTC秒脉冲或其分频对齐,因此需要基带模块所产生的每个TIC信号能与UTC秒脉冲或其分频对齐,这是基带模块在导航软件控制下逐步完成的。由3.2.2小节中关于“1PPS时标产生”的讨论可知,基带模块提供了两个调用接口,加载TIC计数值(pps_tic_load)和设置TIC延迟值(tic_delay_value)。HD-GR导航软件为实现1PPS时标支持,定义了4个PPS处理状态:
- PPS_INIT_ED – 初始化完成
- PPS_TIC_ED – TIC计数器(0~9)设置完成
- PPS_ORG_ING – PPS/TIC原点正在对齐GPS秒脉冲(起点)
- PPS_OFS_ING – 正在调整PPS/TIC周期
当接收机时钟处于SF1_CLOCK或更高状态时,每当观测量读取任务(meas_task)被一个TIC信号所唤醒,就会自动调用一次PPS支持函数set_pps_org(…)。函数set_pps_org(…)对不同PPS处理状态进行不同响应。
1、PPS_INIT_ED
\qquad 这是PPS处理的最初状态。这个状态利用一次TIC信号响应完成以下处理:
- 根据接收机时钟秒计数(seconds),计算与1/10秒计数对齐的TIC计数值(0~9);
- 将计算出的TIC计数值加载到基带模块;
- 将PPS处理状态切换为PPS_TIC_ED。
2、PPS_TIC_ED
\qquad 这是设置了TIC计数值之后的状态。在这个状态下,使用接收机时钟秒计数(seconds)将TIC校准到1个累积中断(ACCUM_INT)的准确性(缺省约0.78ms)。校准条件为:完成了多于一次的有效定位解算且定位解算所得的时间偏差小于10微秒。以下是TIC校准进行的处理:
- 根据接收机时钟当前秒计数(seconds),计算与1/10秒计数对齐的TIC计数值(0~9);
- 计算seconds中除TIC计数值外的剩余值(以ACCUM_INT周期为单位);
- 计算需要对下一个TIC信号施加的延迟值;
- 将计算出的TIC计数值加1之后加载到基带模块;
- 将下一个TIC信号延迟值设置到基带模块;
- 将以纳秒为单位的剩余延迟值保存到pps_org_ofs;
- 将时钟当前秒计数(seconds)保存到tm_ofs_start;
- 将PPS处理状态切换为PPS_ORG_ING。
3、PPS_ORG_ING
\qquad 这是精细校准TIC信号起点的状态。精细校准做了假设:接收机的时钟漂移小于1PPM(1微秒/s),且能够在50s内完成精细校准, 因此精细校准期间累积的时钟漂移值不应大于50微秒。因此,在每次响应TIC信号时:
- 如果上次定位解无效,进行异常处理:
- 如果相比于tm_ofs_start,无效定位解持续时间超过50s,将PPS处理状态退回到PPS_TIC_ED。
- 否则(上次定位解有效),进行正常处理:
- 如果剩余延迟值pps_org_ofs大于100微秒,将100微秒TIC信号延迟值设置到基带模块;
- 否则,如果剩余延迟值pps_org_ofs大于1微秒,将剩余的若干微秒TIC信号延迟值设置到基带模块;
- 否则,将小于1微秒的剩余延迟值pps_org_ofs设置到基带模块;
- 检查剩余延迟值pps_org_ofs是否小于10纳秒。如果是,结束TIC信号起点校准,将PPS处理状态切换为PPS_OFS_ING。
4、PPS_OFS_ING
\qquad 这是校准TIC信号漂移的状态。漂移校准做了假设:时钟漂移小于1PPM(1微秒/s)且允许在最长50s内完成校准。于是,校准期间积累的漂移值不应大于50微秒, 加上“精细校准TIC起点”可能传递过来的50微秒最大漂移,从而总漂移值不应大于100微秒。因此,在每次响应TIC信号时:
- 如果上次定位解无效,进行异常处理:
- 如果相比于tm_ofs_start,无效定位解持续时间超过50s,将PPS处理状态退回到PPS_TIC_ED。
- 否则(上次定位解有效),进行以下处理:
- 如果自TIC起点校准结束后,没能完成任何有效解算, 或者解算所得的时钟偏差大于10微秒,退出本次TIC信号处理;
- 否则,以约2秒的间隔计算需要施加在一个TIC信号周期上的调整量:
- 如果调整量太大,返回到PPS_TIC_ED状态;
- 否则,设置调整量到基带模块;
- 将时钟当前秒计数(seconds)保存到tm_ofs_start。
\qquad 最后,需要强调:我们常常还希望,能从接收机的指定端口输出一个与UTC秒恰好对齐(同时发生)的秒脉冲,为此还需要在从TIC导出1PPS时标时,对射频前端和基带模块的信号延迟以及导出时标的处理和传播延迟进行补偿。