Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第一章 · 真实应用案例:GPS 定位的误差预算

本章讲了三件事:误差怎么分类、怎么传播(1.2),以及怎么用范数与条件数给「放大倍数」一个精确的名字(1.3)。这一页把三件事装进同一个真实系统——卫星定位。选 GPS 有三个理由:它是几十亿人每天都在用的技术;它的误差链条恰好把 1.2 的四类误差走了一遍;而决定定位精度的核心量(几何精度因子 GDOP)本质上就是一个条件数。读完这一页,你会看到第一章的抽象公式如何变成「今天手机定位准不准」的答案。

直觉 · GPS 在解一个什么方程

卫星告诉你「我到你有多远」——这个距离称为伪距,你据此反推自己的坐标。四颗卫星、四个未知数(x,y,zx,y,z 和接收机钟差 dd),未知数与方程数刚好相等,解得出来。但「刚好能解」不等于「解得准」:如果四颗卫星挤在天空的同一小片区域,测距的微小误差就会被几何结构放大成巨大的定位误差——这正是本章所说的「问题本身的敏感性」在一个工程系统里的样子。

一、定位方程与线性化

设接收机位置为 p=(x,y,z)T\boldsymbol{p}=(x,y,z)^{\mathrm T},钟差为 dd——它是接收机时钟与系统时的偏差,乘以光速后就是一个未知的距离量。第 ii 颗卫星的位置 si\boldsymbol{s}_i 已知,测得的伪距为

ρi=∥p−si∥2+d+ηi(i=1,2,3,4),(A.1)\rho_i=\lVert\boldsymbol{p}-\boldsymbol{s}_i\rVert_2+d+\eta_i\qquad(i=1,2,3,4), \tag{A.1}

其中 ηi\eta_i 是测距噪声,来源包括电离层延迟、多径、接收机噪声等。这是一个非线性方程组,要先在近似位置 p0\boldsymbol{p}_0(例如上一次定位结果)处把它线性化:记 Δp=p−p0\Delta\boldsymbol{p}=\boldsymbol{p}-\boldsymbol{p}_0、ui=p0−si∥p0−si∥2\boldsymbol{u}_i=\dfrac{\boldsymbol{p}_0-\boldsymbol{s}_i}{\lVert\boldsymbol{p}_0-\boldsymbol{s}_i\rVert_2} 为单位视线向量,则

Δρi≈uiTΔp+d⟹G(Δpd)=Δρ,(A.2)\Delta\rho_i\approx\boldsymbol{u}_i^{\mathrm T}\Delta\boldsymbol{p}+d\qquad\Longrightarrow\qquad G\begin{pmatrix}\Delta\boldsymbol{p}\d\end{pmatrix}=\Delta\boldsymbol{\rho}, \tag{A.2}

G=(u1xu1yu1z1u2xu2yu2z1u3xu3yu3z1u4xu4yu4z1)∈R4×4.(A.3)G=\begin{pmatrix}u_{1x}&u_{1y}&u_{1z}&1\u_{2x}&u_{2y}&u_{2z}&1\u_{3x}&u_{3y}&u_{3z}&1\u_{4x}&u_{4y}&u_{4z}&1\end{pmatrix}\in\mathbb{R}^{4\times4}. \tag{A.3}

GG 称为几何矩阵:前三列记录四颗卫星在天空中的方向,最后一列全为 11,对应钟差。于是定位问题(A.2)化为一个 4 阶线性方程组,本章的误差传播理论立刻适用:测距误差 Δρ\Delta\boldsymbol{\rho} 到定位误差 (Δp,d)(\Delta\boldsymbol{p},d) 被放大多少倍,完全由 GG 决定。

二、误差链条上的四类误差(对应 1.2.1)

下面用 1.2.1 的四类误差,逐环节清点 GPS 的误差来源:

环节误差类型GPS 中的具体来源
建模模型误差用直线传播代替对流层折射;把地球当作球体;忽略相对论效应
测量观测误差星历误差(卫星轨道预报不准)、电离层 / 对流层延迟、多径、接收机噪声
近似求解截断误差(A.2)是一阶 Taylor 近似,忽略了 ∥Δp∥2\lVert\Delta\boldsymbol{p}\rVert^2 量级的二阶项——迭代若干次即可消除
机器执行舍入误差用双精度求解(A.2);相对误差约 u=1.1×10−16u=1.1\times10^{-16},再与几何放大倍数相乘

关键观察: 在实际 GPS 中,ηi\eta_i 主要由观测误差支配(典型 1∼51\sim5 m);这份测距误差最终被放大多少倍,取决于几何矩阵 GG。这句话正好对应本章两处内容:1.2.3 的「误差 × 放大倍数」框架,以及 1.2.6 对「病态问题」与「不稳定算法」的区分。卫星几何不好属于前者,是问题病态:换接收机、换算法都救不了,只有等几何变好(更好的卫星升起)才行。

三、几何放大倍数:GDOP 就是条件数

由(A.2),

(Δpd)=G−1Δρ⟹∥(Δpd)∥≤∥G−1∥ ∥Δρ∥.\begin{pmatrix}\Delta\boldsymbol{p}\d\end{pmatrix}=G^{-1}\Delta\boldsymbol{\rho}\qquad\Longrightarrow\qquad\left\lVert\begin{pmatrix}\Delta\boldsymbol{p}\d\end{pmatrix}\right\rVert\le\lVert G^{-1}\rVert,\lVert\Delta\boldsymbol{\rho}\rVert .

注意这个界里没有 ∥G∥\lVert G\rVert 因子:右端扰动的「分母」由伪距本身固定,完整讨论见 2.4。GPS 文献定义的几何精度因子(geometric dilution of precision)正是

GDOP=tr⁡ ⁣[(GTG)−1].(A.4)\mathrm{GDOP}=\sqrt{\operatorname{tr}!\bigl[(G^{\mathrm T}G)^{-1}\bigr]} . \tag{A.4}

GDOP 把位置 3 个分量与钟差的误差按平方和合成,是 ∥G−1∥\lVert G^{-1}\rVert 的一种(Frobenius 型)度量。工程上还常把它拆成分量使用:PDOP\mathrm{PDOP}(位置部分)、TDOP\mathrm{TDOP}(时间部分)。GDOP 越大,同样的测距误差造成的定位误差就越大——它和 2.4 的条件数 cond(A)\mathrm{cond}(A) 是同一个思想的两个工程名称。

一组真实可复算的几何

把接收机放在原点,为四颗卫星各取一组(方位角,仰角)坐标:

情形 四颗卫星(方位°, 仰角°) cond2(G)\mathrm{cond}_2(G) GDOP
好几何 (0,90),(120,10),(240,10),(0,10)(0,90),(120,10),(240,10),(0,10) 3.253.25 1.96\mathbf{1.96}
差几何 (0,60),(120,60),(240,60),(0,80)(0,60),(120,60),(240,60),(0,80) 36.1136.11 13.63\mathbf{13.63}

差几何就是「四颗星全挤在头顶同一片天」的情形,城市高楼之间正是这种场景——高楼一挡,只剩高仰角的卫星可见。几何一变差,同样的测距精度,定位误差就要放大近 7 倍。

四、误差预算:把数字算出来

取典型测距误差 σρ=5\sigma_\rho=5 m(未校正电离层时的量级)。按上面的关系,位置误差(1σ)约为 GDOP×σρ\mathrm{GDOP}\times\sigma_\rho:

几何GDOP定位误差(1σ)
好几何1.961.96≈9.8\approx9.8 m
差几何13.6313.63≈68.2\approx68.2 m

这就是「GPS 有时精确到几米、有时偏出几十米」的第一个原因。第二个原因是这个 55 m 本身也不是常数:单频接收机不开电离层模型时,测距误差可达 5∼105\sim10 m;改用双频接收机则可以把它压到分米级。两个因子相乘——第一章的全部误差公式,最终就落地成这一个乘积。

案例计算 13.1 · 好几何下的 GDOP 与误差传播

用(A.3)构造好几何下的 GG,计算 cond2(G)\mathrm{cond}_2(G) 与 GDOP,并回答:若某颗卫星突然失效、只剩三颗可用(未知数仍是 4 个,方程数不足),会发生什么?

解与代码

好几何的单位视线向量(取近似位置 p0=0\boldsymbol{p}_0=\boldsymbol{0})为

G=(00−11−0.8530.492−0.17410.8530.492−0.17410−0.985−0.1741),GTG=(1.45500001.45500001.090−1.52100−1.5214.000).G=\begin{pmatrix} 0&0&-1&1\\ -0.853&0.492&-0.174&1\\ 0.853&0.492&-0.174&1\\ 0&-0.985&-0.174&1 \end{pmatrix},\qquad G^{\mathrm T}G=\begin{pmatrix} 1.455&0&0&0\\ 0&1.455&0&0\\ 0&0&1.090&-1.521\\ 0&0&-1.521&4.000 \end{pmatrix}.

第二个矩阵的前两行、两列精确解耦(四颗星在水平方向对称分布),所以前两个坐标分量的误差互不放大;几何上的弱点则全部集中在竖直方向与钟差的耦合上,即右下角的 2×22\times2 块。计算得 cond2(G)≈3.25\mathrm{cond}_2(G)\approx3.25、GDOP≈1.96\mathrm{GDOP}\approx1.96,也就是 σρ=5\sigma_\rho=5 m 时定位误差约 9.89.8 m。

import numpy as np
R = 26560e3                                    # GPS 轨道半径(m),用于还原卫星位置
def Gmat(pairs, R=R):
    S = np.array([[np.cos(np.radians(e))*np.sin(np.radians(a)),
                   np.cos(np.radians(e))*np.cos(np.radians(a)),
                   np.sin(np.radians(e))] for a, e in pairs]) * R
    U = -S / np.linalg.norm(S, axis=1)[:, None]   # 单位视线向量
    return np.hstack([U, np.ones((4, 1))])        # 末列是钟差
def report(pairs, name):
    G = Gmat(pairs)
    Q = np.linalg.inv(G.T @ G)
    gdop = np.sqrt(np.trace(Q))
    print(f"{name}: cond2(G)={np.linalg.cond(G):6.3f}  GDOP={gdop:6.3f}  "
          f"σ=5m → 定位误差 {gdop*5:5.2f} m")
report([(0,90),(120,10),(240,10),(0,10)],      "好几何")
report([(0,60),(120,60),(240,60),(0,80)],      "差几何(聚顶)")
好几何: cond2(G)= 3.249  GDOP= 1.965  σ=5m → 定位误差  9.82 m
差几何(聚顶): cond2(G)=36.112  GDOP=13.634  σ=5m → 定位误差 68.17 m

只剩三颗星: GG 变成 3×43\times4,(A.2)成为欠定方程组——方程数少于未知数,定位问题本身没有唯一解。这正是「至少需要四颗卫星」的根本原因:三颗用来定位置、第四颗用来定钟差。工程上若某颗星失效,接收机要么提示「精度下降」并给出一个粗略解,要么用上一时刻的位置或高程约束把方程补足——这就是用额外假设换回可解性,属于 1.2.6 所说的「重述问题」。

∎

五、历史教训:误差失控的两个真实事故

第一章反复强调「误差是公式与算法的属性」;下面两起真实事故,就是这句话最沉重的注脚——它们与 GPS 无关,却分别踩中了本章的两个主题:误差累积与浮点范围。

案例一 · Patriot 导弹系统(1991 年,海湾战争)

系统内部以 24 位定点数记录时间,每次更新都把系统时钟乘以 0.10.1 秒。0.10.1 的二进制展开是循环小数(见 1.2.5),用 24 位定点截断后,每一步都会引入约 9.5×10−89.5\times10^{-8} 秒量级的舍入误差。单独一步毫不可怕;但系统连续运行 100 小时、每 0.1 秒更新一次,这样的误差被累加了约 3.6×1063.6\times10^6 次——9.5×10−8×3.6×106≈0.349.5\times10^{-8}\times3.6\times10^6\approx0.34 秒。这就是 1.2.4 的递推误差放大与 1.2.5 的「nn 次运算相对误差 ∼nu\sim nu」在现实中兑现的样子。据美方调查,累计时钟偏差约 0.340.34 秒,而目标以约 17001700 m/s 飞行,对应位置偏移达数百米,最终导致拦截失败、28 名士兵身亡。

教训: 单步误差小不等于总误差小。要问两件事:误差怎么传播(本章 1.2.4),以及运行时长会把它放大多少倍。这正是「算法稳定性」在工程中的分量。

案例二 · Ariane 5 首飞(1996 年)

火箭直接复用了 Ariane 4 的惯性导航软件。其中一段代码把 64 位浮点表示的加速度值转换成 16 位整数:在 Ariane 4 的轨迹下这个值不会溢出;Ariane 5 的轨迹不同,值超出了 16 位整数能表示的范围,转换溢出,导航计算机随之停机,火箭在 37 秒后自毁。

教训: 浮点数能表示的范围是有限的(1.2.5 的指数位 L≤e≤UL\le e\le U);「在一个小范围内正确」的代码,不等于「在所有输入下都正确」。数值代码必须写清自己的适用域——这也正是本教程每讲一个方法都要交代「假设」与「失效判据」的原因。

六、这一页用到了第一章的什么

本章概念在 GPS 案例中的位置
1.2.1 四类误差GPS 误差来源清点表(模型 / 观测 / 截断 / 舍入四类齐备)
1.2.3 误差传播(A.2)中 Δρ→(Δp,d)\Delta\boldsymbol{\rho}\to(\Delta\boldsymbol{p},d) 的线性放大
1.2.4 误差累积Patriot 案例:每步 10−710^{-7} 秒 × 3.6×1063.6\times10^6 步
1.2.5 浮点范围与精度Ariane 5 溢出;Patriot 的 0.10.1 二进制表示误差
1.2.6 病态 vs 不稳定卫星几何差属于问题病态,换算法无效
1.3 范数∥Δp∥\lVert\Delta\boldsymbol{p}\rVert 度量位置误差的大小;∥G−1∥\lVert G^{-1}\rVert 与 GDOP
2.4 条件数cond2(G)\mathrm{cond}_2(G) 与 GDOP 是同一件事的两种写法
课程预告 · 从「刚好可解」到「最优估计」

本页处理的是恰好四个观测、方程数与未知数刚好相等的方阵情形。现代接收机同时能看到 8–12 颗卫星,方程变成超定(G∈Rm×4G\in\mathbb{R}^{m\times4},m>4m\gt4),要解的是最小二乘问题 min⁡∥Gξ−Δρ∥2\min\lVert G\boldsymbol{\xi}-\Delta\boldsymbol{\rho}\rVert_2——这正是补充篇 2.2 节讲的投影与最小二乘。实际软件用 QR 分解(2.3)求解,再用 GG 的奇异值判断几何质量(2.6)。读完补充篇,你能自己写出一个 GPS 定位求解器。