误差理论与测量平差课程设计报告_第1页
误差理论与测量平差课程设计报告_第2页
误差理论与测量平差课程设计报告_第3页
误差理论与测量平差课程设计报告_第4页
误差理论与测量平差课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

n n 目录 一 目录 1 二 序言 2 三 设计思路 3 四 程序流程图 4 五 程序及说明 5 六 计算结果 12 七 总结 15 第二部分 序言 1 1 课程设计的性质 目的和任务课程设计的性质 目的和任务 误差理论与测量平差是一门理论与实践并重的课程 其课程设计是测量数据处理理论学习的一个 重要的实践环节 它是在我们学习了专业基础课 误差理论与测量平差基础 课程后进行的一门实践课程 其目的是增强我们对误差理论与测量平差基础理论的理解 牢固掌握测量平差的基本原理和基本公式 熟 悉测量数据处理的基本技能和计算方法 灵活准确地应用于解决各类数据处理的实际问题 并能用所学的 计算机理论知识 编制简单的计算程序 2 2 误差理论与测量平差课程和其它课程的联系和分工 误差理论与测量平差课程和其它课程的联系和分工 这次课程设计中所用的数学模型和计算方法是我们在误差理论与测量平差课程中所学的内容 所 使用的 C 程序语言使我们在计算机基础课程中所学知识 误差理论与测量平差课程设计是测量平差和计算 机程序设计等课程的综合实践与应用 同时也为我们今后步入工作岗位打下了一定基础 3 3 课程设计重点及内容课程设计重点及内容 本次课程设计重点是培养我们正确应用公式 综合分析和解决问题的能力 以及计算机编程能力 另外它要求我们完成 1 2 个综合性的结合生产实践的题目 如目前生产实践中经常用到的水准网严密平差 及精度评定 边角网 导线 严密平差及精度评定等 此次我所选的课程设计课题是水准网严密平差及精 度评定 其具体内容如下 根据题目要求 正确应用平差模型列出观测值条件方程 误差方程和法方程 解算法方程 得出平差 后的平差值及各待定点的高程平差值 评定各平差值的精度和各高程平差值的精度 具体算例为 如图所示水准网 有 2 个已知点 3 个未知点 7 个测段 各已知数据及观测值见下表 1 已知点高程 H1 5 016m H2 6 016m 2 高差观测值 m 1 端点号高差观测值 m测段距离 km序号 1 3 1 3591 11 1 42 0091 72 2 30 3632 33 2 41 0122 74 3 40 6572 45 3 50 2381 46 5 2 0 5952 67 3 求各待定点的高程 3 4 点的高差中误差 3 号点 4 号点的高程中误差 第三部分 设计思路 一 解题步骤 1 此次设计我所采用的模型为间接平差模型 根据已知条件我们可知观测总数 n 7 必要观测数 t 3 则多余观测数 r n t 4 因此我需先选定三个参数 即 3 4 5 点的最或然高程 X X3 X X4 X X5 X X X0 x X30 6 375 X40 7 025 X50 6 611 其中 X0为参数的近似值 x 为其改正值 为参数 2 列出条件方程 即将每一个观测量的平差值分别表达成所选参数的函数 H1 h h1 X X3 H1 h h2 X X4 H2 h h3 X X3 H2 h h4 X X4 X X3 h h5 X X4 X X3 h h6 X X5 X X5 h h7 H2 整理后得出误差方程 v1 x3 v2 x4 v3 x3 4 v4 x4 3 v5 x3 x4 7 v6 x3 x5 2 v7 x5 即 v Bx lv Bx l 的形式 2 3 定权 令每千米的观测高差为单位权观测 即 Pi 1 Si 从而可写出权阵 P 根据误差方程式又可得其 系数矩阵 B B 和自由项 l 并由它们组成法方程 NBBx W 0 其中 NBB BTPB W BTPl 法方程的个数等于所选 参数的个数 4 解算法方程 求出参数改正值 x 并计算参数的平差值 X X X0 x 5 由误差方程计算 V 并求出观测量的平差值 为了检查平差计算的正确性 将所求的值代入条件方程 看其是否满足方程 6 精度评定 计算单位权中误差 按照题设要求列出权函数式 再根据平差参数的协方差阵求出协因数 最后求出某段高差中误差 某些点的高程中误差 二 程序设计思想 考虑到在解题过程中一些计算的复杂性 我们需借助一些技术将计算简单化 快捷化 因此在课程设 计过程中 我们把一些 C 语言程序设计引入其中 通过一些简单 明了的程序及子函数调用 我们就可以 很方便快捷的求出用笔算比较繁琐 费时的矩阵乘积 矩阵的逆 如 BTPB BTPl 等运算 第四部分 程序流程图 根据题目列出条件方程并写成误差方程的形式 V Bx l 确定权阵 根据误差方程得到矩阵 B l 进而写出 BT 运用 C 程序语言求出 BTP 进一步得到 NBB BTPB W BTPl 并求出 NBB 1 用 C 程序求出参数的改正数 x NBB 1W 根据 C 程序语言求 Bx 进而由 V Bx l 写出各观测值的改正数 根据 L L L V 求出各观测值的平差值 检验所求各值是否正确 若无误则往下进行 反之检查各步骤查出错误并改正 3 由程序计算 VTP 进而求出 VTPV 求单位权中误差 再根据权函数式 协因数传播定律评定各观测值及所求 高程的精度 第五部分 程序及说明 一 矩阵相乘计算函数一 矩阵相乘计算函数 include stdio h void Matrix a b m n k c int m n k double a b c int i j l u for i 0 i m 1 i for j 0 j k 1 j u i k j c u 0 0 for l 0 l n 1 l c u c u a i n l b l k j return 1 1 计算计算 B BT TP P main int i j static double a 3 7 B BT T static double c 3 7 b 7 7 P P Matrixmul a b 3 7 7 c printf n for i 0 i 2 i for j 0 j 6 j printf 8 4f t c i j printf n printf n return0 2 2 计算计算 B BT TPBPB 即 即 N NBB main 4 int i j static double a 3 7 B BT TP P static double c 3 3 b 7 3 B B Matrixmul a b 3 7 3 c printf n for i 0 i 2 i for j 0 j 2 j printf 8 4f t c i j printf n printf n return0 3 3 计算计算 B BT TPlPl 即 即 W W main int i j static double a 3 7 B BT TP P static double c 3 1 b 7 1 l l Matrixmul a b 3 7 1 c printf n for i 0 i 2 i for j 0 j 0 j printf 8 4f t c i j printf n printf n return0 二 矩阵的逆计算函数 求二 矩阵的逆计算函数 求 N NBB 1 1 include stdio h define M 3 void main float MAT M 2 M float MAT1 M M float t int i j k l 5 对矩阵进行初始化 for i 0 i M i for j 0 j 2 M j MAT1 j 0 对 MAT1 矩阵赋初值 for i 0 i M i for j 0 j M j scanf f 打印目标矩阵 printf 原矩阵为 n for i 0 i M i for j 0 j M j printf 13 7f MAT1 j printf n 对 MAT1 矩阵进行扩展 MAT1 矩阵添加单位阵 由 M M 变成 2M 2M 矩阵 for i 0 i M i for j 0 j 2 M j if j M MAT j MAT1 j else if j M i MAT j 1 else MAT j 0 对 M 矩阵进行变换 使得前半部分矩阵成为单位阵 则 后半部分矩阵即为所求矩阵逆阵 for i 0 i M i 对第 i 行进行归一化 for j 0 j 2 M j for k i 1 k M k 6 MAT j MAT j MAT k j t MAT for j i j 2 M j MAT j MAT j t 对矩阵进行行变换 使得第 i 列只有一个元素不为零 且为 1 for k 0 k M k if k i t MAT k for l i l 2 M l MAT k l MAT k l MAT l t 将后半部分矩阵即所求矩阵逆阵存入 MAT2 矩阵 for i 0 i M i for j 0 j M j MAT1 j MAT j M printf n 输出所求的逆阵 printf 逆阵为 n for i 0 i M i for j 0 j M j printf 8 4f MAT1 j printf n 7 4 4 求求 N NBB 1 1W W 即改正数 即改正数 x x main int i j static double a 3 3 N NBB 1 1 static double c 3 1 b 3 1 W W Matrixmul a b 3 3 1 c printf n for i 0 i 2 i for j 0 j 0 j printf 8 4f t c i j printf n printf n return0 5 5 计算计算 BxBx main int i j static double a 7 3 B B static double c 7 1 b 3 1 x x Matrixmul a b 7 3 1 c printf n for i 0 i 6 i for j 0 j 0 j printf 8 4f t c i j printf n printf n return0 6 6 计算计算 V VT TP P main int i j static double a 1 7 V VT T static double c 1 7 b 7 7 P P Matrixmul a b 1 7 7 c printf n for i 0 i 0 i 8 for j 0 j 6 j printf 8 4f t c i j printf n printf n return0 7 7 计算计算 V VT TPVPV main int i j static double a 1 7 V VT TP P static double c 1 1 b 7 1 V V Matrixmul a b 1 7 1 c printf n for i 0 i 0 i for j 0 j 0 j printf 8 4f t c i j printf n printf n return0 注 程序中有下划线部分在注 程序中有下划线部分在 C C 语言环境中运行时 需根据已知条件及所求结果进行替换 语言环境中运行时 需根据已知条件及所求结果进行替换 第六部分 计算结果 根据条件方程及定权原则写出 B l P 及 BT B 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 l 0 0 0 0 4 0 3 0 7 0 2 0 0 0 P 0 9091 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 5882 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4348 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3704 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4167 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7143 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3846 BT 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 一 在矩阵相乘计算函数的程序前提下 进行以下子程序的调用 1 替换第 1 个程序中的 BT P 并运行程序得到 BTP BTP 0 9091 0 0 0 4348 0 0 0 4167 0 7143 0 0 0 0 0 5882 0 0 0 374 0 4167 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7143 0 3846 2 替换第 2 个程序中的 BTP B 并运行程序得到 BTPB 即 NBB NBB 2 4748 0 4167 0 7143 0 4167 1 3753 0 0 0 7143 0 0 1 0989 3 替换第 3 个程序中的 BTP l 并运行程序得到 BTPl 即 W W 2 6063 4 0281 1 4286 二 在矩阵的逆计算函数程序中进行以下操作 运行程序 按照提示及以上运算得到的矩阵 NBB输入其元素 运行的结果即为 NBB 1 NBB 1 0 5307 0 1608 0 3450 0 1608 0 7758 0 1045 0 3450 0 1045 1 1342 三 再次在矩阵相乘计算函数的程序前提下 进行以下子程序的调用 1 替换第 4 个程序中的 NBB 1 W 并运行程序得到 NBB 1W 即所选参数的改正数 x x 0 2426 2 8552 1 1421 2 替换第 5 个程序中的 B x 并运行程序得到 Bx Bx 0 2426 2 8552 0 2464 2 8552 10 3 0978 1 3847 1 1421 3 根据 V Bx l 求出各观测值的改正数 V 并写出 VT 然后替换第 6 个程序中的 VT P 并运行程序得到 VTP V 0 2426 2 8552 4 2426 0 1448 3 9022 0 6153 1 1421 VT 0 2426 2 8552 4 2426 0 1448 3 9022 0 6153 1 1421 VTP 0 2205 1 6794 1 8447 0 0536 1 6260 0 4395 0 4393 4 替换第 7 个程序中的 VTP V 并运行程序得到 VTPV VTPV 19 7997 四 求出各个观测值平差值并按要求平定精度 X X3 6 3748 m X X4 7 0279 m X X5 6 6122 m h h1 1 3588m h h2 2 0119m h h3 0 3588m h h4 1 0119m h h5 0 6531m h h6 0 2374m h h7 0 5961m 根据公式可求得单位权中误差为 2 225mm h34 X X3 X X4 Q34 1 1 0 NBB 1 1 1 0 T 0 9849 H3 X X3 Q34 1 0 0 NBB 1 1 0 0 T 0 5307 H4 X X4 Q34 0 1 0 NBB 1 0 1 0 T 0 7758 3 4 点高差中误差为 2 208mm 3 号点高程中误差为 1 621mm 4 号点高程中误差为 1 96mm 第七部分 总结 通过这次误差理论与测量平差的课程设计 我又对整本书有了一个更深的理解 其实课程设计就是将 我们所学的理论知识应用于实践的过程 在这一过程中 进一步掌握测量平差的基本原理和基本公式 并 熟悉测量数据处理的基本技能和计算方法 或许我们已对 误差理论与测量平差 这本书的理论知识有了一定了解 但将它应用于实践依然是我 们的一个难点 尤其是将这门课程与计算机程序完美地结合 这便要求我们在原有的解题思路中加入 C 语 言程序 并让它来帮助我们解决矩阵的复杂运算 既然用到了程序 我们就必须保证其运算的简洁性 正 确性 尤其是在编写过程中要认真检查 为程序顺利运行打下基础 另外在各个子程序调用过程中 我们 11 要充分考虑其顺序性并反复调试 以便得到理想结果 尽管在这次课程设计中遇到了很多困难 但我却得到了不少收获 并培养了自己正确应用公式 综合 分析和解决问题的能力 同时也为今后步入社会打下了一定的基础 另外 我们还要学会综合利用自身所 学的知识 并将它们联系起来帮助自己有效地解决实际中的问题 总之 在这次课程设计中我不但过了比较充实的一周 还收获了不少知识 include include include include include include using namespace std class SZWPC private int gcz zs 高差总数 int szd zs 总点数 int yz szd zs 已知点数 double s0 单位权水准路线长度 double m pvv pvv int qsd dh 高差起点号 int zd dh 高差终点号 char dm 点名地址数组 double gcz 观测值数组 double szd gc 高程值数组 12 double P 观测值的权 double BTPB BTPL 法方程系数矩阵与自由项 double dX 高程改正数 平差值 double V 残差 double zwc 单位权中误差 public SZWPC SZWPC int ij int i int j 对称矩阵下标计算函数 bool inverse double a int n 对称正定矩阵求逆 仅存下三角元素 参考他人 void inputdata char datafile 输入原始数据函数 int dm dh char name 点名转点号 void ca H0 近似高程计算函数 void ca BTPB 法方程组成函数 void ca dX 高程平差值计算函数 void printresult char resultfile 精度估计与平差值输出函数 double ca V 残差计算函数 void zxecpc char resultfile 最小二乘平差函数 构造函数 SZWPC SZWPC gcz zs 0 szd zs 0 yz szd zs 0 析构函数 SZWPC SZWPC 13 if gcz zs 0 delete qsd dh delete zd dh delete gcz delete P delete V if szd zs 0 delete szd gc delete BTPB delete BTPL delete dX for int i 0 i j i i 1 2 j j j 1 2 i 对称正定矩阵求逆 仅存下三角元素 bool SZWPC inverse double a int n double a0 new double n for int k 0 k n k 14 double a00 a 0 if a00 1 0 1 0 delete a0 return false for int i 1 i n i double ai0 a i i 1 2 if i n k 1 a0 i ai0 a00 else a0 i ai0 a00 for int j 1 j i j a i 1 i 2 j 1 a i i 1 2 j ai0 a0 j for int i 1 i n i a n 1 n 2 i 1 a0 i a n n 1 2 1 1 0 a00 delete a0 return true 原始数据输入函数 void SZWPC inputdata char datafile ifstream infile datafile ios in 声明输入句柄 infile 打开地址为 datafile 的文件并 if infile 15 cerr Open error gcz zs szd zs yz szd zs infile s0 szd gc new double szd zs dX new double szd zs BTPB new double szd zs szd zs 1 2 BTPL new double szd zs qsd dh new int gcz zs zd dh new int gcz zs gcz new double gcz zs V new double gcz zs P new double gcz zs dm new char szd zs for int i 0 i szd zs i dm i NULL dm dh 函数根据 dm i 是否为 NULL 确定 dm i 是否为点名地址 char buffer 128 临时数组 保存从文件中读到的点名 for int i 0 i buffer int c dm dh buffer infile szd gc i for int i 0 i buffer 读取高程起点名 qsd dh i dm dh buffer 16 infile buffer 读取高程终点 zd dh i dm dh buffer infile gcz i P i 读取高差值与路线长度 P i s0 P i 线路长转化为观测值的权 infile close 点名转点号 返回点名对应的点号 int SZWPC dm dh char name for int i 0 i szd zs i if dm i NULL if strcmp name dm i 0 return i 将待查点名与已经存入点名数组的点名比 较 若存在返回点号 else int len strlen name 判断点名长度 dm i new char len 1 为点名申请存储空间 strcpy dm i name 待查点名是一个新的点名 将新点名的地址放到 dm 数组中 return i 返回点号 return 1 dm 数组已经存满 且没有待查点名 高程近似值计算 void SZWPC ca H0 17 for int i yz szd zs i szd zs i szd gc i 10000 9 为计算机设置辨别未知高程点的标 志 for int j 1 j int k 0 计算出近似高程的点数 for int i 0 i 10000 0 计算近似高程 k else if szd gc k1 10000 0 k2 点高程或高程近似值 已知 k1 点高程或高程近似值未知 szd gc k1 szd gc k2 gcz i 计算近似高程 k if k szd zs yz szd zs break 所有的近似高程计算完成 退出 组成法方程 void SZWPC ca BTPB 18 int t szd zs for int i 0 i szd zs szd zs 1 2 i BTPB i 0 0 赋初值 for int i 0 i szd zs i BTPL i 0 0 赋初值 for int k 0 k gcz zs k int i qsd dh k 获取点号 int j zd dh k 获取点号 double Pk P k 获取权值 double lk gcz k szd gc j szd gc i 获得第 k 个自由项 BTPL i Pk lk 获得法方程自由项 BTPL j Pk lk BTPB ij i i Pk 获得法方程系数矩阵 BTPB ij j j Pk BTPB ij i j Pk 高程平差值计算 void SZWPC ca dX for int i 0 i yz szd zs i BTPB ij i i 1 0e30 处理已知点 if inverse BTPB szd zs 矩阵求逆 cerr 法方程系数矩阵降秩 endl 矩阵为奇异矩阵 无法求逆 exit 0 退出程序 for int i 0 i szd zs i 计算高程改正数 double xi 0 0 for int j 0 j szd zs j 19 xi BTPB ij i j BTPL j dX i xi szd gc i xi 计算高程平差值 残差计算 double SZWPC ca V double pvv 0 0 for int i 0 i gcz zs 1 i int k1 qsd dh i int k2 zd dh i V i szd gc k2 szd gc k1 gcz i 1000 pvv V i V i P i return pvv 原始数据和平差值输出 void SZWPC printresult char resultfile double pvv ca V 残差计算 ofstream outfile resultfile ios out 以输出方式打开文件 若文件不存在 创建文件 输出原始观测数据 outfile endl 观测总数 gcz zs 总点数 szd zs outfile 已知点数 yz szd zs endl endl 20 outfile 单位权水准路线长 s0 km endl outfile endl 已知高程 endl 输出原 始观测数据已知点点号 高程 for int i 0 i yz szd zs 1 i outfile dm i outfile setiosflags ios fixed outfile setw 10 setprecision 4 szd gc i endl outfile endl endl 高差观测值 endl endl 输出原始观测数据高程观测值与路线长 outfile 起始点名 终点点名 高差观测值 m 两点间距离 km endl for int i 0 i gcz zs 1 i outfile dm qsd dh i setw 9 dm zd dh i outfile setiosflags ios fixed outfile setw 16 setprecision 4 gcz i outfile setiosflags ios fixed outfile setw 16 setprecision 4 s0 P i endl zwc sqrt pvv gcz zs szd zs yz szd zs 计算单位权中误差 outfile endl 单位权中误差 endl 输出 单位权中误差 outfile endl 0 zwc mm endl outfile endl 高程平差值及其精度 endl endl 输出高程平差值及其精度 outfile 点名 近似高程 m 改正数 mm 高程平差值 m 中误差 mm endl for int i 0 i szd zs i 21 outfile setw 2 dm i double dx dX i double qii BTPB ij i i outfile setiosflags ios fixed 用定点格式显示浮点数 outfile setw 12 setprecision 4 szd gc i dx outfile setiosfl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论