测绘程序设计与C++编程课程设计指导书长安大学地测学院测绘科学系二0一三年9月测绘程序设计技术课程设计指导书一、课程设计的目的和意义:测绘程序设计是一门实践性很强的专业综合性课程,与《C++语言程序设计》、《测量平差基础》、《面向对象程序设计》以及《控制网平差》等课程都有较为密切的关系。对测绘工程专业学生而言,掌握基本的数据处理程序设计技术具有重要的意义。为加深学生对相关数据处理程序基本特点、面向对象的软件分析与设计思想和方法的进一步理解,进一步掌握面向对象的测绘数据处理程序开发的基本特点和技术,在《测绘程序设计与C++编程》课程结束后安排为期二周的测绘程序设计技术课程设计。课程设计将基于在课程中学习的基本知识,开发具有一定应用或研究价值的测绘工程数据处理应用程序模块,以达到锻炼学生面向对象的软件分析与程序设计能力并培养良好的编程习惯,培养学生面向对象的程序设计思想以及基本的数据处理程序设计能力。本课程设计旨在通过较为具体、充分的程序分析与设计训练,使学生掌握数据处理程序的开发特点、面向对象的问题分析思想与方法以及程序设计技术,为进一步充分利用计算机技术解决测绘工程的专业技术问题奠定一定的基础。二、课程设计主要内容:测绘程序设计课程设计的主要目的是通过具体问题分析与程序设计的过程锻炼学生分析问题、掌握数据处理软件设计与编程的基本技术和方法。课程设计的主要工作内容如下:1.通过充分的上机练习,了解测绘数据处理问题的基本特点、面向对象的问题分析思想与程序开发方法,掌握软件开发、调试与测试的基本技术。2.分析课程中相关类的基本结构与模块功能,进一步理解并掌握面向对象的问题分析思想与程序设计技术以及测绘数据处理问题的基本特点、程序设计方法。3.分项目开发相关测绘数据处理程序模块,开展相关问题概念模型分析、类结构设计、代码编写、调试、测试等工作,要求每人至少开发如下9个程序模块中的两个。选题要求:题目(1)为必选题目;(2)-(9)每人至少选择一题,除题目(1)外每班选择相同题目人数不得多于5人(做两项以上题目者不受此条件限制);选题工作由各班班长具体负责,在课程设计开始前完成选题工作,课程设计开始后上报各班选题情况汇总表。(1)观测值筛选法抗差估计(必选题目)。在本课程中,与经典的间接平差并列,我们还学习了一种抗差估计理论。该理论以间接平差为基础,利用观测值改正数的分布规律,建立了等权替代法的抗差估计思想,处理含有粗差的观测值的合理平差问题。该理论存在的实际应用问题是,并不能完全保证对普遍的问题都具有适应性,也就是不能保证对所有含粗差观测值的平差问题都能进行正确的平差。还有,随意改变无粗差的观测值的权是否合理,也是值得考虑的重要方面。针对等权代替法存在的这些问题,基于有充分多余观测值的假设,现提出一种观测值筛选法抗差估计思想。先假设在观测值中不存在粗差,所有观测值都服从统一的正态分布,那么使用全部观测值进行平差与去掉任何一个观测值进行平差的结果应当没有显著区别。相应地,从观测值改正数的角度看,若观测值不存在粗差,使用全部观测值进行平差与去掉一个观测值进行平差,两组观测值改正数应当服从于同一个正态总体(假设对一个控制网进行无限次的正常观测——不出现粗差,通过平差则可以构成观测值改正数的正态总体)。换句话说,就是在正常情况下,这样的两种改正数应当没有显著性区别。相反,若在观测值序列中存在一个粗差,那么总体平差的改正数序列必然被该粗差所污染(改正数绝对值变大),则该组观测值的均值与方差会背离原正态总体;而去掉该粗差观测值后的平差改正数序列必然与原正态总体相同。也就是说,含粗差与不含粗差的两组观测值的平差观测值改正数不应该是同一个分布。这种分布的差异可以使用数理统计中两个正态总体均值差与方差比的假设检验方法进行判断。若经检验,在一定置信度下,方差比不为1或者均值差不为零,则说明两个平差的改正数分布不同。据此按一定的概率判断被去掉的观测值是否含粗差自然是合理的。实际的情况是,若对观测值进行粗差污染,平差后,观测值改正数的平均值与方差都将显著变大,或者说脱离正态分布总体;而去掉仅含的一个粗差,观测值的改正数将明显回归于正态分布总体。两个改正数序列的均值或方差必然不同,说明两个改正数序列的分布是不同,当然也可以说明被去掉的观测值是含有粗差的。那么,如果在一个问题中,含有多个粗差怎么办呢?显然,如果粗差已经多到无法处理的程度,破坏了问题空间本来的合理结构,那谁也没办法。对于相对正常的情况,其实只要重复上面的思想,按从大到小的顺序逐步探测并处理粗差,就可以依次找到并处理一个观测值序列中的所有粗差。针对这种思想,本课题要求基于课程中adj类中的相关内容,设计并实现这种方法的函数模块,以实现对含有粗差的观测值进行合理的平差,通过充分的模拟以及观测数据的计算与比较分析,验证该思想的正确性与可行性。本课题的主要工作内容包括:(a)在adj类中,设计并编写私有成员函数intFind_gross(),该函数用于处理一般的经典平差的情况,作用是找到一个含有粗差的观测值,函数返回值为含最大粗差的观测值编号。该函数的主要处理过程是,先进行一次总体平差,记录平差的观测值改正数、单位权方差、观测值个数与多余观测数;然后进行分别去掉每个观测值的平差计算,记录所有平差中单位权方差最小的一次平差的观测值编号、观测值改正数、单位权方差、观测值个数与多余观测数;在一定的置信度af下,进行两种记录数据的方差与均值相等的假设检验;若检验为假,说明两个序列统计特征不同,则返回单位权方差最小的观测值编号;相反,若假设检验为真,则说明在该观测值序列中不存在粗差观测值,函数返回-1。在本函数中进行的所有平差计算都使用adj类中的dadj()函数进行,去掉哪个观测值意味着将该观测值的权设为0。方差比与均值差检验方法与函数由指导教师提供(关于统计检验方法的说明:在提供的程序设计资料中,有一个文件TJFB.h,该文件定义了一个TJFB类,该类定义了常用的统计分布计算函数以及满足本问题均值差与方差比检验函数boolTJFB::XJ_YJ(doubleXJ,doubleYJ,doubleSSX,doubleSSY,intn,intm,intzn,intzm,doubleaf),该函数定义两个序列均值与方差比检验,均值相同且方差比为1返回true;否则,返回false。本函数的参数分别为X与Y序列的计算均值、计算方差、样本大小、自由度以及统计置信度)。(b)在adj类设计并编写一个public成员函数boolSX_Robust(),用来定义观测值筛选法稳健估计。SX_Robust()函数进行的基本工作是,先调用一次函数Find_gross(),若Find_gross()函数返回值为-1,SX_Robust()则返回false,函数退出;否则,删除对应最大粗差观测值(设置权阵P对应位置为0),然后再次调用Find_gross(),依此类推,进行迭代计算。权阵中主元为0的元素位置即粗差观测值的序号,主元为零的个数即粗差观测值的个数。非粗差观测值的权并无改变。若粗差观测值个数大于0,SX_Robust()函数返回true。假设检验函数需要的置信度参数可以定义为adj类的公有成员变量,一般可选0.1、0.05或0.01,通过adj类对象进行赋值。(c)修改adj类中的成员函数doadj(),使得在选择抗差估计后,采用SX_Robust()进行抗差计算。(d)在main()函数中,建立一个adj对象,设计一组数据,分别采用经典平差与抗差估计进行对比分析。分别调整置信度水平、粗差量级与粗差个数,分析对不同情况的抗差估计效果及其与不同因素之间存在的关联关系。(e)分别重载Find_gross()与SX_Robust()函数,定义Find_gross(intknown)与SX_Robust(intknown,intr),实现极大权法筛选抗差估计。并修改极大权法平差函数doadj(intknown,intr),使得当选择抗差估计时,采用极大权法筛选抗差估计进行平差计算。(f)分别设计高程网、平面网、GPS网等测量数据采用经典与抗差两种方式进行数据处理。对不涉及粗差、涉及单个粗差与多个粗差的情形,采用经典平差、等权替代法与筛选法抗差估计的不同模型进行计算并进行比较分析,对筛选法的不同置信度水平影响进行对比分析,指出本方法的优越性与应用局限性,提出本方法可能存在的问题与改进意见。(2)基于测量坐标拟合计算平面圆曲线方程参数。为精确地确定地面上某条圆曲线的位置参数,测量了位于该圆曲线上的n(n3)个点的平面坐标(x,y)。由于测量坐标存在误差,从理论上讲,这n个点的测量坐标并不位于同一条圆曲线上。当然,根据这些测量坐标,可以通过平差的方法确定这条圆曲线最精确的位置。设这条圆曲线的方程为:22)()(RRyyxxR(2-1)其中,R为半径,xR与yR为圆心坐标。因此,确定了圆心坐标与半径就确定了这条圆曲线的位置与大小。本问题就是要通过测量点坐标数据进行平差计算,从而确定圆的圆心坐标与半径未知参数。(2-1)式为非线性方程,要建立误差方程必须进行线性化。假设每个测量点坐标的最或然值可以写为yxvyyvxxˆˆ(2-2)将(2-2)代入(2-1)得0)ˆ()ˆ(22RyyxxRR(2-3)对(2-1)式进行微分或者取平方,可以建立线性化的误差方程。建立微分方程,需要首先计算圆心坐标与半径的近似值。根据3个测量点坐标数据,可以计算圆心与半径的近似值。设圆心坐标与半径的近似值为000R与、RRyx,根据微分方程建立的关于一个测量点的误差方程为:lRybxavRR(2-4)其中2020020200)()()()(RRRRRRyyxxyybyyxxxxa20200)()(RRyyxxRlv是由于坐标测量误差所造成的计算模型残差。(2-4)为由一个点构成的误差方程,未知参数为圆心坐标与圆半径的未知数改正数。把所有n个测量点的误差方程构成方程组,则形成有n个观测值,3个未知参数的平差计算模型。设n个点的测量精度相同,则观测值的权阵可以用单位阵表示。对(2-1)式的线性化也可以采用取平方的方法,对(2-1)取平方并整理得到02222222RyyyyxxxxRRRR(2-5)对(2-5)线性化得到})()(){(2)(2)(2202020000RRRRRRyyxxRRRyyyxxxv(2-6)(2-6)为圆上测量点误差方程的另一种形式。圆心坐标与圆半径近似值的计算可以根据任意3个测量点坐标进行。方法为首先计算圆心坐标,再计算圆心坐标与测量点的距离得到近似半径。设三个测量点为P1、P2与P3,假设每个测量点到圆心的距离相等,可以列出包含两个方程的方程组2323212122222121)()()()()()()()(RRRRRRRRyyxxyyxxyyxxyyxx(2-7)对(2-7)中的方程式两边分别取平方并整理,得2)()(2)()(212123231313212122221212yxyxyyyxxxyxyxyyyxxxRRRR(2-8)由(2-8)式,通过解方程计算可以得到圆心的近似坐标。计算圆心与任意一个测量点的距离可以得到圆的近似半径。设计一个Round类,进行本问题的平差计算。要求计算出圆心坐标与半径的值,给出未知数的计算精度。注意:1)通过(2-4)或(2-6)式进行平差计算得到直接平差结果为未知数改正数,加上未知数近似值才是未知数计算值。2)因为在误差方程系数阵与常数项计算中用到未知数近似值,所以平差计算需要迭代处理,迭代计算时,重复使用前一次的未知数计算结果重新计算平差模型系数阵与常数项,迭代结束条件设为计算未知数改正数的最大值绝对值0.000001。设计一条圆曲线(给定圆心与半径的值),计算一组模拟测量点坐标数据,在这组模拟数据