(整理)测绘程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
测绘程序设计课程实习报告
一、实习目的
《测量平差程序设计》是在我们学习了专业基础课《误差理论与测量平差基础》课程后将测量平差和计算机程序设计等课程的综合实践与应用的一门课程。其目的是在我们学习过平差这门课后增强我们对误差理论与测量平差基础理论的理解,巩固已掌握的测量平差的基本原理和基本公式以及计算方法,熟悉测量数据处理的基本技能,培养我们正确应用公式、综合分析问题和解决问题的能力,并能能够熟练运用所学过的C++语言,使平差理论与计算机结合起来,将主要的条件平差、间接平差以及水准网平差计算方法过程编写成一般形式的程序用于数据处理,灵活准确的应用于解决各类数据处理的实际问题当中,为我们今后步入工作岗位打下了一定的基础。
二、实习内容
本课程要求我们熟练运用测量平差的基本公式与计算方法和拥有基本的C++编程能力,以自由组成3-4人小组的方式共同学习,在老师的指导下能够按照要求由简至繁完成以下程序。
(一)角弧之间的相互转化
复习基本的C++内容、程序结构及编写方法,保证任意角度弧度之间可转化及其转化精度。
(二)文件的读入输出
在程序外部建立文本文档输入数据使程序具有一般性并且不需要在执行程序时进行输入,同时在程序运行后结果自动生成文件保存。
(三)概率运算
根据已知题目以及程序进行加以更改调试,建立文本文档读入文件计算标准正态分布函数、B分布的分布函数等概率函数。
(四)矩阵运算
实现矩阵的基本加、减、乘、转置及求逆运算,为接下来平差运算程序解决基本运算问题。
(五)条件平差与间接平差
利用之前以编写过的基本程序,以及平差的公式与算法,根据例题编写程序计算条件平差与间接平差(二者具有一定相似度)。
(六)水准网平差
首先利用已知的例题以及水准网计算公式和算法编写特殊可解的水准网平差,再在其基础上编写一般形式具有广泛应用的普通程序。
在将以上基本任务都完成之后还可以进一步编写GPS向量网等。
三、实习过程
(一)角弧之间的相互转化
1.编程思路:
首先在头文件中要注明#include
然后在主函数中选择进行角度转化为弧度或弧度转化为角度,再输入数值时,为了使接下来的运算能够计算正确,如果输入复制现将负值提出flag=(a<0.0)?-1.0:1.0,其中a为角度中的度数,在程序所有计算都运行完毕后在加上其负值-1,角弧转化最根本的是利用公式θ=L×180÷π,其中θ为角度,L为弧度。在角度化弧度中表示为L=(a+b/60.0+c/3600.0)/180.0*s*4*atan(1),在弧度化角度中表示为m=L*180/(4*atan(1)),其中m为将度分秒化为度的形式,在利用取整’/’将m化为度分秒的形式。
2.计算结果:
(二)文件的读入输出
1.编程思路:
文件可在计算机外部储存,且能长期保存可读取,也可重新刷写,对文件进行操作可随时进行数据更换。
在角弧相互转化程序的基础上进行更编,在原本输入角度和弧度地方使用文件操作,首先在头文件处要标明#include
其他程序具体操作不进行任何改变,但将输入数值改换为文件的输入输出后,其结果可以更好的保存,输入数据时更方便,而程序更具有一般性。
2.计算结果:
(三)概率计算
1.编程思路
根据已知的probability.cpp程序对照实际例题改编程序,进行文件输入输出操作和函数的调用练习,将已知数据输入到程序中求得结果。
2.计算结果:
(四)矩阵运算
1.矩阵的表示方法
在程序中矩阵要依靠创建动态数组来表示,创建动态数组是为了储存未知阶数m×n的二维矩阵,定义动态数组包含两个步骤:第一步,定义与数组元素类型相同的指针变量;第二步,申请内存并将内存地址赋给指针变量。用动态数组来表示矩阵的方法有很多例如将二维数组作为一维数组储存本次程序编译就采用了这种方法将矩阵表示为:
double *P=new double [n];此时P指针指向一个元素个数为n的一维数组。
地址new的作用是动态分配内存,在程序运行过程中申请分配用于存放初值列表类型数据的空间,并进行初始化。在所有运算进行完毕之后,要用delete 将动态分配建立的对象删除,从而释放空间。
除了这种方法之外,还可以直接定义二维数组,或调用函数创建来表示矩阵。
2.矩阵的运算
(1)矩阵加法与减法
矩阵的加法与减法相似,比较简单。首先还是要进行文件操作,读入两个矩阵的数值,因为其基本要求是两矩阵的行数与列数对应相等,所以在此程序中首先需要对两个矩阵进行判断,表示为if(p!=n*m||k!=n*m),若是行列数不相等,则输出错误信息表示不能进行运算。若是能够进行运算,则只需要两矩阵对应元素进行一一加减,即*(a+i*hang+j)+*(b+i*hang+j),得到的结果输出即可。在结束运算后关闭文件输入操作,若是单独作为一个函数,无需文件操作,则只需要返回指针。
(2)矩阵乘法
矩阵的乘法比起矩阵的加减法要稍稍有一点难度,因为其基本要求是第一个矩阵的行数和第二个矩阵的列数相同,所以对n×m阶矩阵A和p×q阶矩阵B 来说,在进行编程时首先要进行判断的是第一个矩阵的列数m是否与第二个矩阵的行数p是否相等,若不相等,输出错误信息,提示不能进行运算;若是符合条件,首先要定义一个新的动态数组C其长度为n×q(n,q要分别与第一个矩阵的行数和第二个矩阵的列数相同),并将数组C的每一个元素都赋予一个初始值0。数组C的第i行第j列的元素值等于数组A的第i行元素与数组B的第j列元素对应相乘后累加。因此*(C+i*m+j)+=(*(A+i*m+k))*(*(B+k*q+j));这里运用了多次for循环来实现运算。
(3)矩阵的转置
矩阵的转置表达较为简单,进行文件操作,读入两个矩阵的数值,定义一个与已知矩阵相同长度的数组,使得*(a+i*hang+j)=*(b+j*hang+i),然后将转置后的数组输出即可。若是单独作为一个函数,无需文件操作,则只需要返回指针。
(4)矩阵求逆
矩阵求逆在几种矩阵运算当中是最难的一种。由于在平差计算中,一般是对权值进行求逆,权阵的特点是对称矩阵,因而对于特殊的对称正定矩阵,在求逆函数中矩阵的存储是仅存下三角矩阵元素。
对称正定矩阵求逆