平差课程设计报告.docx
《平差课程设计报告.docx》由会员分享,可在线阅读,更多相关《平差课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
平差课程设计报告
一.设计原始资料
水准网严密平差及精度评定示例。
如图所示水准网,有2个已知点,3个未知点,7个测段。
各已知数据及观测值见下表
(1)已知点高程H1=5.016mH2=6.016m
(2)高差观测值(m)
高差观测值(m)
端点号
高差观测值
测段距离
序号
1-3
1.359
1.1
1
1-4
2.009
1.7
2
2-3
0.363
2.3
3
2-4
1.012
2.7
4
3-4
0.657
2.4
5
3-5
0.238
1.4
6
5-2
-0.595
2.6
7
(3)求各待定点的高程;3-4点的高差中误差;3号点、4号点的高程中误差。
(提示,本网可采用以测段的高差为平差元素,采用间接平差法编写程序计算。
)
二、设计内容及要求
误差理论与测量平差是一门理论与实践并重的课程,其课程设计是测量数据处理理论学习的一个重要的实践环节,它是在我们学习了专业基础课“误差理论与测量平差基础”课程后进行的一门实践课程。
其目的是增强我们对误差理论与测量平差基础理论的理解,牢固掌握测量平差的基本原理和基本公式,熟悉测量数据处理的基本技能和计算方法,灵活准确地应用于解决各类数据处理的实际问题,正确应用条件平差模型列出观测值条件方程、误差方程、法方程和解算法方程,得出平差后的平差值及各待定点的高程平差值,评定各平差值的精度和各高程平差值的精度,并能用所学的计算机理论知识,编制简单的计算程序。
三、水准网间接平差思路
⑴.根据网型确定已知水准点数,未知水准点数u,总点数n,总的观测高差段数hn,必要观测数t,多余观测数r。
⑵.确定参数。
为平差后能直接求得待定点高程平差值,以3个待定点高程平差值为参数。
设3,4,5点的高程平差值分别为
,
,
。
⑶.列立条件方程.
左侧为观测值(系数为1),右侧为参数和常数项,并进一步改化成误差方程,最终写成矩阵形式。
得到系数矩阵A和常数项L
⑷.列立法方程,并解求法方程。
由于该水准网间接平差误差方程个数为7个而未知数个数为10个,所列的误差方程是一组相容方程,有无数组解,所以必须在最小二乘原则(VTPV=min)的基础上利用拉格朗日乘数法求解.令F=VTPV-2KT(V-A
+L),分别对V和
求导,并令其导数为零,得到2VTP-2KT=0,ATK=0,将二式合并即得法方程:
ATPV=ATPA
-ATPL=0。
求出Naa=ATPA,W=ATPL,即得到相应的法方程。
求解法方程,得到
=N-1aaW加上Xi即可得到待定点的高程平差值,将
代入误差方程得到相应的V值,hi+Vi得到各段高差的平差值。
⑸.精度评定。
计算单位权中误差的估值:
评定各待定点的高程中误差:
各待定点的精度即为:
评定高程平差值的精度:
四、平差程序设计思路
1、已知数据的输入
需要输入的数据包括水准网中已知点数、未知点数以及这些点的点号、已知高程和高差观测值、距离观测值等。
本程序采用文件方式进行输入,文件输入的格式如下:
第一行:
已知点个数、未知点个数、观测值个数
第二行:
点号(已知点在前,为支点在后)
第三行:
已知高程(顺序与上一行的点号对应)
第四行起:
高差观测值,按照“起点点号,终点点号,高差观测值,距离观测值”的顺序输入。
本程序使用的数据文件如下:
2,3,7
1,2,X1,X2,X3
5.016,6.016
1,X1,1.359,1.1
1,X2,2.009,1.7
2,X1,0.363,2.3
2,X2,1.012,2.7
X1,X2,0.657,2.4
X1,X3,0.238,1.4
X3,2,-0.595,2.6
2、平差计算过程
(1)近似高程计算。
用一个数组来存储高程近似值,已知点的高程放在这个数组的开头,然后按照点号输入的顺序依次搜索涉及该点的高差观测值,看该高程涉及的另一点是否已知,若已知,则可以计算出当前未知点的高程近似值,并放入高程近似值,以此类推,知道所有点的高程近似值都被求出为止。
(2)列立观测值的误差方程。
根据各观测值的起止点信息及高差、距离值给误差方程的系数矩阵、权矩阵和常数项的各个元素赋值。
(3)平差解算。
调用间接平差通用过程进行平差求解。
3、计算结果的输出
计算的中间结果和最后结果都实时地在文本框中显示,最后还可以把文本框中的内容保存在文本文件中。
4、界面设计
根据以上分析,进行界面设计。
用菜单组织程序,用文本框显示数据的输入、计算和输出情况。
由于涉及到打开和保存文件的操作,所以还需要一个通用对话框。
(!
)菜单设计
标题名称快捷键
标题名称快捷键
文件(&File)mnuFile-
…打开数据mnuOpenCtrl+O
…保存结果mnuSaveCtrl+S
…退出mnuExitCtrl+E
计算(&Calc)mnuCalc-
…近似高程mnuHeight-
…误差方程mnuEqu-
…平差计算mnuAdj-
(2)窗体、文本框和通用对话框。
在窗体上绘制一个文本框控件和一个通用对话框控件,其属性设置如下表:
对象属性值
对象属性值
Text1Text
Text1MultiLineTrue
Text1ScrollBarBoth
Form1Caption水准网间接平差
CommonDialog1NameCDg1
设计好属性后,调整控件和窗体的大小和位置,使之方便美观。
五、程序流程图
六、程序源代码及说明
程序中涉及的公共变量及其说明如下:
DimstrFileNameAsString
Dimnn%,un%,tn%,hn%'已知点个数,未知点个数,总点数,观测值个数
DimPname()AsString'点名数组
DimHknown()AsDouble'已知高程数组,存放已知点高程和高程近似值
Dimbe%(),en%()'观测值的起点和终点编号数组,存储的是点序号
Dimh#(),s#()'高差观测值数组和距离观测值数组
DimA#(),X#(),P#(),L#()'间接平差的系数阵、解向量、权阵和常数向量
1、数据输入
单击“文件→打开文件”命令,弹出打开对话框,待用户选取了文件以后,程序开始读取已知数据,具体代码如下:
'打开文件
PrivateSubmnuOpen_Click()
DimiAsInteger'循环变量
DimstrT1AsString,strT2AsString
CDg1.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"
CDg1.ShowOpen'打开对话框
strFileName=CDg1.FileName'获得选中的文件名和路径
OpenstrFileNameForInputAs#1'打开文件
Input#1,nn,un,hn'读入已知点个数,未知点个数,观测值个数
tn=nn+un
ReDimPname(1Totn),Hknown(1Totn)
ReDimh(1Tohn),s(1Tohn),be(1Tohn),en(1Tohn)
Fori=1Totn'读入点名
Input#1,Pname(i)
Nexti
Fori=1Tonn'读入已知高程
Input#1,Hknown(i)
Nexti
Fori=1Tohn'读入各观测值
Input#1,strT1,strT2,h(i),s(i)
be(i)=Order(strT1):
en(i)=Order(strT2)'给起终点数组排序
Nexti
'显示读入的数据
Text1.Text=Text1.Text&"读入的水准网数据:
"&vbCrLf
Text1.Text=Text1.Text&"已知点"&nn&"个,未知点"&un&"个,观测值"&hn&"个。
"&vbCrLf
Text1.Text=Text1.Text&"网中涉及的点名有:
"
Fori=1Totn
Text1.Text=Text1.Text&Pname(i)&","
Nexti
Text1=Text1&vbCrLf
Text1=Text1&"已知点高程为:
"&vbCrLf
Fori=1Tonn
Text1=Text1&Pname(i)&"的高程为:
"&Hknown(i)&vbCrLf
Nexti
Text=Text1&"各观测值分别为:
"&vbCrLf
Text1=Text1&"起点"&""&"终点"&""&"高差观测值"&"距离观测值"&vbCrLf
Fori=1Tohn
Text1=Text1&Pname(be(i))&""&Pname(en(i))&""&Format(h(i),"0.000")&""&Format(s(i),"0.000")&vbCrLf
Nexti
Close#1'不要忘记关闭文件
EndSub
2点名-序号转换函数
'点名-序号转换函数
PublicFunctionOrder(strAsString)AsInteger
Dimi%
Fori=1Totn
Ifstr=Pname(i)Then
Order=i
ExitFor
EndIf
Nexti
EndFunction
3计算近似高程
'计算近似高程
PrivateSubmnuHeight_Click()
Dimi%,j%
Fori=1Toun
Forj=1Tohn
Ifbe(j)=nn+iAnden(j)Hknown(nn+i)=Hknown(en(j))-h(j)
ExitFor
EndIf
Ifen(j)=nn+iAndbe(j)Hknown(nn+i)=Hknown(be(j))+h(j)
ExitFor
EndIf
Nextj
Nexti
'显示近似高程计算结果
Text1=Text1&"近似高程计算结果:
"&vbCrLf
Fori=1Toun
Text1=Text1&Pname(i+nn)&":
"&Format(Hknown(i+nn),"0.000")&vbCrLf
Nexti
EndSub
4列立误差方程
PrivateSubmnuEqu_Click()
Dimi%,j%
ReDimA(1Tohn,1Toun),L(1Tohn),P(1Tohn,1Tohn)
'对每个观测值列误差方程
Fori=1Tohn
Ifen(i)>nnThenA(i,en(i)-nn)=1'若终点未知,则给终点对应的系数矩阵元素赋值
Ifbe(i)>nnThenA(i,be(i)-nn)=-1'若起点未知,则给起点对应的系数矩阵元素赋值
L(i)=-(Hknown(en(i))-Hknown(be(i))-h(i))'根据起终点计算常数项
P(i,i)=1/s(i)'以距离的倒数为权
Nexti
'显示误差方程
Text1=Text1&"列立的误差方程:
"&vbCrLf
Fori=1Tohn
Forj=1Toun
Text1=Text1&A(i,j)&""
Nextj
Text1=Text1&""&Format(L(i),"0.0000")&vbCrLf
Nexti
Text1=Text1&"权矩阵:
"&vbCrLf
Fori=1Tohn
Forj=1Tohn
Text1=Text1&P(i,j)&""
Nextj
Text1=Text1&vbCrLf
Nexti
EndSub
5平差计算
'平差计算
PrivateSubmnuAdj_Click()
Dimi%,j%
ReDimX(1Toun)
InAdjustA,P,L,X'调用间接平差的通用过程求解
'计算并显示高程平差结果
Text1=Text1&"平差计算结果:
"&vbCrLf
Text1=Text1&"点号初始高程(m)高程改正数(m)平差后高程(m)"&vbCrLf
Fori=1Toun
Text1=Text1&Pname(nn+i)&""&Format(Hknown(nn+i),"0.0000")
Hknown(nn+i)=Hknown(nn+i)+X(i)
Text1=Text1&""&Format(X(i),"0.0000")&""&Format(Hknown(nn+i),"0.0000")&vbCrLf
Nexti
Text1=Text1&vbCrLf
EndSub
6平差计算中需要的模板
'矩阵转置的通用过程
PublicSubMatrixTrans(A,c)
Dimi%,j%
DimR1%,C1%
OnErrorResumeNext
C1=UBound(A,2)-LBound(A,2)+1
IfErrThen
MsgBox"输入的矩阵维数不对!
"
ExitSub
EndIf
R1=UBound(A,1)-LBound(A,1)+1
ReDimc(1ToC1,1ToR1)
Fori=1ToR1
Forj=1ToC1
c(j,i)=A(i,j)
Nextj
Nexti
EndSub
'矩阵相加的通用过程
PublicSubMatrixPlus(A,b,c)
Dimi%,j%
DimR1%,C1%,R2%,C2%
OnErrorResumeNext
C1=UBound(A,2)-LBound(A,2)+1
IfErrThen
MsgBox"第一个矩阵维数不对!
"
ExitSub
EndIf
OnErrorResumeNext
C2=UBound(b,2)-LBound(b,2)+1
IfErrThen
MsgBox"第二个矩阵维数不对!
"
ExitSub
EndIf
R1=UBound(A,1)-LBound(A,1)+1
R2=UBound(b,1)-LBound(b,1)+1
IfR1<>R2OrC1<>C2Then
MsgBox"输入的两个矩阵维数不等,不能相加!
"
ExitSub
EndIf
ReDimc(1Tom,1Ton)AsDouble
Fori=1Tom
Forj=1Ton
c(i,j)=A(i,j)+b(i,j)
Nextj
Nexti
EndSub
'矩阵相减的通用过程
PublicSubMatrixMinus(A,b,c)
Dimi%,j%
DimR1%,C1%,R2%,C2%
OnErrorResumeNext
C1=UBound(A,2)-LBound(A,2)+1
IfErrThen
MsgBox"第一个矩阵维数不对!
"
ExitSub
EndIf
OnErrorResumeNext
C2=UBound(b,2)-LBound(b,2)+1
IfErrThen
MsgBox"第二个矩阵维数不对!
"
ExitSub
EndIf
R1=UBound(A,1)-LBound(A,1)+1
R2=UBound(b,1)-LBound(b,1)+1
IfR1<>R2OrC1<>C2Then
MsgBox"输入的两个矩阵维数不等,不能相减!
"
ExitSub
EndIf
ReDimc(1Tom,1Ton)AsDouble
Fori=1Tom
Forj=1Ton
c(i,j)=A(i,j)-b(i,j)
Nextj
Nexti
EndSub
'矩阵相乘:
输入矩阵或数Qa、Qb,自动识别它们的维数,并输出它们的乘积Qn
PublicSubMatrix_Multy(Qn,Qa,Qb)
Dimia%,ib%,ic%
Dimai%,bi%,ci%
Dime1AsBoolean,e2AsBoolean,e3AsBoolean,e4AsBoolean,e5AsBoolean,e6AsBoolean,e7AsBoolean
OnErrorResumeNext'看Qa是不是一维数组
ic=UBound(Qa,2)-LBound(Qa,2)
IfErrThene1=True
OnErrorResumeNext'看Qa是不是一维数组
ib=UBound(Qb,2)-LBound(Qb,2)
IfErrThene2=True
Ife1=FalseAnde2=FalseThen'二维矩阵相乘
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qb,2)ToUBound(Qb,2)
Forci=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai,bi)=Qn(ai,bi)+Qa(ai,ci)*Qb(ci,bi)
Nextci
Nextbi
Nextai
ElseIfe1=TrueAnde2=FalseThen
OnErrorResumeNext
ia=UBound(Qa)-LBound(Qa)
IfErrThene6=True
Ife6Then'数乘以二维矩阵
Forai=LBound(Qb,1)ToUBound(Qb,1)
Forbi=LBound(Qb,2)ToUBound(Qb,2)
Qn(ai,bi)=Qa*Qb(ai,bi)
Nextbi
Nextai
Else'一维矩阵乘以二维矩阵
Forci=LBound(Qb,2)ToUBound(Qb,2)
Forai=LBound(Qa,1)ToUBound(Qa,1)
Qn(ci)=Qn(ci)+Qa(ai)*Qb(ai,ci)
Nextai
Nextci
EndIf
ElseIfe1=FalseAnde2=TrueThen
OnErrorResumeNext
ic=UBound(Qb)-LBound(Qb)
IfErrThene7=True
Ife7Then'二维矩阵乘以数
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai,bi)=Qa(ai,bi)*Qb
Nextbi
Nextai
Else'二维矩阵乘以一维矩阵
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(ai)=Qn(ai)+Qa(ai,bi)*Qb(bi)
Nextbi
Nextai
EndIf
Else
DimerrTAsInteger
OnErrorResumeNext'结果是否是一个数
errT=UBound(Qn)
IfErrThene3=True
Ife3Then'一维矩阵乘以一维矩阵得一个数
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn=Qn+Qa(ai)*Qb(bi)
Nextbi
Nextai
ExitSub
EndIf
OnErrorResumeNext'是否是数乘一维矩阵
ia=UBound(Qa)-LBound(Qa)
IfErrThene4=True
Ife4Then
Forbi=LBound(Qa,2)ToUBound(Qa,2)
Qn(bi)=Qa*Qb(bi)
Nextbi
ExitSub
EndIf
OnErrorResumeNext'是否是一维矩阵乘数
ib=UBound(Qb)-LBound(Qb)
IfErrThene5=True
Ife5Then
Forai=LBound(Qa,1)ToUBound(Qa,1)
Qn(ai)=Qa(ai)*Qb
Nextai
ExitSub
EndIf
'一维矩阵相乘结果是二维矩阵
Forai=LBound(Qa,1)ToUBound(Qa,1)
Forbi=LBound(Qa,2)ToUBound(Qa,