为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 基于MATLAB的测量平差数据处理

基于MATLAB的测量平差数据处理

2017-10-21 49页 doc 89KB 102阅读

用户头像

is_105949

暂无简介

举报
基于MATLAB的测量平差数据处理基于MATLAB的测量平差数据处理 内蒙古科技大学毕业设计 绪论 摘 要 MATLAB是目前在研究机构广泛应用的一种数值计算及图形工具软件, 它的特点是语法结构简明、数值计算高效、图形功能完备,特别适合非专 业编程员完成数值计算、科学试验处理等任务。以往的测量数据处理方法 需要编制特定的处理矩阵运算程序,而且程度复杂,难度大。 本文介绍一种基于MATLAB的水准网和测边网的程序设计方法,与其 它算法语言相比,具有编程简单,运算速度快的特点。文中分别阐述了水 准网和测边网程序的理论基础、实现步骤和运行结果。通过实例的分析...
基于MATLAB的测量平差数据处理
基于MATLAB的测量平差数据处理 内蒙古科技大学毕业设计 绪论 摘 要 MATLAB是目前在研究机构广泛应用的一种数值计算及图形工具软件, 它的特点是语法结构简明、数值计算高效、图形功能完备,特别适合非专 业编程员完成数值计算、科学试验处理等任务。以往的测量数据处理 需要编制特定的处理矩阵运算程序,而且程度复杂,难度大。 本文介绍一种基于MATLAB的水准网和测边网的程序设计方法,与其 它算法语言相比,具有编程简单,运算速度快的特点。文中分别阐述了水 准网和测边网程序的理论基础、实现步骤和运行结果。通过实例的分析, 总结出利用MATLAB对测量数据处理有很大的应用价值,它缩短了编程的 时间,提高工作效率。 关键词:MATLAB;平差; 程序设计 内蒙古科技大学毕业设计 绪论 ABSTRACT MATLAB is one species of numerical-values calculation and graphic tools software which is widely used to apply at research institutions at present. The particularities are: concise grammar-structure、highly efficient in numerical values calculating、complete function of graphs、especially it is adapted to evildoing professional programmer to accomplish the tasks that are numerical-values calculating and scientific experiments treating. The ancient methods of measured data-processing need establishing special proceedings of treating matrices operation, moreover, it is complex and greatly difficult. This article introduces one programming method dealing with leveling and measuring edge network based on MATLAB. Compared with other algorithm language, it has particularities which are simply programming and quickly operating. The article separately expatiate the theories basics、realizing steps and running results at leveling and measuring edge network. With the analysis of examples, it has prodigious application value in measured data-processing by use of MATLAB. Moreover, it shortens programming time and improves working effectiveness. Key words:MATLAB; programming 内蒙古科技大学毕业设计 绪论 绪论 作为一名测量技术人员,如果不掌握一门PC机编程语言与便携计算 工具,要想提高测量工作的效率几乎寸步难行。测量需求的多样性与复杂 性,造就了测量计算鲜明的个性化特点,这就是在商业测量计算软件高度 发达的今天,掌握一种实用的程序语言进行编程计算仍有广泛的市场需求 的重要原因。 当今较流行的计算机程序语言基本上都是基于Windows的,例如 Turbo Pascal,Visual Basic,Visual C,Borland C++等,这些程序语言的优势是基于对象及可利用Windows丰富的系统资源,应用它们可以开发出界面非常丰富和友好的应用程序,其劣势主要有以下几点: 1.Windows程序都非常庞大,学习并熟练掌握它们并非易事。 2.虽然市场上已有的多种专用的测量平差软件都是采用C语言开发的,但这些软件价格都比较贵,而且都带有加密狗,一次只能供一个用户使用。出于商业目的,开发商不会公开程序源代码,这为修改程序功能以适应用户的特殊需求带来了不便。 3.在测量生产中,经常需要根据工程的实际情况进行一些个性化的数值计算工作,这些数值计算工作无固定模式,这就需要求测量技术人员最好能熟练掌握一种适用于数值计算的程序语言,以便提高测量计算的效率。 4.C语言的数值计算语句不够丰富,例如,在测量平差计算中,经常需要进行的矩阵运算,尤其是解法方程的矩阵求逆不能直接使用语句实现,而必须应用计算机算法编程实现。 如果不是基于商业软件开发,只为满足实际测量工作计算需要,则C语言的劣势就变成了MATLAB语言的优势。 内蒙古科技大学毕业设计 MATLAB软件简介 1. MATLAB软件简介 MATLAB是从Matrix(矩阵)和Laboratory(实验室)各取前3个字母组成的,意思是矩阵实验室,是美国MathWorks公司于20世纪80年代中期推出的一种交互式、面向对象的科技应用软件,是一个为科学和工程计算而专门设 计的高级交互式软件包。MATLAB 集成了图示与精确的数值计算,是一个可以完成各种计算和数据可视化的强有力工具,其优秀的数值计算能力和卓越的数据可视化能力使其很快在数学软件中脱颖而出,成为以矩阵运算为主要工作方式的线性代数、概率论和数理统计、自动控制、数字信号处理、动态系统仿真等领域教学和科研工作者的有力武器。随着该软件自身的发展及市场的需求,其功能日趋完善,其最高版本7.0版已经推出,随着版本的不断升级,它的数值计算及符号计算功能得到了进一步完善。 MATLAB是以矩阵作为数据操作的基本单位,矩阵的生成、运算、转置、求逆等非常简单。在MATLAB环境中,不需要对创建的变量对象给出类型说明和维数,所有的变量都作为双精度数来分配内存空间,MATLAB将自动地为每一个变量分配内存。MATLAB语言起源于矩阵运算,并已经发展成为一种高度集成的计算机语言,它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化与界面设计、便捷的与其他程序和语言接口的功能。MATLAB系统主要包含5 部分的内容:MATLAB 工作环境、Mablab 数学库、MATLAB语言体系、句柄图形、MATLAB应用程序接口(API)。MATLAB系统主要功能包括:数值计算功能、符号计算功能、数据分析和可视化、文字处理功能、SIMULINK动态仿真功能。同时,MATLAB又是开放的,除了内部函数之外,所有的MATLAB 主包文件和各工具包文件都是可读可改的源文件,用户可以作为参考掌握其用法,并可对其修改以适应自己的需要,也可加入自己编写的文件构成新的工具包。例如,随着GPS 的广泛应用,Orion Dynamics and Con2t rol Corporation、Constell Inc. GPSSoft LLC、NavsysCorporation等多家公司都相应开发出了适于GPS数据处理的 MATLAB 工具箱。 MATLAB是一个集数值计算、图形管理、程序开发于一体的功能十分强大的系统。将MATLAB应用于测量数据的处理是一件非常有意义的工作。Mo2hamed等曾成功地在MATLAB系统中利用白滤波技术研究动态解算GPS载波相位信号的模糊度问。因为测量数据的处理特别是测量平差主要应用矩阵运算,而MATLAB又特别易于做矩阵运算,因此,研究开发基于MATLAB的测量平差方法具有极好的应用价值。 毕业设计 水准网平差程序 2(MATLAB 在测量平差中的应用 测量平差数据处理主要是基于矩阵的运算,常用的矩阵运算主要是矩阵的生成、转置、求逆和矩阵求广义逆等。在MATLAB环境中,不需要对创建的变量对象给出类型说明和维数,所有的变量都作为MATLAB中的M文件的语法与其他的高级语言类似,是一种程序化的编程语言,同时也是一种解释性的编程语言,即逐行解释运行程序,使程序容易调试,计算更为简捷,而且对于平差原理理解和掌握变得更容易。另外,MATLAB语言与数学语言比较接近,更容易掌握和理解。 2.1测量平差原理的概述 测量平差的函数模型有条件方程和观测方程。以条件方程为函数的模型的最小二乘平差称为条件平差;在条件方程中,根据需要如果还设有一定数量的未知数,则称为附有参数的条件平差;以观测方程为函数模型的最小二乘平差称为间接平差;如果观测方程中的某些参数不独立,则这些 不独立参数必然存在一些条件,称这种平差模型为附有条件的间接平差。本文的两个程序都采用间接平差模型。 对于一个实际平差问题,根据所选参数的个数、选什么量为参数以及参数之间是否函数独立,经过仔细推敲可以发现附有条件的间接平差模型本身就是各种经典平差模型的概括模型,其余的经典平差模型,如条件平差模型、间接平差模型、附有未知数的条件平差模型和附有限制条件的条件平差模型都是它的特例。 间接平差的公式汇集: 间接平差模型为 ?? ? (2,1)TVPV?min??V?BX?l 系数矩阵B满秩,即rank(B)=t 法方程及解为: Nbbx?fe?0,(N?1 bb?BTPB,fe?BTPl) (2-2) x?N?1 bbfe (2-3) 参数的平差值: X?X0?x (2-4) 观测量的平差值:L?L?V (2-5) 单位权的中误差: ?0? 毕业设计 水准网平差程序 (2-6) 平差参数的协方差阵:(2-7) DXX??20N?1 bb Q????20FTN?1bbF 平差函数的协方差阵:(2-8) 2.2平差程序总体方案 MATLAB号称为全球工程师的共同语言,其语法和C语言相似,但它有强大的数值计算和绘图功能,这使之在工程应用方面的计算更出色,本文就基于这种程序设计语言环境设计一个控制网平差程序。该程序包含了一个高程控制网平差程序和测边网平差程序。 本程序适用于各种等级的高程网和测边网,程序在设计过程中,始终考虑数据的储存量。因而本程序不储存误差方程的系数和常数项,对待定点数较多的平差网,组成法方程的系数矩阵是个稀疏矩阵,如待定点的编号恰当,法方程的系数会集中在主元系数的两侧形成带状。为减少法方程系数的储存量,只要按行储存下三角阵或按列储存上三角阵中第一个非零系数起的系数,就是通常叫做维变带宽储存方法。 3. 水准网平差程序 3.1程序的功能 本程序适用于二、三、四等水准网平差计算,平差的水准网可以是独 立的、也可以是附合网,其主要功能是完成水准网的平差计算和精度评定计算。平差计算采用间接平差法,以归心的观测值为高差,以未知点高程为未知参数。精度评定计算包括计算单位权中误差和每个待定点的高程中误差。 毕业设计 水准网平差程序 3.2水准模型网的间接平差 3.2.1 “权”值的确定 当在相同的条件下进行水准测量时,其精度是相同的,因而观测结果的可靠性也是同样的。但如果在不同的条件下进行水准测量时,高程的精度就有所不同,此时称为不等精度观测,所求出的未知量的值、高程的最或是值并对其精度进行评定时,就需要“权”了。 由于观测的不等精度,因而观测值的可靠程度不同,求未知量的最或是值时,这样的一个因素就必须考虑了,这个因素是:可靠性大的某观测值,其精度高,对测量的最后结果的影响也就越大。此时用“权”值来表示观测值的可靠程度,那么,“权”值愈大,观测值的可靠程度就愈高。另外,在观测过程中,观测值的中误差愈小,观测结果愈可靠,它的“权”值就愈大。因而,根据中误差来确定“权”值是非常适当的。设以Pi 表示观测值Li 的“权”,m 为中误差,则“权”值的定义为: (3-1) 式中:A 为任意的正常数,在一组观测值中为一个定数。 在实际测量中,通常是观测值的中误差事先并不知道,因而必须先确定 观测值的“权”,然后才能求出未知量的最或是值。此时可以利用距离(S)或测站数(N)来确定观测值———高程的“权”。 根据偶然误差传播定律,各观测点高程Hi的中误差mi由测站数Ni确定时,则有 : mi?(3-2) 式中:m 为一组观测值的中误差,为一个定数. 由(3-2-1)、(3-2-2)两式可得: (3-3) 同样可得出: 式中:C为定数,si为测距. (3-4) 由(3-3)、(3-4)两式可以得出这样一个结论:当测站观测高差等精度时,观测总高差的“权”与测站数或距离成反比。 3.2.2 水准路线的平差计算 毕业设计 水准网平差程序 1(附合路线的平差计算 假定在图1 示的A 、B 两水准点之间布设一条水准路线,A 、B 两水准点的高程为已知,分别设为HA、HB 、n1、n2?、C为中间水准点。假定观测了所有的点的高程,现拟求C点的高程HC的最或是值。 HC可由水准路线A ?C、B ?C分别观测的高差ΔhAC、ΔhBC计算 得出,由此而得到的观测高程分别设为Hc1、Hc2,其值为: Hc1=HA+ΔhAC;Hc2=HB+ΔhBC 当Hc1、Hc2在不等精度条件下观测得出时,它们的“权”也不同,分别设为Pc1、 Pc2,这样C点的高程HC的最或是值为: Hc? Pc1Hc1?Pc2Hc2 (3-5) Pc1?Pc2 根据A 点的高程HA,A ?C水准路线观测的高差ΔhAC以及B ?C水准路线观测的高差ΔhBC,可推算出B点的观测高程HB为: H?B=HA+ΔhAC-ΔhBC 水准路线A ?B 的高程闭合差为: fh=H?B-HB=Hc1?Hc2 (3-6) 由(3-6)式得到: Hc2=Hc1-fh 由(3-3)式得到:Pc1? CC (NAC、NBC分别表示水准路线A?C、BP?c2 NAC、NBC ?C 的测站数,水准路线A?B的测站数NAB?NAC?NBC) 将上述表达式代入(3-2-5)式中,得到: (3-7) 如果以水准路线A?C的距离SBC、B ?C的距离SBC、A?B的距离 SAB (SAB?SAC?SBC)来确定高程观测值的“权”值时,同样可以得到: 毕业设计 水准网平差程序 (3-8) 图3-1 水准路线图 2(闭合路线的平差计算 闭合路线的平差计算原理与附合路线相同,因而(3-7)、(3-8)两式的结论适用于闭合路线的平差计算。 (3) 具有一个结点的水准网的平差计算 如图2所示为具有一个结点的水准网,B,C,D,?为已知高程水准点,B?A,C?A,D ?A,?为水准路线,则接点A的高程最或是值为: PA1HA1?PA2HA2?PA3HA3? PA1?PA2?PA3? HA? ? ?P i?1 ni?1 n Ai HAi (3-9) Ai ?P 式中HA1,HA2,HA3 分别为水准路线B?A,C?A,D?A,?计算A的观测高程,各高 程相应的“权”值为PA1,P A2,PA3 设HA1,HA2,HA3 δA2,δA3,?,则有: 的算术平均值为H0A,各高程观测值与H0B的差值分别为δA1, 将(3-10)式代入(3-9)式得到: (3-10) (3-11) 毕业设计 水准网平差程序 当以测站数和距离来确定“权”值时,(3-11)分别可以转化为: (3-12) 3.2.3 精度评定 (3-13) 上述结论也可应用于小三角水准网平差计算。 单位权中误差:?0?(3-12) 平差参数的协方差阵:DXX??20N?1 bb (3-13) Q????20FTN?1bbF 平差函数的协方差阵:(3-14) 3.3 水准网间接平差程序信息设计 1(数据文件的组织 下面给出一个水准网输入数据文件的例子: 3 3 6(已知点个数、未知点个数、观测值个数) 101 102 103 104 105 106 (点号) 34.788 35.259 37.825 (已知点高程) 104 101 1.625 4.5(起点点号、终点点号、高差观测值、距离观测值) 101 102 -0.418 3.1 105 102 0.714 3.4 102 103 1.243 3.8 106 103 -0.577 4.3 103 101 -0.786 2.5 (其中编号数组未知点在前,已知点在后) 2(水准网平差变量约定 表3-1 变量约定表 变量名 ed dd sd gd 说明 已知点个数 未知点个数 总点数 观测值个数 毕业设计 水准网 平差程序 pn h0 be en h1 s 点号 已知点高程 起点点号 终点点号 高差观测值 距离观测值 3.4 水准网程序与使用说明 3.4.1 水准网程序流程图 图3-2 水准网流程图 程序的全部代码见附录一。 3.4.2 水准网程序的使用 本程序使用MATLAB的矩阵功能计算法方程,在运行程序前首先要有其始数据。其始数据是一文件的形式保存在磁盘中,文件的格式在上文已经说明过,编好文件后,以后缀名为 .TXT的形式保存。执行时在MATLAB命令窗口直接键入文件名即可。 3.5 案例 如下图水准网,104、105、106为已知点,101、102、103为待定点,已知点的高程分别为34.788,35.259 ,37.825 。 观测高差和观测路线长度分别为: h1=1.652, h2=-0.418 ,h3=0.714 ,h4=1.243, h5=-0.577, h6=-0.786. s1=4.5, s2=3.1, s3=3.4, s4=3.8, s5=4.3, s6=2.5. 毕业设计 水准网平差程序 图3-3 水准网图 首先编数据文件,命名为data1.txt. 数据的格式如下: 3 3 6 101 102 103 104 105 106 34.788 35.259 37.825 104 101 1.652 4.5 101 102 -0.418 3.1 105 102 0.714 3.4 102 103 1.243 3.8 106 103 -0.577 4.3 103 101 -0.786 2.5 进入MATLAB界面,在命令窗口直接输入level3运行程序。弹出如下窗口 图3-4 数据读入文件 选择data1.txt即可运行出如下结果: 毕业设计 水准网平差程序 图3-5 计算结果 在图3-5中,分别输出了高程的平差值及精度。结果是一文本的形式保存,用户可对它进行编辑。 水准网平差程序代码 function level3 [ed,dd,sd,gd,pn,h0,k1,k2,h1,s]=readlevelnetdata; global pathname net_name s_datafile a1_datafile; global ed dd sd pn gd h0 k1 k2 h1 s dh; [dh,h,V,L,uw0,uwh,uw1]=calculatelevelnet(ed,dd,sd,pn,gd,h0,k1,k2,h1,s); writelevelnetdata(pn,k1,k2,h1,V,L,h0,dh,h,uwh,uw0); %输出水准网计算结 果 return function[dh,h,V,L,uw0,uwh,uw1]=calculatelevelnet(ed,dd,sd,pn,h0,be,en,hd,di stance); % 水准平差网 A=sparse(zeros(sd,gd)); %求解系数阵 b=(0:(gd-1)*sd); A(be'+b)=-1; A(en'+b)=1; A=A'; A=A(:,1:dd); l=zeros(gd,1); %求解常数项 l=h0(be)-h0(en)+hd; p=diag(1./distance); %权阵 dh=inv(A'*p*A)*A'*p*1; %高程改正数 h00=h0(dd+1:sd); h0=h0(1:dd); %待定点高程近似值 h=h0+dh; %待定点高程平差值 V=A*dh-1; %高差观测值改正数 L=hd+V; %高差观测值平差值 %精度评定 uw0=sqrt(V'*p*V/(gd-dd)); %单位权中误差 Qxx=inv(A'*p*A); uwh=uw0*sqrt(diag(Qxx)); %待定点高程平差值中误差 uwh(dd+1:ed+dd)=0.0; Qff=A*Qxx*A'; uwh=uw0*sqrt(diag(Qff)); %高差平差值中误差 h=[h;h00]; %所有点高程 h0=[h0;h00]; dh=[dh;zeros(ed,1)]; return function [ed,dd,sd,gd,pn,h0,k1,k2,h1,s]=readlevelnetdata; global pathname net_name s_datafile b_datafile; global ed dd sd pn gd h0 k1 k2 h1 s k11 k12; k1=[];k2=[];h=[];s=[]; if(isempty(pathname)|isempty(net_name)) [filename,pathname]=uigetfile('*.txt','Input filename'); i=find('.'==filename); net_name=filename(1:i-1); end fid1=fopen(strcat(pathname,net_name,s_datafile),'rt'); if(fid1==-1) msgbox('Input File or Path is not correct','Warning','warn'); return; end %open afile to read %open afile to read ed=fscanf(fid1,'%f',1); %已知点个数 dd=fscanf(fid1,'%f',1); %未知点个数 sd=ed+dd; %总点数 gd=fscanf(fid1,'%f',1); %观测点个数 pn=fscanf(fid1,'%f',sd); %点号 %known data h0=fscanf(fid1,'%f',ed); %已知点高程 h0(dd+1:ed+dd)=h0(1:ed) heightdiff=fscanf(fid1,'%f',[4,gd]); heightdiff=heightdiff'; k1=heightdiff(:,1); %起点 k2=heightdiff(:,2); %终点 k11=heightdiff(:,1); %起点 k12=heightdiff(:,2); %终点 h1=heightdiff(:,3); %高 差 s=heightdiff(:,4); %距离 fclose('all'); %点号转换 [k1,k01]=chkdat(sd,pn,k1); [k2,k02]=chkdat(sd,pn,k2); h0(1:dd)=20000.; ie=0; while(1)%计算近似高程 for k=1:gd i=k1(k); j=k2(k); if(h0(i)<le4&h0(j)>le4) h0(j)=h0(i)+h1(k); ie=ie+1; end if(h0(i)>le4&h0(j)<le4) h0(i)=h0(j)-h1(k); ie=ie+1; end end if(ie==dd) break; end end h0=reshape(h0,length(h0),1); return function[n1,k]=chkdat(sd,pn,n1) n=length(n1); k=0; for i=1:n i1=0; for j=1:sd if(n1(i)==pn(j)) i1=1; n1(i)=j; break; end end if(i1==0) % fprintf(fit2,'%5d%5d\n',n1(i)); k=1; end end return 4. 测边网平差程序设计 4.1 数学模型 4.1.1 误差方程和法方程的组成 控制网中的观测值为边长,误差方程非零项最多为4个,所以误差方 程系数矩阵采用压缩格式进行储存。 可采用以下的方法: A(m,n)=>A(m,9) 其中,m为观测值个数,n为未知点个数的两倍。 改进后的A阵格式为 Ai=(编号1,系数1,编号2,系数2,编号4,系数4,常数项) 共9列。即只存储误差方程的4个非零参数系数。 法方程系数阵NA为对称阵,在存储时,只需要存其上三角部分就可以了。其占 用的空间为: sum? 现有A阵: A=(编号1,系数1,编号2,系数2,编号4,系数4,常数项) 其中偶数项为系数,加上最后的A9为常数项,在组成法方程时,从A2开始分别与剩下的偶数项以及常数项相乘,然后再用A4与剩余的项相乘,一直到A8为止,这样就完成了NA?ATPA的过程。需要注意的是:若A1,A3,A5,A7小于零,则表示该点已知点,不参与法方程的组成。 4.1.2 边长观测的权 边长观测的精度一般与其长度有关,定权公式为 n(n?1) 2 ?02 ps?2?si i(i?1,2,,n) 式中?si2为所测边长si的方差,?02为任意选定的单位权方差。 为了定权psi必须已知测边的先验方差?si2,但精确的已知是十分困难的,一般采 用厂方给定的测距仪精度,即 ?si?a?bSi 式中,a为固定误差(单位mm),b为比例误差(单位:ppm),Si为边长(单 位km)。 4.1.3 解算法方程 由于法方程是对称正定阵,因此,可采用改进的平方根法进行解算。 平方根法是对称正定矩阵非常有效的三角分解方法,设A为n阶方阵,如果其所有顺序主子式均不为零,则其存在唯一的分解式: A=LDR ?1? 其中 L =?l2 ???l?n1 ??d1? ?,D=? ???0??1?? ?10? ?? ?,R =??dn???? ? r12 r1n? ?? rn?1,n? ?1?? ln,n?1 由于此住A对称性,得L?RT,又根据A阵正定的性质,可证明D均为 正数。现在设 ?d1 ? D=? ?? ???=?dn?? ?? ? ??12 ??? 12 ??? 即 D?DD 则 A?LDL?LDD?L(为方便,记为 L A?LT T 1 2 12T 12 L)(D 1 2T D)?L LL T 称为Cholesky分解,即正定对称矩阵的平方根分解法。解AX?b等阶于求解两个三角方程组: LY?b和LTX?Y 在用平方根分解法计算时,需要进行n次开方运算。为了避免开方,可以直接采用对称正定的A?LDLT分解式对平方根法进行改进。从而解方程组AX?b可以按如下步骤进行:把A分解成A?LDLT,则AX?b变成(LDLT)X?b,即等价于 ?LY?b ?T ?1 LX?DY? 由此可以解出X和Y。这称为改进的平方根法,在计算中避免了开方运算。 平方根法和改进的平方根法的计算量和存储量比消去法节约近一半,而且不需要选主元,能得到比较精确的数值解。 法方程用改进平方根法解算的过程如下: (1)分解: ?1 S C?STD ?S11 ? 其中 S?? ?? ???1cn1??s12 ??s???11 ?cnn????s1n?s?11 Sn1??S11 ??,D?????Smn?? ? ????S?????????1?? ??? Sm??n ?c11 ? ??c?n1 11 Sn?1 ? ?Smn?? sn?1,nsn?1,n?1 s1j?c1j c2j?ss2j, 11 s12s1j s2j?c2j? s12s1js11 ,j?2s13s1js11 ?s23s2js22 ,j?3 c3j? s13s1js11 ? s23s2js22 ?s3j,s3j?c3j? 纯量计算公式为 i?1?cij ?i?1ss s1j?? kikjc?i?1,j?2?ij?s k?1kk? (2)求逆 R?S?1 ?r11 ? R?? ?? r1n??? rnn?? 由RS=I得 ?r11r12 ? r22 ? ???rn1??s ??rn2?? ?????rnn?? 11 s 1222 s sn?1?1 ??sn?02?? ????snn??0 010 0??0?? ?1? 纯量计算公式: rii? 1sii 12 r11sr12?? s22?(r11s13?r12s23) 通式为 (3)求积 r13?s33r?(r11s1n? ?r1(n?1)s(n?1)n1n? snn rr 22s12 23?? s33r?(r22s24?r23s34) 24?s44r?(r22s2n? ?r2(n?1)s(n?1)n2n? snn ??rii?1 ??s ii ? j?1 ? ???rikskj?rk?1 ?ij,j?i ? sijQ?(STD?1S)?1?S?1D(?S1T )? RTD R?r1rn1????s11 ????r 11 Q?RDTR?? 1 ? ??r??nn??s??n???? n1rr? ?? n ??n?? s11r11s12r12s1nr1n??r??? s22r22 s??11 2nr2n???rnn r?nn????? ? s??nnrnn??r1n rnn r?nn ? n ? ? 4.1.4 精度评定 (1) 坐标改正数以及单位权中误差的计算m0 使用上三角一维数组形式存储坐标改正数的公式为: ?xi???qjiwj??qijwj,i?1, j?1j?1i?1n,n 其中,n=2?dd,xi的单位是cm. 平差值: X?X0?x 写成分量的形式,为 Xi?X0 i??xi 如果近似坐标的误差较大,或网形较大,平差的结果不会精确,这时,就需要进行迭 代平差,直到两次平差间互差在允许值内。 由测量平差理论: ??同样可得到单位权中误差: m0?其中,m-n观测个数减去未知点个数; m?m1?m2?m3,n?2?dd?ST,ST?方向观测的测站数 [PVV]?[pll]?[?x?] (2)点位误差椭圆 误差椭圆表示了网中点或点与点之间的误差分布情况如图。在测量工作中,常用的误差椭圆对布网方案作精度分析。绘制误差椭圆只需要三个数据:椭圆长半轴a,短半轴b和主轴方向φ,其求法为 1?(?x2??y2???2?,1b2?(?x2??y2???2?a2?tan2??2?xy ?x2??y2 图4-1 误差椭圆的表达 顾及方差与权倒数的关系,得 a? 2 ?02 2 (Qxx?Qy?y(Qxx?Qyy? b2? ?0 2 2 ? )??xy?,?)?? tan?2? 2QxyQxx?Qyy 根据上述的理论,我们实际要求的是mxi、myi、mxiyi。只要得到了这些元素,就能依照上面的公式来求得椭圆的元素了。 4.2 测边网平差信息设计 外业测量的数据首先应进行预处理,包括测站平差、归心计算、观测值归化到椭球面的改正、椭球面归化到高斯平面的改正等,然后将预处理后的数据输入到以后缀名为TXT的文本文件中,该数据文件的组织格式如 下所列: 表4-1 数据组织格式 次序 1 2 3 4 5 6 7 8 9 内容 已知点个数ed,未知点个数dd,[控制参数] 点号pn。先输入已知点编号,各点输入顺序无要求 已知点坐标,x0,y0,x1,y1,x2,y2? 测量边的个数m1 边长的固定误差ms,边长的比例误差pp。单位分别是:cm和×0.000001 边长的起始点号e,终点点号d,边长sid。每一条边一行,依次列出 推算近似坐标的路线经过的边数 推算近似坐标的起算已知点坐标(按顺时针) 推算近似坐标的路线经过的边的边号 4.2.1 主要的技术要求 表4-2 测边网的技术要求 等级 二等 三等 四等 一级小三角 二级小三角 平均边长(km) 测距中误差(mm) 测距相对中误差 9 5 2 1 0.5 ?30 ?30 ?16 ?16 ?16 1?30万 1?16万 1?12万 1?6万 1?3万 4(3利用MATLAB的绘图语句绘制网图 1. 网形的绘制 由于网形图与误差椭圆绘制在同一个图形上,因此必须对误差椭圆进行放大,在本文的程序中,使用了inputdlg对话框输入语句,其中,确省的放大倍数为100。在程序中,使用了ed dd pn m1 x y e d sid ai bi fi 等变量,其意义与前面的变量相同。对绘制的网图有效放大和缩小功能,即点击鼠标左键放大图形,点击右键缩小图形,利用MATLAB菜单本身的功能,可以将该图形输出为各种图形文件格式。 2误差椭圆的绘制 无论多么复杂的图形,其基本单元还是点和线。换句话说,只需要利用基本元素的点或线,通过各种组合,也能画出复杂的图形。MATLAB中没有提供直接绘制椭圆的命令,因此可以直接利用连线来画椭圆。 测量中描述误差椭圆用长半轴A,短半轴B和方位角FI三个量。在如图4-1的x′Oy′中直角坐标系中,椭圆的方程为 x??y?? 2?2?1 (4-1) AB 如果以角度i为变量,则椭圆的标准参数方程为 x???cos?i ? (4-2)y???sin?i 设在测量坐标系xOy中椭圆长半轴的方位角为?0,则有 ?x??cos?0 ?????y??sin?0 用参数方程代入,得到 ?sin?0??x?? ??? (4-3)cos?0??y?? x?Acos?0cosi?Bsin?0sini?? (4-4) y?Asin?0cosi?Bcos?0sini? 测量坐标系与MATLAB或AUTOCAD绘制的数学坐标系的x,y坐标轴不同,绘图时,需要调换x,y坐标。 在上式中,i取不同的值,就有一组(x,y),只需要将这些点连接起来,就可以绘出一个椭圆。 图4-2 误差椭圆的参数方程 4.4 测边网程序和使用说明 使用本程序的全部数据都按的格式编辑成数据文件储存在磁盘上。数据文件的编辑取决于平差网型和观测值的编号,为此,先绘制平差网的略图,在图上标明各项数据的信息。以下就测边网的点号,边编号,输入数据,输出成果,运行程序等问题作简明说明。 1 点号和观测边的编号 已知点和待定点的编号为pn(取三为数),已知点在前,未知点在后,其顺序无要求。但为了减小法方程系数的带宽,应使相临的待定点编号的差数尽可能小。平差网的编号见图4-3。 2.推算近似坐标的路线 近似坐标的路线是用户在测边网略图上指定出来的。如图4-3的箭头,就是表示推算路线。路线的两个起算点必须为已知点,从两个已知推算出的第一个未知点开始,选择观测边,由观测边和已求得的近似坐标或已知坐标推算出观测边所对的未知点。本程序是按推算的三个点A、B、P顺序为顺时针。 图4-3 测边网略图 2 数据的输入 (1)简单变量 为了在程序运行中数据的传递,定义了一些全局变量,参见4-1表。 (2)数据文件 外业测量的数据首先应进行预处理,包括测站平差、归心计算、观测值归化到椭球面的改正、椭球面归化到高斯平面的改正等,然后将预处理后的数据输入到以后缀名为TXT的文本文件中,该数据文件的组织格式如表4-1。 3 输出成果 本程序的计算成果是以文件的形式输出到文本文件中,用户可以在文本中查看和编辑。 4.5 程序代码说明: 程序的总体框架 图4-4 测边网总体流程图 1(数据读入块 本模块的功能是打开一个*.txt的数据文件,同时生成一个*out.txt的文本文件,记录用户数据和输出成果用。程序调用fscanf函数把文件中的数据赋值给相应的变量,这些变量是后面计算的数据依据。 2(近似坐标的计算 测边网的观测数据是边长,所以在近似坐标的计算时只能用测边交会计算。以及 A、B两点坐标及A、B到P点的距离b、a,c为A、B两点的距离,A、B、P三点按顺时针排列。则P点的坐标计算公式如下: b2?c2?a2 e?,f?2c XP?XA?ecos?AB?fsin?AB??YP?XA?esin?AB?fcos?AB? 计算近似坐标的流程图入图4-5。 图4-5 计算近似坐标流程图 3(误差方程和法方程的形成 程序中,用数组a来存储误差方程的编号和系数,a(i,9)存储常数项,w和c分别存储法方程系数和法方程常数。 4(解算法方程。 函数流程图如图4-6。函数的代码见附录三。 5(精度评定 本模块包括坐标改正数、单位权中误差和误差椭圆的计算。程序中定义了dxy(坐标改正数)、pvv(即存储[PVV]?[pll]?[?x?])、uw0(单位权中误差)等。同时计算出误差椭圆的三个参数长半轴ai,短半轴bi和主轴方向fi。 图4-6 平方根法求逆程序框架图 6(控制网的绘制 程序中调用inputdlg函数来打开一个对话框来输入误差椭圆的参数;用text函数来对点号标注;用ploth函数及控制参数绘制线和误差椭圆。 程序的完全代码见附录二。 4.6 程序的使用算例 有测边网如图4-3所示。网中A、B、C、C点已知,其余为未知点, 现用某测距仪观测了13条边长,测距精度?s?(3mm?1?10?6S)。起算数据和观测数据如下: 表4-3 已知点坐标 53743.136 A 61003.826 C 40049.229 53782.79 表4-4 观测值 编号 1 2 3 4 5 边观测值 5760.706 5187.342 7838.88 5483.158 5731.788 编号 6 7 8 9 10 边观测值 8720.162 5598.57 7494.881 7493.323 5438.382 编号 11 12 13 边观测值 5487.073 8884.587 7228.367 1.编辑数据文本文件如下图 图4-7 数据文件 2.在MATLAB命令窗口键入nnbb执行程序,运行中会弹出一个对话匡提示用户输入误差椭圆的放大比例,默认为100,本例选择500。如下图 图4-8a 对话框 图4-8b 对话框 3.计算出的结果如下: 在图4-9a中,第1、2行分别是已知点和未知的个数;第4行是点的编号;第5至第8行是已知点的坐标;第10行是观测值的个数;第12行是测距的固定误差和比例误差;13至25行是观测边的起点号、终点号和观测边长;27至39行(接到图4-9b)是点号转换为计算机顺序后的观测 边起点号、终点号和观测边长。 接图4-9a,在图4-9b中,第42至49行是推算的近似坐标;第52至 64行是计算的误差方程系数和常数。 在图4-9中,第67至70行是法方程的系数(上三角一维存储);第 73至76行是求逆后的法方程系数;第79至86是坐标改正数和坐标平差 值;第89至92行是误差椭圆的参数;第95行是单位权中误差。 图4-9a 计算结果 图4-9b 计算结果 图4-9c 计算结 4.输出的控制网图和误差椭圆图如下 : 图4-10 控制网图 测边网平差程序代码: global ed dd sd dd1 pn x0 y0 m1 m2 m3 ms pp e d sid md g f aa bb cc rt rr tt ql w global pathname net_name s_datafile b_datafile filename; x0=[];y0=[];e=[];d=[];sid=[];g=[];f=[];pn=[]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%数据的读入 if(isempty(pathname)|isempty(net_name)) [filename,pathname]=uigetfile('*.txt','Input filename'); i=find('.'==filename); net_name=filename(1:i-1); end fit1=fopen(strcat(pathname,filename),'rt'); if(fit1==-1) msgbox('Input File or Path is not correct','Warning','warn'); return; end %open afile to read b_datafile='out.txt' fit2=fopen(strcat(pathname,net_name,b_datafile),'wt'); if(fit1==-1) msgbox('Input File or Path is not correct','Warning','warn'); return; end [a]=fscanf(fit1,'%d',2); ed=a(1);dd=a(2); sd=ed+dd; fprintf(fit2,'%5d\n',ed,dd,dd1); fprintf(fit2,'\n'); [pn]=fscanf(fit1,'%d',sd); pn1=pn; [pn1,i2]=chkdat(sd,pn,pn1); fprintf(fit2,'%5d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n' ,pn); fprintf(fit2,'\n'); [a]=fscanf(fit1,'%f',2*ed); for i=1:ed x0(i)=a(2*i-1); y0(i)=a(2*i); fprintf(fit2,'%15.3f %15.3f\n',x0(i),y0(i)); end fprintf(fit2,'\n'); m1=fscanf(fit1,'%d',1); fprintf(fit2,'%5d\n',m1); isid=0; if(m1>0) fprintf(fit2,'side\n'); [a]=fscanf(fit1,'%f',2); ms=a(1); pp=a(2); fprintf(fit2,'%6.2f %6.2f\n',ms,pp); [a]=fscanf(fit1,'%d %d %f',3*m1); for i=1:m1 e(i)=a(3*i-2);d(i)=a(3*i-1);sid(i)=a(3*i); fprintf(fit2,'%5d %5d %15.3f\n',e(i),d(i),sid(i)); end [e,i1]=chkdat(sd,pn,e); [d,i2]=chkdat(sd,pn,d); i3=0; for i=1:m1; if(e(i)==d(i)) i3=1; fprintf(fit2,'* * %5d %5d %5d * *\n',i,e(i),d(i)); end fprintf(fit2,'%5d %5d %15.3f\n',e(i),d(i),sid(i)); end isid=i1+i2+i3; end idir=0; kk=isid if(kk>0) msgbox('Error by function rddat1','Warning','warn'); return; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%近似坐标计算 xyknow(1:ed)=pn1(1:ed);xyunknow(1:dd)=pn1(ed+1:sd); [aa]=fscanf(fit1,'%d',2); A=aa(1);B=aa(2); mn=fscanf(fit1,'%d',1); [bb]=fscanf(fit1,'%d',mn); m=bb; for i=1:length(m) if i==1 if e(m(i))==A|e(m(i))==B P=d(m(i)); else P=e(m(i)); end else if e(m(i-1))==A|d(m(i-1))==A B=P; else A=P; end if e(m(i))==A|e(m(i))==B P=d(m(i)); else P=e(m(i)); end end for j=1:m1 if (e(j)==P|d(j)==P)&(d(j)==A|e(j)==A) s1=sid(j); end if (e(j)==P|d(j)==P)&(d(j)==B|e(j)==B) s2=sid(j); end end deltx=x0(B)-x0(A); delty=y0(B)-y0(A); alfaAB=alfa(deltx,delty) ; ss=sqrt(deltx*deltx+delty*delty); ee=(s1*s1+ss*ss-s2*s2)/(2*ss);ff=sqrt(s1*s1-ee*ee); x0(P)=x0(A)+ee*cos(alfaAB)-ff*sin(alfaAB); y0(P)=y0(A)+ee*sin(alfaAB)+ff*cos(alfaAB); end fprintf(fit2,'\n'); fprintf(fit2,'计算的近似坐标\n'); for i=1:sd fprintf(fit2,'%15.3f %15.3f \n',x0(i),y0(i)); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% k=1; while(k) lo=2062.648062470964; n=2*dd; sum=n*(n+1)/2.0; sd=ed+dd; a=[]; a(1:m1,1:9)=0.0; c(1:sum)=0.0; w(1:n)=0.0; fprintf(fit2,'误差方程系数和常数项 \n'); for i=1:m1 %边长观测误差方程 dx=x0(d(i))-x0(e(i)); dy=y0(d(i))-y0(e(i)); ss=sqrt(dx*dx+dy*dy); cosa=dx/ss; sina=dy/ss; a(i,1)=2*e(i)-1-2*ed+1.0e-9; a(i,2)=-cosa; a(i,3)=a(i,1)+1; a(i,4)=-sina; a(i,5)=2*d(i)-1-2*ed+1.0e-9; a(i,6)=cosa; a(i,7)=a(i,5)+1; a(i,8)=sina; a(i,9)=10.0*(ss-sid(i)); %ql(i)=(ms^2+(ss*pp*0.0001)^2); ql(i)=((ms+ss*pp*0.001)); ql(i)=100/ql(i)^2; fprintf(fit2,'%15.3f %15.3f %15.3f %15.3f %15.3f %15.3f %15.3f %15.3f % 15.3f \n',a(i,:)); end % fprintf(fit2,'%15.3f \n',ql); for i=1:m1 %形成法方程 for j=1:4 jj=fix(a(i,2*j-1)); if(jj<=0) continue; end w(jj)=w(jj)+a(i,2*j)*a(i,9)*ql(i); di=(jj-1)*(n-jj/2.0); for k=1:4 kk=fix(a(i,2*k-1)); if(kk<=0|jj>kk) continue; end c(di+kk)=c(di+kk)+a(i,2*k)*a(i,2*j)*ql(i); end end end fprintf(fit2,' \n'); fprintf(fit2,'%15.3f \n',w); fprintf(fit2,'法方程系数\n'); fprintf(fit2,'%15.3f %15.3f %15.3f %15.3f %15.3f %15.3f %15.3f %15.3f % 15.3f \n',c) %%%%%%%%%%%%%%坐标改正数和单位权中误差的计算 sd=ed+dd; n=2*dd; k=0; for i=1:n dxy(i)=0.0; di=(i-1)*(n-i/2.0); for j=1:n dj=(j-1)*(n-j/2.0); if(j<i) dxy(i)=dxy(i)-c(dj+i)*w(j); %dxy(i)=dxy(i)-c(di+j)*w(j); else dxy(i)=dxy(i)-c(di+j)*w(j); %dxy(i)=dxy(i)-c(dj+i)*w(j); end end %if(abs(dxy(i))>1.0) %k=1; %end dxy(i)=-dxy(i)/100.0; end %end % while(k11) while(k11) x(1:ed)=x0(1:ed); y(1:ed)=y0(1:ed); for i=1:dd x(ed+i)=x0(ed+i)+dxy(2*i-1); y(ed+i)=y0(ed+i)+dxy(2*i); end x0(1:sd)=x(1:sd); y0(1:sd)=y(1:sd); for i=1:sd if(i<=ed) vx(i)=0.0; vy(i)=0.0; else vx(i)=dxy(2*(i-ed)-1); vy(i)=dxy(2*(i-ed)); end end fprintf(fit2,' 坐标改正数和坐标平差值\n'); fprintf(fit2,' pn vx x vy y\n'); for i=1:sd fprintf(fit2,' %6d %8.4f %14.4f ',pn(i),vx(i),x(i),vy(i),y(i)); end pvv=0.0; for i=1:n pvv=pvv+w(i)*dxy(i)*100.0; end for i=1:m1 pvv=pvv+a(i,9)*a(i,9)/ql(i); end uw0=sqrt(pvv/((m1-n)*1.0e0)); fprintf(fit2,' %14.4f\n',uw0); end % while(k11) while(k11) %%%%%%%%%%%%%%点位误差椭圆的计算 global ai bi fi %fit2=fopen('D:\大牛文档\work\siliout.txt','wt') fprintf(fit2,' 误差椭圆参数\n'); fprintf(fit2,' pn(i) mx my b fi\n'); n=2.0*dd; maxmm=0.0; smm=0.0; for i=1:dd %8.4f mm %14.4f\n a ii=ed+i; di=(2*i-2)*(n-(2*i-1)/2.0); dj=(2*i-1)*(n-i); ql=c(di+2*i-1); q2=c(dj+2*i); q3=c(di+2*i); dl=sqrt(abs(ql+q2-q3)); d11=uw0*dl; xx=ql-q2; yy=2*q3; zz=ql+q2; mx1=sqrt(ql); my1=sqrt(q2); mm1=sqrt(zz); if(abs(xx)<1e-10) fi(i)=sign(90.0,q3); else fi(i)=atan(yy/xx)*57.2958; end if(xx>=0.0&yy>=0.0) fi(i)=fi(i)/2.0; elseif(xx>=0.0&yy<=0.0) fi(i)=(fi(i)+360.0)/2.0; elseif(xx<0.0) fi(i)=(fi(i)+180.0)/2.0; end ww=sqrt(xx*xx+yy*yy); a1=sqrt((zz+ww)/2.0); b1=sqrt((zz-ww)/2.0); ab1=a1-b1; mx=uw0*mx1; my=uw0*my1; mm=uw0*mm1; if(mm>maxmm) i1=ii; end smm=smm+mm; ai(i)=uw0*a1; bi(i)=uw0*b1; ab=ai(i)-bi(i); fprintf(fit2,'%10d %10.3f %10.3f %10.3f %10.3f %10.3f %10. 3f\n',pn(ii),mx,my,mm,ai(i),bi(i),fi(i)); end smm=smm/dd; fprintf(fit2,' 单位权中误差= %9.6f\n',uw0); %fprintf(fit2,' the maximum station error mm= %8.3f(cm) pp= %4d\n',maxmm,pn(i1)); fprintf(fit2,' 平均站误差mm= %8.3f\n',smm); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%绘制控制网图 kk=0; %tile1={'误差椭圆比例'}; %prompt011={'请输入误差椭圆的比例'}; lines=1; d11={'100'}; c12=inputdlg('plese input the scale','scale',lines,d11);%输入误差比例椭圆对话框 scale=str2num(str2mat(c12)); %scale=500; hold off title('控制网网图'); xlabel('Y坐标'); ylabel('X坐标'); plot(y(1:ed),x(1:ed),'k') hold on plot(y((ed+1):end),x((ed+1):end),'k.') for i=1:ed+dd %写点名 text(y(i)+3,x(i)+3,num2str(pn(i))); end for i=1:m1%画边长连线 plot([y(e(i)) y(d(i))],[x(e(i)) x(d(i))],'r'); end for i=1:dd %画误差椭圆 fe(i)=fi(i)*pi/180.; plot(y(i+ed)+(ai(i)*cos(0:0.01:2*pi)*sin(fe(i))+bi(i)*sin(0:0.01:2*pi)*cos(fe(i)))* scale,... x(i+ed)+(ai(i)*cos(0:0.01:2*pi)*cos(fe(i))-bi(i)*sin(0:0.01:2*pi)*sin(fe(i)))*scale, 'r'); end axis equal; zoom on fclose('all'); open(strcat(pathname,net_name,b_datafile)); return %%%%%%%%%%%%%%%%%%%%55%%%%%%%%%%%%%%%%%% function a=alfa(dx,dy)%%%%%计算方位角函数 a11=atan(dy/dx); if (dy>0&dx>0) a=a11; elseif (dx<0) a=pi+a11; else a=2*pi+a11; end 5.Matlab在GPS网中的应用 5.1matlab在gps网中的作用 在GPS网平差数据处理中涉及大量的矩阵运算和方程组解算,尤其是矩阵的求逆和相乘,用高级编程语言在处理这些运算时要编写大量的循环 语句;如果希望通过高级编程语言实现图形绘制和精度分析等,编程工作量就会更大。MATLAB突破了高级编程语言要编写大量循环语句的思想,它只要通过一个或几个简单的命令就可以进行矩阵或数组的运算,可以很好地解决以上问题。MATLAB在数据处理程序中的应用,使得程序简洁,执行效率高。
/
本文档为【基于MATLAB的测量平差数据处理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索