误差理论与测量平差课程设计实验报告
- 格式:doc
- 大小:1.23 MB
- 文档页数:31
一、实习背景测量平差是测量学中的重要内容,它通过对测量数据进行处理,减小误差,提高测量结果的精度。
为了更好地理解和掌握测量平差的理论和方法,我们组织了本次测量平差实习。
二、实习目的1. 掌握测量平差的基本原理和方法;2. 学会运用测量平差软件进行数据处理;3. 提高实际操作能力,培养团队协作精神。
三、实习内容1. 学习测量平差的基本概念和原理;2. 掌握水准测量、三角测量、导线测量等基本测量方法;3. 学习使用测量平差软件,如南方CASS、AutoCAD等;4. 完成实际测量任务,进行数据处理和分析。
四、实习过程1. 第一阶段:理论学习。
我们首先学习了测量平差的基本概念、原理和方法,了解了水准测量、三角测量、导线测量等基本测量方法。
2. 第二阶段:实际操作。
我们以实际测量任务为背景,进行了水准测量、三角测量、导线测量等操作。
在操作过程中,我们学会了使用水准仪、经纬仪等测量仪器,掌握了测量数据采集和处理的基本技能。
3. 第三阶段:数据处理。
我们运用测量平差软件,对采集到的测量数据进行处理和分析。
通过计算,得到了各测点的高程、坐标等参数,并分析了测量误差。
4. 第四阶段:总结报告。
我们根据实习过程,总结了自己的学习心得和体会,形成了本次测量平差实习报告。
五、实习收获1. 掌握了测量平差的基本原理和方法,为今后的学习和工作打下了坚实的基础;2. 提高了实际操作能力,学会了使用测量仪器和测量平差软件;3. 培养了团队协作精神,学会了与他人共同完成任务;4. 增强了问题解决能力,能够在实际操作中分析问题、解决问题。
六、实习总结通过本次测量平差实习,我们深刻认识到测量平差在工程测量中的重要性。
在今后的学习和工作中,我们将继续努力,不断提高自己的专业素养,为我国工程测量事业贡献自己的力量。
同时,我们也要感谢指导老师的悉心教导和同学们的相互帮助,使我们在实习过程中取得了丰硕的成果。
实验一回归分析一、实验目的和要求1.掌握线性回归模型的建立、解算和回归假设检验;2.提高编制程序、使用相关软件的能力;3.熟练使用回归模型处理测量数据。
二、实验时间及地点三、实验内容:1.在对某大坝进行变形观测,选取坝体温度和水位压力作为自变量x1,x2,大坝水平位移值为观测量y,现取以往22次观测资料为样本,见下表:121)求回归方程自变量X X=[1 11.2 36.0;1 10.0 40.0;1 8.5 35.0;1 8.0 48.0;1 9.4 53.0;1 8.4 23.0;1 3.1 19.0;1 10.6 34.0;1 4.7 24.0;1 11.7 65.0;1 9.4 44.0;1 10.1 31.0;1 11.6 29.0;1 12.6 58.0;1 10.9 37.0;1 23.1 46.0;1 23.1 50.0;1 21.6 44.0;1 23.1 56.0;1 19.0 36.0;1 26.8 58.0;1 21.9 51.0]X =1.0000 11.2000 36.00001.0000 10.0000 40.00001.0000 8.5000 35.00001.0000 8.0000 48.00001.0000 9.4000 53.00001.0000 8.4000 23.00001.0000 3.1000 19.00001.0000 10.6000 34.00001.0000 4.7000 24.00001.0000 11.7000 65.00001.0000 9.4000 44.00001.0000 10.1000 31.00001.0000 11.6000 29.00001.0000 12.6000 58.00001.0000 10.9000 37.00001.0000 23.1000 46.00001.0000 23.1000 50.00001.0000 21.6000 44.00001.0000 23.1000 56.00001.0000 19.0000 36.00001.0000 26.8000 58.00001.0000 21.9000 51.0000X的转置 X T X1=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;11.2 10.0 8.5 8.0 9.4 8.4 3.1 10.6 4.7 11.7 9.4 10.1 11.6 12.6 10.9 23.1 23.1 21.6 23.1 19.0 26.8 21.9;36.0 40.0 35.0 48.0 53.0 23.0 19.0 34.0 24.0 65.0 44.0 31.0 29.0 58.0 37.0 46.0 50.0 44.0 56.0 36.0 58.0 51.0]可计算得A=X T*XA=X'*XA =1.0e+004 *0.0022 0.0299 0.09170.0299 0.5030 1.34830.0917 1.3483 4.1501因变量YY=[-5.0;-6.8;-4.0;-5.2;-6.4;-6.0;-7.1;-6.1;-5.4 ;7.7;-8.1;-9.3;-9.3;-5.1;-7 .6;-9.6;-7.7;-9.3;-9.5;-5.4;-16.8;-9.9]Y =-5.0000-6.8000-4.0000-5.2000-6.4000-6.0000-7.1000-6.1000-5.40007.7000-8.1000-9.3000-9.3000-5.1000-7.6000-9.6000-7.7000-9.3000-9.5000-5.4000-16.8000-9.9000回归方程系数β B=inv(X'*X)*X'*Y B =-8.0329-0.48910.1864故得回归方程y=-8.0329-0.4891x1-0.1864x22)计算方差的估值^2σ及i^β的方差误差方程 V=XB-YV =-1.79891.3337-1.66492.20333.6507-1.85311.0932-0.7784-0.4571-9.33693.67292.10691.00041.71791.1342-1.1546-2.3089-1.09380.6097-5.21376.47300.6645所以S残=V T*VS=V'*VS =219.5153方差的估值σ2= (V T*V)/(22-3) C=(V'*V)/19C =11.5534β的协因数矩阵 Q=(X T*X)-1Q=inv(X'*X)Q =0.5757 -0.0008 -0.0125-0.0008 0.0015 -0.0005-0.0125 -0.0005 0.0005D(β1)= σ*0.0015=11.5534*0.0015=0.0173D(β2)= σ*0.0005=11.5534*0.0005=0.00063)回归方程显著性检验(F检验)H0:β1=β2=0Y的均值:y=Σyi=-7.6045S回=Σ(yi-y)2=66.9086构成F统计量F= (S回/m)/(S残/(n-m-1))= (66.9086/2)/(88.1209/19)=7.2132取显著性水平α=0.05,查表得F0.05(2,22)=3.44显然,计算值F> F0.05(2,22)=3.44,所以拒绝原假设,认为回归方程效果显著4)回归参数显著性检验(t检验)H01:β1=0 H02:β2=0|t1|=|β1|/σ(q1)1/2=0.02711/(2.1532*(0.00154) 1/2)=3.21|t2|=|β2|/σ(q2)1/2=0.0085/(2.1532*(0.00046) 1/2)=0.18取显著性水平α=0.05,查表得t0.025(19)=2.09显然,t1> t0.025(19), t2< t0.025(19)拒绝H01 ,接受H02,认为回归参数β1显著,β2不显著。
测量平差实训报告1. 实训目的本次实训的目的是通过实际操作,掌握测量平差的基本原理和方法,并能够独立完成一次测量平差任务。
通过实训,我们将对测量平差的概念、基本原理及计算方法有更加深入的理解,提高我们的实际操作能力和解决问题的能力。
2. 实训内容本次实训的内容主要包括以下几个方面:2.1 基本概念首先,我们需要了解一些基本概念。
测量平差是指通过一系列的观测,对测量结果进行处理,消除和减小误差,得到精密可靠的测量结果。
在测量平差中,我们要了解一些常用的概念,例如误差、观测量、测量量等。
2.2 测量方法在实际的测量中,我们需要选用合适的测量方法。
常见的测量方法包括:直接测量法、间接测量法、摄影测量法、GPS测量法等。
通过实操,我们将会学习并掌握这些测量方法的原理和具体操作步骤。
2.3 观测误差处理在测量中,由于各种原因,不可避免地会产生误差。
观测误差处理是指通过数学方法对观测值进行处理,减小误差对测量结果的影响。
在实训中,我们将学习常见的误差处理方法,例如最小二乘法、中误差理论等。
2.4 平差计算平差是指通过观测数据的处理,消除误差和纠正测量结果的过程。
平差计算是测量平差的核心步骤。
在实训中,我们将学习平差计算的原理和方法,例如闭合平差、坐标平差等。
3. 实训过程3.1 实验准备在实训开始前,我们需要对实验进行准备。
首先,我们需要明确实验的目的和内容,熟悉实验器材的使用方法,并确保实验器材的完好性。
其次,我们需要对实验环境进行检查,确保实验环境的安全和整洁。
3.2 实验操作实验操作分为几个步骤进行。
首先,我们需要根据实验要求,选择合适的测量方法,并进行实际观测。
在观测过程中,我们需要注意观测的方法和记录的精度。
然后,我们需要对观测数据进行处理,包括误差处理和平差计算。
最后,我们将得到经过处理的测量结果,并进行分析和讨论。
3.3 实验总结实验结束后,我们将对实验结果进行总结。
我们需要对实验过程中的困难和问题进行分析,并提出解决方案。
《误差理论与测量平差》课程设计实习报告学院:土木工程学院专业:测绘工程14 学号: 20140456052 姓名:杨福权一.实习概况1.1 实习名称:《误差理论与测量平差》课程设计1.2 实习目的:此次实习是对这个学期学习成果的检验。
要求用《误差理论与测量平差》课程中和VB 课程中所学的理论知识来解决实际的问题。
通过本次课程设计对测量平差的两大基本任务有更好的理解,一是处理一系列带有观测误差的观测值求出最或然值;二是对测量成果进行精度评定。
通过所学的VB 语言编制简单的高程(水准网)的间接平差计算程序,进一步掌握间接平差和随机模型的建立。
1.3 实习要求1.通过所学的VB语言进行简单的水准网间接平差软件编制;2.通过EXCEL 程序设计,编写平面控制网(边角网、测边网、测角网)平差程序;3.手工或程序实现控制边角网的严密平差及精度评定。
二.水准网平差程序设计1.这个实习要求利用所学过的任何一种编程语言,编写高程网间接平差的平差程序,并以文件格式存储平差结果。
这个过程相对学习当中练习的小软件来说是要复杂很多的,而且里面需要使用的控件以及好多方法在VB 课程中并没有学习过,这是一个比较困难的实习。
2.该程序的第一步就是输入文本类型的已知数据。
由于该方法vb课程里面没有学习过,想了很久也没有办法,最后从网上找到了使用commonDialog 控件可以打开外部菜单的方法,解决了输入数据的问题。
第二步,观测数据信息的提取,通过判断语句将输入的已知数据进行分类,并将其赋值给相应的数组,用于后面的计算。
第三步,间接平差是一个需要大量矩阵运算的过程,接下来必不可少的一个步骤就是对所有需要运用的矩阵算法过程或者函数进行编写,包括矩阵的加减乘、线性方程的求解、矩阵转置、逆矩阵以及高斯约化过程的编辑。
第四步是根据间接平差的计算过程进行未知点近似高程的计算、误差方程的求解和未知参数以及观测值改正数的求解。
3.程序界面的设计是开始编程的第二个步骤。
测量平差实习报告专业:班级:组号:姓名:学号:目录高程控制网平差报告 (1)导线控制网平差报告 (2)Matlab编程源代码及截图 (4)技术总结 (7)个人实习小结…………………………………………控制网平差报告[控制网概况]计算软件: 南方平差易2005网名: 开学实习计算日期:观测人:记录人:计算者:检查者:测量单位:备注:平面控制网等级:图根测量, 验前单位权中误差:15.00(s)已知坐标点个数: 4未知坐标点个数: 7未知边数: 8最大点位误差[C5005] = 0.0764 (m)最小点位误差[C5007] = 0.0316 (m)平均点位误差= 0.0572 (m)最大点间误差= 0.0589(m)最大边长比例误差= 2636平面网验后单位权中误差= 51.16 (s)往返测距单位权中误差= 0.000 (m)[边长统计]总边长: 848.338(m),平均边长: 106.042(m),最小边长: 63.141(m),最大边长: 188.486(m)[闭合差统计报告]序号:<1>:附合导线路径: [GP02-GP01-C5001-C5002-C5003-C5004-C5005-C5006-C5007-GP14-GP13]角度闭合差=168.46(s),限差=±180.00(s)fx=0.232(m),fy=0.115(m),fd=0.258(m)总边长[s]=848.338(m),全长相对闭合差k=1/3281,平均边长=106.042(m)点名X(m) Y(m) H(m) 备注C5006 552903.5588 901665.7897C5007 552844.4360 901486.8082Matlab编程源代码:A=[1 1 -1 0;0 1 0 -1];P=[2 0 0 0;0 1 0 0;0 0 2 0;0 0 0 1.5];W=[0 ;-4];Naa=A*inv(P)*A';K=-inv(Naa)*W;V=inv(P)*A'*K运行结果截图:个人实习小结通过本次误差理论与测量平差的课程实习和设计, 我获得了很多收获, 对测量平差有了深刻的认识。
《测量理论与测量平差基础》课程实习报告目录一、目的和要求 (1)(一)、目的 (1)(二)要求及上交的资料 (1)二、控制网概况 (2)三、测量数据的整理与检验 (3)(一)、光电测距导线的主要技术要求: (3)1、测距中误差计算: (3)2、测角中误差的计算: (4)(二)、水准测量的主要技术要求: (4)四、测量数据的整理与检验 (5)(一)、水准测量数据的整理与检验 (5)(二)、导线测量数据的整理与检验 (8)五、条件平差 (11)(一)、条件平差的公式汇编 (11)(二)、水准网条件平差 (12)六、间接平差 (16)(一)、间接平差公式汇编 (16)(二)、水准网间接平差 (16)(三)、导线网间接平差 (22)七、误差椭圆 (26)八、技术总结 (27)(一)、水准网的技术总结 (27)(二)、平面控制测量技术总结 (27)(三)、测量平差技术总结 (28)九、个人实习小结 (28)《测量理论与测量平差基础》课程实习报告一、目的和要求(一)、目的通过控制测量外业工作采集的数据,应用测量平差基础课程中所学的知识对数据进行处理,通过数据处理更好的理解测量平差的两个基本任务:对带有观测误差的观测值,运用概率统计的方法消除它们之间的不符值,求出未知量的最可靠值;对测量成果进行精度评定。
通过平差作业进一步掌握平差的函数模型和随机模型的建立,掌握测量平差最常用的两种基础方法:条件平差和间接平差,并对这两种方法的成果评定精度。
(二)要求及上交的资料1、控制网概况及测量数据的整理和检验;2、列出条件平差和间接平差的函数模型并进行线形化,将线形化后的系数阵和常数向量列表;3、采用条件平差和间接平差的方法求控制点的坐标平差值;4、对控制点的坐标平差值进行精度评定,求出各点的点位中误差;对水准测量求各点高程平差值的高程中误差;5、对平面控制网间接平差法计算的点位,计算并绘制点位误差椭圆;6、技术总结(或技术报告);7、个人实习小结。
误差理论与测量平差基础实验报告(2020—2021学年第 2学期)实验名称:Excel和MATLAB在平差中的应用实验时间:实验地点:指导教师:专业班级:姓名:学号:19410070121西安科技大学测绘学院测绘系(教研室)二〇二一年四月一、实验目的1、通过实验,使我们练习条件方程、误差方程的列立,法方程的组成及解算,精度评定,从而掌握平差的工艺流程,为从事测绘数据处理打下良好的基础。
2、在Excel 和MATLAB 软件实现两个矩阵的相乘、单个矩阵的转置、满秩方阵的求逆运算。
3、掌握EXCEL 和MATLAB 软件运行的规律以及软件的操作方法,熟悉操作软件,为了测绘数据处理做好充分的准备。
二、实验内容EXCEL :1、两个矩阵的相乘;设矩阵⎪⎪⎭⎫⎝⎛=654321A ,⎪⎪⎪⎭⎫⎝⎛=654321B 。
求AB C =(1)输入矩阵A 、B (2)选择存放C 矩阵的区域(3)在菜单栏的“插入”菜单中,选择“函数”命令,弹出“插入函数”选项卡,在其中选择函数MMULT ,“确认”。
(4)左键点“函数参数”对话框的“Array1”输入框右边的红色箭头 (5)选中矩阵A(6)点“函数参数”对话框的输入框右边的红色箭头(7)点“函数参数”对话框的“Array2”输入框右边的红色箭头 (8)选中矩阵B (9)点“函数参数”对话框的输入框右边的红色箭头(10)选择 “确定”(11)按“F2”键 (12)按“Crtl+Shift+Enter ”键至此,得出结果,⎪⎪⎭⎫⎝⎛=64492822C2、单个矩阵的转置;函数名称:TRANSPOSE位置:查找与引用。
步骤:与矩阵相乘步骤基本相同3、满秩方阵的求逆;函数名称:MINVERSE位置:数学与三角函数步骤:与矩阵相乘步骤基本相同4、矩阵行列式的值函数名称:MDETERM位置:数学与三角函数步骤:与矩阵相乘步骤基本相同MATLAB:矩阵的输入方法:矩阵A、B则在MATLAB的命令窗口中可以直接建立。
误差理论与测量平差实习报告院系:滨江学院大气与遥感系专业:测绘工程1班组别:第六组组员:张晴张露王晓双王筱苗子轩王若冰郁潜雷赵金涛朱学伟一、本组组员分工:张晴:负责计算角和边的权、常数项和误差方程及用matlab画误差椭圆、相对误差椭圆张露:负责用matlab解算法方程,计算x,W,Nbb,等王晓双:负责方位角及近似坐标的解算王筱;负责误差椭圆及相对误差椭圆部分的数据处理王若冰:负责解算各边坐标方位角改正数方程的系数苗子轩:负责协助王若冰解算各边坐标方位角改正数方程的系数郁潜雷:负责检核各边坐标方位角改正数方程的系数朱学伟:负责平差值的计算赵金涛:负责检核平差值二、由题可知:方程总数n=17(有17给误差方程=14个角度误差方程+3个边长误差方程),必要观测数t=2*4+6=14,取待定点坐标和测站定向角为参数,即X=[ X1 Y1 X2 Y2 X3 Y3 X4 Y4 Z1 Z2 Z3 Z4 Z5 Z6]1、计算待定点近似坐标已知待定点⑤(121088.500,259894.000)⑥(127990.100,255874.600)已知坐标反算出5-6的方位角149°47′2.57″,再根据已知坐标计算方位角。
得出的方位角:6-4 83°19′33.57″4-3 130°55′58.4″4-2 45°42′21.07″2-1 153°17′24.6″1-3 254°7′35.97″3-5 221°57′32.3″根据计算出的方位角和已知的距离编程计算坐标。
求得待定点①(126770.431,267090.88)②(131745.427,264587.648)③(128699.422,262341.328)④(128636.815,261401.484)2、计算各边坐标方位角改正数方程的系数由公式:a=206264.8sin(α)/(s*1000)b=-206264.8cos(α)/(s*1000)得:a12=-0.0167,b12=-0.0331a21=0.0166,b21=0.0331a13=-0.0387,b13=0.0110a24=-0.0332,b24=0.0324a31=0.0387,b31=0.0110a34=-0.1656,b34=-0.1435a35=-0.0172,b35=0.0192a42=0.0332,b42=-0.0324a43=0.1656,b43=0.1435a46=-0.0368,b46=0.0043a53=0.0172,b53=-0.0192a54=0.0266,b54=-0.0031a56=-0.0130,b56=-0.0223a64=0.0368,b64=-0.0043a65=0.0130,b65=0.02233、确定角和边的权设Ó0=1.4″,Óβ=1.4秒角度观测值的权:P(βi)=Ó0²/Óβ²=1 边长观测值的权:P(Si)=Ó0²/ÓSi=0.0196 4、计算常数项和边长误差方程边长误差方程的常数项l边长误差方程:V1=-0.698x4-0.716y4+0.698x2-0.716y2-l1V2=0.893x2-0.449y2-0.893x1+0.449y1-l2V3=0.116x4+0.993y4-l35、法方程的组成和解算B=[0 0 0 0 0 0 0 0 - 1 0 0 0 0 0;-2.1 -2.335 0 0 0 0 0 0 -1 0 0 0 0 0;0 0 -3.682 -0.431 0 0 0 0 0 -1 0 0 0 0;0 0 0 0 0 0 0 0 0 -1 0 0 0 0;-2.1 -2.335 0 0 0 0 0 0 0 0 -1 0 0 0;-3.969 3.442 3.969 -3.442 0 0 0 0 0 0 -1 0 0 0;6.802 1.934 0 0 -6.802 -1.934 0 0 0 0 -1 0 0 0;0 0 3.317 3.236 0 0 - 3.317 3.236 0 0 0 -1 0 0;3.969 3.442 3.969 -3.442 0 0 0 0 0 0 0 -1 0 0;0 0 -3.682 -0.431 0 0 0 0 0 0 0 -1 0 0;0 0 0 0 -1.665 3.308 1.665 3.308 0 0 0 0 -1 0;6.802 1.934 0 0 -6.802 -1.934 0 0 0 0 0 0 -1 0;0 0 3.317 3.236 0 0 -3.317 -3.236 0 0 0 0 0 -1;0 0 0 0 -1.665 3.308 1.665 -3.308 0 0 0 0 0 -1;0 0 -0.698 -0.716 0.698 0.716 0 0 0 0 0 0 0 0;0 0 0.116 0.993 0 0 0 0 0 0 0 0 0 0;0 0 0 0 -0.873 0.449 0.893 -0.449 0 0 0 0 0 0; ]l =0.0300-0.0400-0.05000.02000.0200对角矩阵p:>> p=diag([1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.0196 0.0196 0.0196])利用公式编写代码依次求出Nbb、W、X、V的值Nbb=B'*p*BW=B'*p*lX=inv(Nbb)*WV=B*X-lNbb =Columns 1 through 100.0192 -0.0076 -0.0162 0.0068 -0.0030 0 0 0 0.0554 0.0166-0.0076 0.0064 0.0068 -0.0061 0.0009 0 0 0 0.0221 0.0331-0.0162 0.0068 0.0279 0.0009 0 0-0.0118 -0.0076 -0.0167 0.01720.0068 -0.0061 0.0009 0.0183 0 0-0.0076 -0.0121 -0.0331 -0.0655-0.0030 0.0009 0 0 0.0584 0.0469-0.0548 -0.0475 -0.0387 00 0 0 0 0.0469 0.0422-0.0475 -0.0412 -0.0110 00 0 -0.0118 -0.0076 -0.0548 -0.04750.0696 0.0571 0 -0.03320 0 -0.0076 -0.0121 -0.0475 -0.04120.0571 0.0727 0 0.03240.0554 0.0221 -0.0167 -0.0331 -0.0387 -0.0110 0 0 2.0000 00.0166 0.0331 0.0172 -0.0655 0 0-0.0332 0.0324 0 2.00000.0387 -0.0110 0 0 0.1441 0.1353-0.1656 -0.1435 0 00 0 0.0332 -0.0324 0.1656 0.1435-0.1620 -0.1154 0 00 0 0 0 0.0172 -0.0192 0 0 0 00 0 0 0 0 00.0368 -0.0043 0 0Columns 11 through 140.0387 0 0 0-0.0110 0 0 00 0.0332 0 00 -0.0324 0 00.1441 0.1656 0.0172 00.1353 0.1435 -0.0192 0-0.1656 -0.1620 0 0.0368-0.1435 -0.1154 0 -0.0043W =0.0010-0.00140.0022-0.0006-0.0049-0.00330.00090.00460.01000.0100X =0.5926-0.58330.5224-0.68140.0840-0.3307-0.1893-0.0009-0.0121-0.0252-0.0094-0.0089-0.00390.00355、平差值的计算X1=x1+x1’=126770.794 Y1=y1+y1’=267088.8352 X2=x2+x2’=131746.345 Y2=y2+y2’=264586.6764 X3=x3+x3’=128699.7644 Y3=y3+y3’=262340.8997X4=x4+x4’=128636.7463Y4=y4+y4’=261401.4837二.精度评定:V =-0.02230.02230.0205-0.0205-0.01310.01150.00160.0132-0.0091-0.0042-0.00390.00390.0035-0.00350.0095-0.0186-0.0228三、误差椭圆单位权方差公式求得单位权中误差Ó0=0.0288根据Q矩阵可知Q x1x1=4.5809,Q x1y1=0.7506,Q y1x1=0.7506,Q y1y1= 0.8005,Q x4x4=1.0327,Q x4y4=-0.1124,Q y4x4=-0.1124,Q y4y4=0.0632(1)根据位差极值公式可求得K1=3.8542,K4=0.9952,E1=0.0619,E4=0.0294,F1=0.0273,F4=0.0065,Q EE1=(Q XX+Q YY+K)/2=0.8986根据tanΨE=(Q EE-Q XX)/Q XY可求得:tanΨE,进而求得ΨE1=2.8°或182.8°同理可得E4=173.45°或353.45°通过matlab编程得相对误差椭圆,代码如下:function varargout =untitled_OutputFcn(Xcenter,Ycenter,LongAxis,ShortAxis,Angle)Xcenter=126770.794Ycenter=267088.8352;LongAxis=0.0619;ShortAxis=0.0273;Angle=2.8;t1=0:.02:pi;t2=pi:.02:2*pi;z1=exp(1i*t1);z2=exp(1i*t2);z1=(LongAxis*real(z1)+1i*ShortAxis*imag(z1))*exp(1i*(-Angle));z2=(LongAxis*real(z2)+1i*ShortAxis*imag(z2))*exp(1i*(-Angle));z1=z1+Xcenter+Ycenter*1i;z2=z2+Xcenter+Ycenter*1i;plot(z1,'r');hold onplot(z2,'r')hold offgrid onvarargout{1} = handles.output;1号点误差椭圆如下图:同理得4号点误差椭圆如下图四、相对误差椭圆(1点和4点)X14=(X1+X4)/2=127703.7702Y14=(Y4+Y5)/2=264245.1595Δx14=x1-x4Δy14=y1-y4由协因数阵可以得到Q x4x1=1.8268, Qx1x1=4.5809,Q y4y1=0.0238, Qy1y1=0.8005,Q x1y4=-0.2118, Qx4y4=-0.1124,Q x4y1=0.1023, Qx4x4=1.0327,Q y4y4=0.0632, Qx1y1=0.7506,QΔxΔx=Q x1x1+Q x4x4-2Q x4x1=1.96QΔyΔy=Q y4y4+Q y1y1-2Q y4y1=0.8161QΔxΔy =Qx4y4+Qx4y1-Qx1y4+Qx1y1=0.7477由上面的公式(1)得到E=0.044F=0.0192tanΨE=(Q EE-Q XX)/Q XY=0.494进而求得ΨE=26.3°或206.3°通过matlab编程得相对误差椭圆,将数据带入误差椭圆的代码得到结果如下图:。
误差理论与测量平差是测量领域中重要的理论基础,课程设计可以帮助学生深入理解相关理论,并通过实际操作加深对知识的理解和掌握。
以下是关于误差理论与测量平差课程设计的一般步骤和内容:
1. 课程设计目标:
-深入理解误差理论的基本概念和原理。
-掌握测量平差的方法和技巧。
-能够运用所学知识解决实际测量中的问题。
2. 课程设计内容:
-误差理论:包括误差类型、误差传播规律、误差分析方法等。
-测量平差:包括最小二乘法、最小二乘平差、参数平差等内容。
-实例分析:选取实际测量数据,进行误差分析和平差处理,让学生能够将理论知识应用到实际情况中。
3. 课程设计步骤:
-确定课程设计题目和内容范围,包括理论学习和实践操作部分。
-提供相关资料和参考书目,引导学生进行文献查阅和理论学习。
-组织实验或案例分析,让学生通过实际操作了解测量平差的过程和方法。
-引导学生进行数据处理和结果分析,培养他们的问题解决能力和实践能力。
-撰写课程设计报告,总结理论学习和实际操作的经验,提出改进建议和思考。
4. 课程设计要点:
-强调理论联系实际,引导学生将所学知识应用到实际测量中。
-注重实践操作,通过实验和案例分析加深学生对知识的理解和掌握。
-鼓励学生团队合作,培养他们的合作意识和团队精神。
-培养学生的问题分析能力和创新思维,在课程设计中注重培养学生的实践能力和创新意识。
通过误差理论与测量平差课程设计,可以帮助学生系统地学习和掌握相关知识,提高他们的实践能力和问题解决能力,为他们未来从事测量工作打下坚实的基础。
城建学院测绘与城市空间信息系课程设计报告设计名称《误差理论与测量平差》课程设计学生学号 061410203学生班级 0614102学生豆婷婷专业测绘工程指导教师梁玉保时间 2012.12.24 至2012.12.282012年 12 月 28 日目录1.课程设计的目的 (3)2.课程设计题目容描述和要求 (3)2.1基本要求: (3)2.2具体设计项目容及要求: (3)2.2.1高程控制网严密平差及精度评定 (3)2.2.2平面控制网(导线网)严密平差及精度评定 (4)3.课程设计报告容 (5)3.1水准网的条件平差 (5)3.1.2平差结果 (7)3.1.3 精度评定 (8)3.1.4模型正确性检验 (9)3.2水准网的间接平差 (9)3.2.2平差结果 (11)3.2.3 精度评定 (12)3.2.4模型正确性检验 (13)3.3导线网的间接平差 (13)3.3.1平差原理 (15)3.3.2平差结果 (20)3.3.3 精度评定 (21)3.3.4误差椭圆 (23)3.3.5模型正确性检验 (26)4. 程序验证 (27)5.总结 (28)6.参考文献 (29)1.课程设计的目的《测量平差》是一门理论与实践并重的课程,测量平差课程设计是测量数据处理理论学习的一个重要实践环节,是在学生学习了专业基础理论课《误差理论与测量平差基础》课程后进行的一门实践课程,其目的是增强我们对测量平差基础理论的理解,牢固掌握测量平差的基本原理和公式,熟悉测量数据处理的基本原理和方法,灵活准确地应用于解决各类数据处理的实际问题。
通过本次课程设计,培养我们运用本课程基本理论知识和技能,分析和解决本课程围的实际工程问题的能力,加深对课程理论的理解与应用。
2.课程设计题目容描述和要求2.1基本要求:测量平差课程设计要求每一个学生必须遵守课程设计的具体项目的要求,独立完成设计容,并上交设计报告。
在学习知识、培养能力的过程中,树立严谨、、勤奋、进取的良好学风。
误差理论与测量平差课程设计报告●课程名称:误差理论与测量平差●课程题目:平差计算器一、实验目的与要求1)实验目的:此次的课程设计可以用任何一种计算机语言来编写,这样给我们每个人很多的选择。
同时这样也是为了练习同学们对于一门语言的掌握和运用,大大的提高了我们的编程能力。
同时,通过对测量数据的误差处理,增强学生对《误差理论与测量平差基础》课程的理解,使学生牢固掌握测量数据处理的基本原理和公式,熟悉测量数据处理的基本技能和计算方法。
要求学生综合运用测绘知识、测量平差知识、数学知识和计算机知识,设计数学模型和程序算法,编制程序实现测量数据的自动化处理。
2)实验要求:要求每位同学独立完成给定测量数据处理的数学模型和算法的设计,编写程序,调测程序,并编写程序设计文档。
要求数学模型和算法正确、程序运行正确、设计文档完备。
二、课程设计主要内容课程设计的主要内容主要有:1.新建一个基于单文档的MFC应用程序。
这只是基本的框架结构,里面包含了几个已知的类,在这些类的基础上,可以增加对象和变量。
然后是增加一个操作矩阵的类 CMatrix 的实现文件,Matrix.cpp和Matrix.h文件是从网上下载的,然后添加工程,创建了一个类,进行矩阵的计算。
通过运算符的重载,可以进行加减乘除计算,还可以进行矩阵的转置和求逆等运算。
现将该程序的Matrix.cpp文件附录如下:// Matrix.cpp#include "StdAfx.h"#include "Matrix.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif// Construction/Destruction// 基本构造函数CMatrix::CMatrix(){m_nNumColumns = 1;m_nNumRows = 1;m_pData = NULL;BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);ASSERT(bSuccess);}// 指定行列构造函数// 参数:// 1. int nRows - 指定的矩阵行数// 2. int nCols - 指定的矩阵列数CMatrix::CMatrix(int nRows, int nCols){m_nNumRows = nRows;m_nNumColumns = nCols;m_pData = NULL;BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);ASSERT(bSuccess);}// 初始化函数// 参数:// 1. int nRows - 指定的矩阵行数// 2. int nCols - 指定的矩阵列数//// 返回值:BOOL 型,初始化是否成功BOOL CMatrix::Init(int nRows, int nCols){if (m_pData){delete[] m_pData;m_pData = NULL;}m_nNumRows = nRows;m_nNumColumns = nCols;int nSize = nCols*nRows;if (nSize < 0)return FALSE;// 分配内存m_pData = new double[nSize];if (m_pData == NULL)return FALSE; // 内存分配失败if (IsBadReadPtr(m_pData, sizeof(double) * nSize)) return FALSE;// 将各元素值置0memset(m_pData, 0, sizeof(double) * nSize);return TRUE;}// 指定值构造函数// 参数:// 1. int nRows - 指定的矩阵行数// 2. int nCols - 指定的矩阵列数// 3. double value[] - 一维数组,长度为nRows*nCols,存储矩阵各元素的值CMatrix::CMatrix(int nRows, int nCols, doublevalue[]){m_nNumRows = nRows;m_nNumColumns = nCols;m_pData = NULL;BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);ASSERT(bSuccess);SetData(value);}// 设置矩阵各元素的值// 参数:// 1. double value[] - 一维数组,长度为m_nNumColumns*m_nNumRows,存储// 矩阵各元素的值// 返回值:无void CMatrix::SetData(double value[]){// empty the memorymemset(m_pData, 0, sizeof(double) *m_nNumColumns*m_nNumRows);// copy datamemcpy(m_pData, value,sizeof(double)*m_nNumColumns*m_nNumRows);}// 方阵构造函数// 参数:// 1. int nSize - 方阵行列数CMatrix::CMatrix(int nSize){m_nNumRows = nSize;m_nNumColumns = nSize;m_pData = NULL;BOOL bSuccess = Init(nSize, nSize);ASSERT (bSuccess);}// 方阵构造函数// 参数:// 1. int nSize - 方阵行列数// 2. double value[] - 一维数组,长度为nRows*nRows,存储方阵各元素的值CMatrix::CMatrix(int nSize, double value[]){m_nNumRows = nSize;m_nNumColumns = nSize;m_pData = NULL;BOOL bSuccess = Init(nSize, nSize);ASSERT (bSuccess);SetData(value);}// 拷贝构造函数// 参数:// 1. const CMatrix& other - 源矩阵CMatrix::CMatrix(const CMatrix& other){m_nNumColumns = other.GetNumColumns();m_nNumRows = other.GetNumRows();m_pData = NULL;BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);ASSERT(bSuccess);// copy the pointermemcpy(m_pData, other.m_pData,sizeof(double)*m_nNumColumns*m_nNumRows);}// 析构函数CMatrix::~CMatrix(){if (m_pData){delete[] m_pData;m_pData = NULL;}}// 将方阵初始化为单位矩阵// 参数:// 1. int nSize - 方阵行列数// 返回值:BOOL 型,初始化是否成功BOOL CMatrix::MakeUnitMatrix(int nSize){if (! Init(nSize, nSize))return FALSE;for (int i=0; i<nSize; ++i)for (int j=0; j<nSize; ++j)if (i == j)SetElement(i, j, 1);return TRUE;}// 将字符串转化为矩阵的值// 参数:// 1. CString s - 数字和分隔符构成的字符串// 2. const CString& sDelim - 数字之间的分隔符,默认为空格// 3. BOOL bLineBreak - 行与行之间是否有回车换行符,默认为真(有换行符)// 当该参数为FALSE时,所有元素值都在一行中输入,字符串的第一个// 数值应为矩阵的行数,第二个数值应为矩阵的列数// 返回值:BOOL 型,转换是否成功BOOL CMatrix::FromString(CString s, const CString& sDelim /*= " "*/, BOOL bLineBreak /*= TRUE*/){if (s.IsEmpty())return FALSE;// 分行处理if (bLineBreak){CTokenizer tk(s, "\r\n");CStringList ListRow;CString sRow;while (tk.Next(sRow)){sRow.TrimLeft();sRow.TrimRight();if (sRow.IsEmpty())break;ListRow.AddTail(sRow);}// 行数m_nNumRows = ListRow.GetCount();sRow = ListRow.GetHead();CTokenizer tkRow(sRow, sDelim);CString sElement;// 列数m_nNumColumns = 0;while (tkRow.Next(sElement)){m_nNumColumns++;}// 初始化矩阵if (! Init(m_nNumRows, m_nNumColumns))return FALSE;// 设置值POSITION pos = ListRow.GetHeadPosition();for (int i=0; i<m_nNumRows; i++){sRow = ListRow.GetNext(pos);int j = 0;CTokenizer tkRow(sRow, sDelim);while (tkRow.Next(sElement)){sElement.TrimLeft();sElement.TrimRight();double v = atof(sElement);SetElement(i, j++, v);}}return TRUE;}// 不分行(单行)处理CTokenizer tk(s, sDelim);CString sElement;// 行数tk.Next(sElement);sElement.TrimLeft();sElement.TrimRight();m_nNumRows = atoi(sElement);// 列数tk.Next(sElement);sElement.TrimLeft();sElement.TrimRight();m_nNumColumns = atoi(sElement);// 初始化矩阵if (! Init(m_nNumRows, m_nNumColumns))return FALSE;// 设置值int i = 0, j = 0;while (tk.Next(sElement)){sElement.TrimLeft();sElement.TrimRight();double v = atof(sElement);SetElement(i, j++, v);if (j == m_nNumColumns){j = 0;i++;if (i == m_nNumRows)break;}}return TRUE;}// 将矩阵各元素的值转化为字符串//// 参数:// 1. const CString& sDelim - 数字之间的分隔符,默认为空格// 2 BOOL bLineBreak - 行与行之间是否有回车换行符,默认为真(有换行符)//// 返回值:CString 型,转换得到的字符串CString CMatrix::ToString(const CString& sDelim /*= " "*/, BOOL bLineBreak /*= TRUE*/) const{CString s="";for (int i=0; i<m_nNumRows; ++i){for (int j=0; j<m_nNumColumns; ++j){CString ss;ss.Format("%f", GetElement(i, j));s += ss;if (bLineBreak){if (j != m_nNumColumns-1)s += sDelim;}else{if (i != m_nNumRows-1 || j !=m_nNumColumns-1)s += sDelim;}}if (bLineBreak)if (i != m_nNumRows-1)s += "\r\n";}return s;}// 将矩阵指定行中各元素的值转化为字符串// 参数:// 1. int nRow - 指定的矩阵行,nRow = 0表示第一行// 2. const CString& sDelim - 数字之间的分隔符,默认为空格// 返回值:CString 型,转换得到的字符串CString CMatrix::RowToString(int nRow, const CString& sDelim /*= " "*/) const{CString s = "";if (nRow >= m_nNumRows)return s;for (int j=0; j<m_nNumColumns; ++j){CString ss;ss.Format("%f", GetElement(nRow, j));s += ss;if (j != m_nNumColumns-1)s += sDelim;}return s;}// 将矩阵指定列中各元素的值转化为字符串// 参数:// 1. int nCol - 指定的矩阵行,nCol = 0表示第一列// 2. const CString& sDelim - 数字之间的分隔符,默认为空格// 返回值:CString 型,转换得到的字符串CString CMatrix::ColToString(int nCol, const CString& sDelim /*= " "*/) const{CString s = "";if (nCol >= m_nNumColumns)return s;for (int i=0; i<m_nNumRows; ++i){CString ss;ss.Format("%f", GetElement(i, nCol));s += ss;if (i != m_nNumRows-1)s += sDelim;}return s;}// 设置指定元素的值// 参数:// 1. int nRows - 指定的矩阵行数// 2. int nCols - 指定的矩阵列数// 3. double value - 指定元素的值// 返回值:BOOL 型,说明设置是否成功BOOL CMatrix::SetElement(int nRow, int nCol, double value){if (nCol < 0 || nCol >= m_nNumColumns || nRow < 0|| nRow >= m_nNumRows)return FALSE; // array bounds errorif (m_pData == NULL)return FALSE; // bad pointer errorm_pData[nCol + nRow * m_nNumColumns] = value;return TRUE;}// 设置指定元素的值// 参数:// 1. int nRows - 指定的矩阵行数// 2. int nCols - 指定的矩阵列数// 返回值:double 型,指定元素的值double CMatrix::GetElement(int nRow, int nCol) const {ASSERT(nCol >= 0 && nCol < m_nNumColumns && nRow >= 0 && nRow < m_nNumRows); // array bounds errorASSERT(m_pData); // bad pointer errorreturn m_pData[nCol + nRow * m_nNumColumns] ;}// 获取矩阵的列数// 参数:无// 返回值:int 型,矩阵的列数int CMatrix::GetNumColumns() const{return m_nNumColumns;}// 获取矩阵的行数// 参数:无// 返回值:int 型,矩阵的行数int CMatrix::GetNumRows() const{return m_nNumRows;}// 获取矩阵的数据// 参数:无// 返回值:double型指针,指向矩阵各元素的数据缓冲区double* CMatrix::GetData() const{return m_pData;}// 获取指定行的向量// 参数:// 1. int nRows - 指定的矩阵行数// 2. double* pVector - 指向向量中各元素的缓冲区// 返回值:int 型,向量中元素的个数,即矩阵的列数int CMatrix::GetRowVector(int nRow, double* pVector) const{if (pVector == NULL)delete pVector;pVector = new double[m_nNumColumns];ASSERT(pVector != NULL);for (int j=0; j<m_nNumColumns; ++j)pVector[j] = GetElement(nRow, j);return m_nNumColumns;}// 获取指定列的向量// 参数:// 1. int nCols - 指定的矩阵列数// 2. double* pVector - 指向向量中各元素的缓冲区// 返回值:int 型,向量中元素的个数,即矩阵的行数int CMatrix::GetColVector(int nCol, double* pVector) const{if (pVector == NULL)delete pVector;pVector = new double[m_nNumRows];ASSERT(pVector != NULL);for (int i=0; i<m_nNumRows; ++i)pVector[i] = GetElement(i, nCol);return m_nNumRows;}// 重载运算符=,给矩阵赋值// 参数:// 1. const CMatrix& other - 用于给矩阵赋值的源矩阵// 返回值:CMatrix型的引用,所引用的矩阵与other相等CMatrix& CMatrix::operator=(const CMatrix& other){if (&other != this){BOOL bSuccess = Init(other.GetNumRows(), other.GetNumColumns());ASSERT(bSuccess);// copy the pointermemcpy(m_pData, other.m_pData,sizeof(double)*m_nNumColumns*m_nNumRows);}// finally return a reference to ourselvesreturn *this ;}// 重载运算符==,判断矩阵是否相等// 参数:// 1. const CMatrix& other - 用于比较的矩阵// 返回值:BOOL 型,两个矩阵相等则为TRUE,否则为FALSE BOOL CMatrix::operator==(const CMatrix& other) const {// 首先检查行列数是否相等if (m_nNumColumns != other.GetNumColumns() ||m_nNumRows != other.GetNumRows())return FALSE;for (int i=0; i<m_nNumRows; ++i){for (int j=0; j<m_nNumColumns; ++j){if (GetElement(i, j) != other.GetElement(i, j))return FALSE;}}return TRUE;}// 重载运算符!=,判断矩阵是否不相等// 参数:// 1. const CMatrix& other - 用于比较的矩阵// 返回值:BOOL 型,两个不矩阵相等则为TRUE,否则为FALSEBOOL CMatrix::operator!=(const CMatrix& other) const {return !(*this == other);}// 重载运算符+,实现矩阵的加法// 参数:// 1. const CMatrix& other - 与指定矩阵相加的矩阵// 返回值:CMatrix型,指定矩阵与other相加之和CMatrix CMatrix::operator+(const CMatrix& other) const{// 首先检查行列数是否相等ASSERT (m_nNumColumns == other.GetNumColumns() && m_nNumRows == other.GetNumRows());// 构造结果矩阵CMatrix result(*this) ; // 拷贝构造// 矩阵加法for (int i = 0 ; i < m_nNumRows ; ++i){for (int j = 0 ; j < m_nNumColumns; ++j)result.SetElement(i, j,result.GetElement(i, j) + other.GetElement(i, j)) ;}return result ;}// 重载运算符-,实现矩阵的减法// 参数:// 1. const CMatrix& other - 与指定矩阵相减的矩阵// 返回值:CMatrix型,指定矩阵与other相减之差CMatrix CMatrix::operator-(const CMatrix& other) const{// 首先检查行列数是否相等ASSERT (m_nNumColumns == other.GetNumColumns() && m_nNumRows == other.GetNumRows());// 构造目标矩阵CMatrix result(*this) ; // copy ourselves// 进行减法操作for (int i = 0 ; i < m_nNumRows ; ++i){for (int j = 0 ; j < m_nNumColumns; ++j)result.SetElement(i, j,result.GetElement(i, j) - other.GetElement(i, j)) ;}return result ;}// 重载运算符*,实现矩阵的数乘// 参数:// 1. double value - 与指定矩阵相乘的实数// 返回值:CMatrix型,指定矩阵与value相乘之积CMatrix CMatrix::operator*(double value) const{// 构造目标矩阵CMatrix result(*this) ; // copy ourselves// 进行数乘for (int i = 0 ; i < m_nNumRows ; ++i){for (int j = 0 ; j < m_nNumColumns; ++j)result.SetElement(i, j,result.GetElement(i, j) * value) ;}return result ;}// 重载运算符*,实现矩阵的乘法// 参数:// 1. const CMatrix& other - 与指定矩阵相乘的矩阵// 返回值:CMatrix型,指定矩阵与other相乘之积CMatrix CMatrix::operator*(const CMatrix& other) const{// 首先检查行列数是否符合要求ASSERT (m_nNumColumns == other.GetNumRows());// construct the object we are going to returnCMatrix result(m_nNumRows,other.GetNumColumns()) ;// 矩阵乘法,即// [A][B][C] [G][H] [A*G + B*I + C*K][A*H + B*J + C*L]// [D][E][F] * [I][J] = [D*G + E*I + F*K][D*H + E*J + F*L]// [K][L]double value ;for (int i = 0 ; i < result.GetNumRows() ; ++i){for (int j = 0 ; j < other.GetNumColumns() ; ++j){value = 0.0 ;for (int k = 0 ; k < m_nNumColumns ; ++k){value += GetElement(i, k) *other.GetElement(k, j) ;}result.SetElement(i, j, value) ;}}return result ;}// 矩阵的转置// 参数:无// 返回值:CMatrix型,指定矩阵转置矩阵CMatrix CMatrix::Transpose() const{// 构造目标矩阵CMatrix Trans(m_nNumColumns, m_nNumRows);// 转置各元素for (int i = 0 ; i < m_nNumRows ; ++i){for (int j = 0 ; j < m_nNumColumns ; ++j)Trans.SetElement(j, i, GetElement(i, j)) ;}return Trans;}// 实矩阵求逆的全选主元高斯-约当法// 参数:无// 返回值:BOOL型,求逆是否成功BOOL CMatrix::InvertGaussJordan(){int *pnRow, *pnCol,i,j,k,l,u,v;double d = 0, p = 0;// 分配内存pnRow = new int[m_nNumColumns];pnCol = new int[m_nNumColumns];if (pnRow == NULL || pnCol == NULL)return FALSE;// 消元for (k=0; k<=m_nNumColumns-1; k++){d=0.0;for (i=k; i<=m_nNumColumns-1; i++){for (j=k; j<=m_nNumColumns-1; j++){l=i*m_nNumColumns+j;p=fabs(m_pData[l]);if (p>d){d=p;pnRow[k]=i;pnCol[k]=j;}}}// 失败if (d == 0.0){delete[] pnRow;delete[] pnCol;return FALSE;}if (pnRow[k] != k){for (j=0; j<=m_nNumColumns-1; j++){u=k*m_nNumColumns+j;v=pnRow[k]*m_nNumColumns+j;p=m_pData[u];m_pData[u]=m_pData[v];m_pData[v]=p;}}if (pnCol[k] != k){for (i=0; i<=m_nNumColumns-1; i++){u=i*m_nNumColumns+k;v=i*m_nNumColumns+pnCol[k];p=m_pData[u];m_pData[u]=m_pData[v];m_pData[v]=p;}}l=k*m_nNumColumns+k;m_pData[l]=1.0/m_pData[l];for (j=0; j<=m_nNumColumns-1; j++) {if (j != k){u=k*m_nNumColumns+j;m_pData[u]=m_pData[u]*m_pData[l];}}for (i=0; i<=m_nNumColumns-1; i++) {if (i!=k){for (j=0; j<=m_nNumColumns-1; j++){if (j!=k){u=i*m_nNumColumns+j;m_pData[u]=m_pData[u]-m_pData[i*m_nNumColumns+k]*m_ pData[k*m_nNumColumns+j];}}}}for (i=0; i<=m_nNumColumns-1; i++){if (i!=k){u=i*m_nNumColumns+k;m_pData[u]=-m_pData[u]*m_pData[l];}}}// 调整恢复行列次序for (k=m_nNumColumns-1; k>=0; k--){if (pnCol[k]!=k){for (j=0; j<=m_nNumColumns-1; j++) {u=k*m_nNumColumns+j;v=pnCol[k]*m_nNumColumns+j;p=m_pData[u];m_pData[u]=m_pData[v];m_pData[v]=p;}}if (pnRow[k]!=k){for (i=0; i<=m_nNumColumns-1; i++) {u=i*m_nNumColumns+k;v=i*m_nNumColumns+pnRow[k];p=m_pData[u];m_pData[u]=m_pData[v];m_pData[v]=p;}}}// 清理内存delete[] pnRow;delete[] pnCol;// 成功返回return TRUE;}// 对称正定矩阵的求逆//// 参数:无//// 返回值:BOOL型,求逆是否成功BOOL CMatrix::InvertSsgj(){int i, j ,k, m;double w, g, *pTmp;// 临时内存pTmp = new double[m_nNumColumns];// 逐列处理for (k=0; k<=m_nNumColumns-1; k++){w=m_pData[0];if (w == 0.0){delete[] pTmp;return FALSE;}m=m_nNumColumns-k-1;for (i=1; i<=m_nNumColumns-1; i++) {g=m_pData[i*m_nNumColumns];pTmp[i]=g/w;if (i<=m)pTmp[i]=-pTmp[i];for (j=1; j<=i; j++)m_pData[(i-1)*m_nNumColumns+j-1]=m_pData[i*m_nNumColumns+j]+g*pTmp[j];}m_pData[m_nNumColumns*m_nNumColumns-1]=1.0/w;for (i=1; i<=m_nNumColumns-1; i++)m_pData[(m_nNumColumns-1)*m_nNumColumns+i-1]=pTmp[i ];}// 行列调整for (i=0; i<=m_nNumColumns-2; i++)for (j=i+1; j<=m_nNumColumns-1; j++)m_pData[i*m_nNumColumns+j]=m_pData[j*m_nNumColumns+ i];// 临时内存清理delete[] pTmp;return TRUE;}2.创建五个新的对话框。