从间接平差到程序:一个水准网最小二乘解算案例
以一个含两个已知点、三个未知点和七条观测边的水准网为例,梳理间接平差的观测方程、法方程、精度评定与程序实现边界,并给出可复算的系数矩阵和计算结果。
记录一下课程设计。
问题:已知两点,求三个未知点
设已知点为
观测得到七条高差及对应路线长度。路线越长,观测通常越不稳定,因此这里采用与距离成反比的权:
其中
| 边号 | 起点 | 终点 | 观测高差 / m | 距离 / km | 权 |
|---|---|---|---|---|---|
| 1 | A | 1.359000 | 1.1 | 0.909091 | |
| 2 | A | 2.009000 | 1.7 | 0.588235 | |
| 3 | B | 0.363000 | 2.3 | 0.434783 | |
| 4 | B | 1.012000 | 2.7 | 0.370370 | |
| 5 | 0.657000 | 2.4 | 0.416667 | ||
| 6 | 0.238000 | 1.4 | 0.714286 | ||
| 7 | B | -0.595000 | 2.6 | 0.384615 |
单独沿任一路线推高程,会因观测误差得到彼此不完全一致的答案;平差的任务就是在全部观测共同约束下,找到一组最合理的未知高程。
从观测方程到法方程
一般地,设观测值为
对非线性问题,可在近似值
忽略二阶及以上小量后,得到线性化观测方程。写成矩阵形式就是:
这里
间接平差要求加权改正数平方和最小:
将
记
则法方程与参数改正数分别为:
在这个案例中,未知参数的顺序取为
每一行只表达一条观测边对未知点高程的影响。例如,第五条边从
解算后还能得到什么
求出
这三步分别给出未知点平差值、观测改正数和观测值平差值。对于本例,最终高程为:
对应的改正数很小:
| 边号 | 改正数 | 平差后高差 / m |
|---|---|---|
| 1 | -0.000243 | 1.358757 |
| 2 | 0.002855 | 2.011855 |
| 3 | -0.004243 | 0.358757 |
| 4 | -0.000145 | 1.011855 |
| 5 | -0.003902 | 0.653098 |
| 6 | -0.000615 | 0.237385 |
| 7 | -0.001142 | -0.596142 |
精度评定也必须伴随结果一起输出。若观测数为
单位权中误差为:
未知参数的协因数阵与方差阵为:
本例计算出的单位权中误差约为
程序实现:让流程可操作,而不只是可计算
将平差公式写成程序时,我把责任分开,而不是把所有逻辑堆在窗体事件里:
| 模块 | 责任 |
|---|---|
KnownPoint、Observation | 保存已知点、观测边与距离等输入数据 |
DataCheck | 检查空点名、重复点名、高差格式、正距离、与已知点的连通性、观测数量等 |
MatrixOperations | 用二维数组实现加减乘、转置和求逆 |
LeastSquares | 生成 |
DataStore | 暂存已导入或手动录入的数据 |
Report | 用 StringBuilder 组织平差报告,供预览或导出 |
LogService | 记录导入、检查、计算与输出过程 |
整个交互流程可以概括为:
导入/手动输入 → 数据检查 → 保存数据 → 平差计算 → 查看结果 → 输出报告
↑
检查失败则提示并返回输入
这里数据检查并非附属功能。若水准网中存在孤立点、观测边没有连到已知点,或者距离为零,后续矩阵即使“算出结果”也没有测量意义。因此,先验证网络可用性,再进入最小二乘计算,是程序层面对应理论前提的一道关口。
小结
这个案例把水准网间接平差压缩成了一条清晰的链路:观测数据决定权阵与常数项,网络拓扑决定系数矩阵,最小二乘条件导出法方程,回代和精度评定则让结果从“一个答案”变成可解释的测量成果。
对我来说,自己实现矩阵运算和法方程求解的价值不在于替代现成库,而在于真正看清
Comments
从间接平差到程序:一个水准网最小二乘解算案例