误差理论与测量平差课程设计报告.docx
《误差理论与测量平差课程设计报告.docx》由会员分享,可在线阅读,更多相关《误差理论与测量平差课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
误差理论与测量平差课程设计报告
一.设计原始资料
水准网严密平差及精度评定示例。
如图所示水准网,有2个已知点,3个未知点,7个测段。
各已知数据及观测值见下表
(1)
(2)高差观测值(m)
高差观测值(m)
端点号
高差观测值
测段距离
序号
1-3
1
1-4
2
2-3
3
2-4
4
3-4
5
3-5
6
5-2
-0.595
7
(3)求各待定点的高程;3-4点的高差中误差;3号点、4号点的高程中误差。
(提示,本网可采用以测段的高差为平差元素,采用间接平差法编写程序计算。
)
二.设计内容及要求
正确应用平差模型列出观测值条件方程、误差方程、法方程和解算法方程,得出平差后的平差值及各待定点的高程平差值,评定各平差值的精度和各高程平差值的精度。
三.水准网间接平差思路
⑴.根据网型确定已知水准点数nn,未知水准点数un,总点数tn,总的观测高差段数hn,必要观测数,多余观测数。
⑵.确定参数。
为平差后能直接求得待定点高程平差值,以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加上Xi0即可得到待定点的高程平差值,将
代入误差方程得到相应的V值,hi+Vi得到各段高差的平差值。
⑸.精度评定。
计算单位权中误差的估值:
评定各待定点的高程中误差:
各待定点的精度即为:
评定高程平差值的精度:
步骤
1)误差方程的列立。
在该水准网中,总观测数n=7,必要观测数t=3,多余观测数r=n-t=7-3=4
3、4和5点高程平差值为参数分别为:
X1、X2、X3,相应的近似值取为:
按图示列出观测方程,化为误差方程如下:
代入
写成矩阵形式为:
2)组成法方程并结算法方程。
以1km水准测量的观测高差为单位权观测值,各观测值相互独立,权阵为一主对角阵,由定权得权阵为:
则法方程为:
其中,
由B,P,,L求出:
解得:
3)计算V和
(1)将代入
得:
(2)由得:
(3)由得:
(m)
4)精度评定。
(1)计算单位权中误差的估值。
(2)计算3号点、4号点的高程中误差。
得
(2)计算3号点4号点的高差中误差。
3至4间高差平差值的权函数式为
五.平差程序设计思路
1、数据文件的编辑。
在文本文档输入数据,包括水准网中已知点数、未知点数以及这些点的点号、已知高程和高差观测值、距离观测值等。
约定文件输入的格式如下:
第一行:
已知点个数、未知点个数、观测值个数
第二行:
点号(已知点在前,未知点在后)
第三行:
已知高程(顺序与上一行的点号对应)
第四行:
高差观测值,按“起点点号、终点点号、高差观测值、距离观测值”的顺序输入。
本算例数据文件如下:
2,3,7
1,2,3,4,5
0
2、界面设计
用菜单组织程序,用文本框显示数据的输入、计算和输出情况。
菜单设计。
本程序的菜单结构如下图所示:
标题
名称
快捷键
文件(&File)
mnuFile
……打开数据
mnuOpen
Ctrl+O
……保存结果
mnuSave
Ctrl+S
…………-
Aa
……退出
mnuQuit
Ctrl+Q
计算(&Calc)
mnuCalc
Ctrl+C
……近似高程
mnuHight
Ctrl+H
……误差方程
mnuEqu
Ctrl+E
……平差计算
mnuAdj
Ctrl+A
……精度评定
mnuEva
窗体、文本框和通用对话框。
在主窗体上绘制1个文本框控件和一个通用对话框控件,工具箱中若无通用对话框则需在工程→部件中找到MicrosoftCommonDialogControl6.0,选中确定,调出通用对话框控件。
如下图。
按下表设置各控件的相关属性.
对象
属性
值
Text1
Name
txtShow
Text1
Text
Text1
MultiLine
True
Text1
ScrollBars
3-Both
Form1
Caption
水准网间接平差
CommonDialog!
Name
CDg1
界面设计如下图:
3、代码设计
(1)。
公共变量声明。
DimstrFileNameAsString
Dimnn%,un%,tn%,hn%'已知点个数,未知点个数,总点数,观测值个数的定义
DimPname()AsString'点名数组
DimHknown()AsDouble'已知高程数组,存放已知点高程和高程近似值
Dimbe%(),en%()'观测值的起点和终点编号数组,储存的是点的序号
Dimh#(),s#()'高差观测值数组和距离观测值数组
DimA#(),X#(),P#(),L#()'间接平差的系数阵,解向量,权阵,常数向量
(2)。
间接平差通用过程代码设计。
间接平差的通用过程代码在标准模块2中设计,将标准模块加载到过程中,即可在平差计算时直接调用该过程。
间接平差通用过程代码设计主要包括以下几步:
*,定义矩阵转置子过程MatrixTrans(A#(),AT#())。
其中A#()中存放原始矩阵,AT#()中存放其转置矩阵。
*,定义矩阵相乘子过程MatrixMulty(a#(),b#(),c#())。
其中a#(),b#()为原始矩阵,c#()存放二矩阵相乘所得到的结果。
*,定义矩阵求逆子过程MatInv(a#()).用Gauss-Jordan法求矩阵a#()的逆矩阵,若a#()是奇异阵,则提示相关信息,并终止程序运行,若a#()不是奇异阵,则a#()中的数据被改写,实矩阵a#()中存放其逆矩阵的计算结果。
*,调用以上子过程实现间接平差通用过程InAdjust(A#(),P#(),L#(),X#())的编辑。
SubInAdjust(A#(),P#(),L#(),X#())
Dima1%,a2%,p1%,p2%,l1%,x1%
DimAt#(),Atp#(),Naa#(),Na#(),W#()'令Na为Naa的逆矩阵
a1=UBound(A,1)-LBound(A,1)+1:
a2=UBound(A,2)-LBound(A,2)+1
l1=UBound(L)-LBound(L)+1:
x1=UBound(X)-LBound(X)+1
p1=UBound(P,1)-LBound(P,1)+1:
p2=UBound(P,2)-LBound(P,2)+1
ReDimAt(1Toa2,1Toa1),Atp(1Toa2,1Toa1),Naa(1Toa2,1Toa2),W(1Toa2)
MatrixTransA,At'调用子过程求出系数矩阵的转置矩阵
MatrixMultyAt,P,Atp'调用子过程求出Atp
MatrixMultyAtp,A,Naa'调用子过程求出Naa
MatrixMultyAtp,L,W'调用子过程求出W
matInvNaa'Naa若可逆Naa中的数据被改写,实矩阵Naa中存放Naa逆的结果
Na=Naa
MatrixMultyNa,W,X
EndSub
(3)、已知数据的输入。
单击“文件→打开文件”命令,在mnuOpen_Click()事件中编写代码,并通过给通用对话框设置相应的代码实现打开过程,弹出打开对话框。
其中CDg1.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"用来指定在通用对话框中列出的文件类型。
,待用户选取了文件以后,程序开始读取已知数据。
再对文本框设置相关代码,通过循环过程实现数据的显示,打开过程和显示结果如下图:
⑷、近似高程的计算。
输入数据后,点击“计算→近似高程”在mnuHeight_Click()事件中编写代码。
用一个数组来存储高程近似值,已知点的高程放在这个数组的开头,然后按照点号输入顺序依次搜索涉及该点的高差观测值,看该高差涉及的另一点是否已知,若未知,则将检查下一个高差观测值。
若已知,则可以计算出当前未知点的高差近似值,并放入高程近似值数组,以此类推,直到所有未知点的高程近似值都被求出为止。
最后通过文本框显示出来。
显示结果如下图所示:
⑸、列立观测值的误差方程。
点击“计算→误差方程”在mnuEqu_click()事件中编写代码,程序根据输入的各观测值的起止点信息及高差、距离值,根据高差方向,由于每个高差由相应参数表示时,参数前的系数不是1就是-1,所以用循环内嵌If语句可以得出误差方程的系数矩阵A()如下:
Fori=1Tohn
Ifen(i)>nnThenA(i,en(i)-nn)=1'若终点未知,则给终点对应的系数赋值
Ifbe(i)>nnThenA(i,be(i)-nn)=-1'若起点未知,则给起点对应的系数赋值
Nexti
并根据Pi=C/Si定权,令C=1km,得权矩阵P(),并根据从J→K段,L=H(K)-H(J)-h(i)得到常数项L(),并将结果显示在文本框中。
显示结果如下图:
⑹、平差解算。
点击“计算→平差计算”命令,调用间接平差通用过程实现间接平差计算。
并求出高程平差值,并显示在文本框中。
⑺、精度评定。
点击“计算→精度评定”命令,在mnuEva_Click()中编写代码,求出高程中误差,并显示在文本框中。
⑻、保存和退出。
*、文件的保存
点击“文件→保存结果”命令,在mnuSave_Click()事件中编码,将文本框中结果保存在指定的文件中。
并设置CDg1.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"使其以文本文件的形式保存。
*、文件的退出
点击“文件→退出”命令,在mnuQuit_Click()事件中编码,退出整个程序。
五、平差程序流程图
六、程序源代码及其说明
'公共变量的声明
DimstrFileNameAsString
Dimnn%,un%,tn%,hn%'已知点个数,未知点个数,总点数,观测值个数的定义
DimPname()AsString'点名数组
DimHknown()AsDouble'已知高程数组,存放已知点高程和高程近似值
Dimbe%(),en%()'观测值的起点和终点编号数组,储存的是点的序号
Dimh#(),s#()'高差观测值数组和距离观测值数组
DimA#(),X#(),P#(),L#()'间接平差的系数阵,解向量,权阵,常数向量
标准模块1
'点名序号转换函数
PublicFunctionOrder(strAsString)
Dimi%
Fori=1Totn
Ifstr=Pname(i)Then
Order=i
ExitFor
EndIf
Nexti
EndFunction
标准模块2
'实现矩阵的转置
SubMatrixTrans(A()AsDouble,At()AsDouble)
Dimm%,n%,i%,j%
m=UBound(A,1)'提取A矩阵的行上标
n=UBound(A,2)'提取A矩阵的列上标
Fori=1Tom
Forj=1Ton
At(j,i)=A(i,j)'求转置矩阵
Nextj
Nexti
EndSub
'实现矩阵相乘
SubMatrixMulty(A#(),b#(),c#())
Dimm%,y%,n%,g%,i%,j%,k%
m=UBound(A,1)'提取A矩阵的行上标
y=UBound(A,2)'提取A矩阵的列上标
n=UBound(b,1)'提取B矩阵的行上标
g=UBound(b,2)'提取B矩阵的列上标
ReDimA(i,k)
ReDimb(k,j)
Ify<>nThen
MsgBox"这两个矩阵不能相乘"
EndIf
Ify=nThen
Fori=1Tom
Forj=1Tog
Fork=1Toy
c(i,j)=A(i,k)*b(k,j)'用循环实现矩阵相乘
Nextk
Nextj
Nexti
EndIf
EndSub
'实现矩阵的求逆
SubmatInv(A()AsDouble)
Dimn%,k%,i%,j%,m#,d#
Dimii%(),jj%()
n=UBound(A,1)
ReDimii(n),jj(n)
Fork=1Ton
d=0!
Fori=kTon
Forj=kTon
m=Abs(A(i,j))
Ifm>dThen
d=m:
ii(k)=i:
jj(k)=k'记下主对角线右下角子阵绝对值最大元素的行号i列号j
EndIf
Nextj
Nexti
If(d+1!
)=1!
Then
MsgBox"矩阵不能求逆!
",vbCritical,"出错"'奇异阵不可逆
ExitSub
EndIf
Ifii(k)<>kThen'将最大元素通过行交换,列交换交换到主元素的位置即主对角线上
Forj=1Ton
m=A(k,j):
A(k,j)=A(ii(k),j):
A(ii(k),j)=m'行交换
Nextj
EndIf
Ifjj(k)<>kThen
Fori=1Ton
m=A(i,k):
A(i,k)=A(i,jj(k)):
A(i,jj(k))=m'列交换
Nexti
EndIf
A(k,k)=1!
/A(k,k)'将1/a(k,k)赋值给a(k,k)
Forj=1Ton
Ifj<>kThenA(k,j)=A(k,k)*A(k,j)'当j<>k时将a(k,k)*a(k,j)赋值给a(k,j)
Nextj
Fori=1Ton
Ifi<>kThen
Forj=1Ton
Ifj<>kThen
A(i,j)=A(i,j)-A(i,k)*A(k,j)'当j<>k时将(a(i,j)-a(i,k)*a(k,j))赋值给a(i,j)
EndIf
Nextj
EndIf
Nexti
Fori=1Ton
Ifi<>kThenA(i,k)=A(i,k)*A(k,k)'当i<>k时将(a(i,k)*a(k,k))赋值给a(i,k)
Nexti
Nextk
Fork=nTo1Step-1
Ifjj(k)<>kThen
Forj=1Ton
m=A(k,j):
A(k,j)=A(jj(k),j):
A(jj(k),j)=m
Nextj
EndIf
Ifii(k)<>kThen
Fori=1Ton
m=A(i,k):
A(i,k)=A(i,ii(k)):
A(ii(k),j)=m
Nexti
EndIf
Ifii(k)<>kThen
Fori=1Ton
m=A(i,k):
A(i,k)=A(i,ii(k)):
A(i,ii(k))=m
Nexti
EndIf
Nextk
EndSub
'实现间接平差的通用过程
SubInAdjust(A#(),P#(),L#(),X#())
Dima1%,a2%,p1%,p2%,l1%,x1%
DimAt#(),Atp#(),Naa#(),Na#(),W#()'令Na为Naa的逆矩阵
a1=UBound(A,1)-LBound(A,1)+1:
a2=UBound(A,2)-LBound(A,2)+1
l1=UBound(L)-LBound(L)+1:
x1=UBound(X)-LBound(X)+1
p1=UBound(P,1)-LBound(P,1)+1:
p2=UBound(P,2)-LBound(P,2)+1
ReDimAt(1Toa2,1Toa1),Atp(1Toa2,1Toa1),Naa(1Toa2,1Toa2),W(1Toa2)
MatrixTransA,At'调用子过程求出系数矩阵的转置矩阵
MatrixMultyAt,P,Atp'调用子过程求出Atp
MatrixMultyAtp,A,Naa'调用子过程求出Naa
MatrixMultyAtp,L,W'调用子过程求出W
matInvNaa'Naa若可逆Naa中的数据被改写,实矩阵Naa中存放Naa逆的结果
Na=Naa
MatrixMultyNa,W,X
EndSub
代码窗口
'数据的输入
PrivateSubmnuOpen_Click()
Dimi%,strT1AsString,strT2AsString'定义循环变量和临时变量
CDg1.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"
CDg1.ShowOpen'打开对话框
strFileName=CDg1.FileName'获得选中的文件名和路径
OpenstrFileNameForInputAs#1'打开文件
Input#1,nn,un,hn'读入已知点的个数nn,未知点的个数un,观测值的个数hn
tn=nn+un
ReDimPname(tn),Hknown(tn),h(hn),s(hn),be(hn),en(hn)
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
'显示读入的数据
txtShow.Text=txtShow.Text&"读入水准网数据:
"&vbCrLf
txtShow=txtShow&"已知点"&nn&"个,未知点"&un&"个,观测值"&hn&"个。
"
txtShow.Text=txtShow.Text&vbCrLf&"网中涉及的点名有:
"
Fori=1Totn
txtShow.Text=txtShow.Text&Pname(i)&","
Nexti
txtShow.Text=txtShow.Text&vbCrLf
txtShow.Text=txtShow.Text&"已知点高程为:
"&vbCrLf
Fori=1Tonn
txtShow.Text=txtShow.Text&Pname(i)&"的高程为:
"&Hknown(i)&vbCrLf
Nexti
txtShow.Text=txtShow.Text&"各观测值分别为:
"&vbCrLf
txtShow=txtShow&"起点终点高差观测值距离观测值"&vbCrLf
Fori=1Tohn
txtShow=txtShow&Pname(be(i))&""&Pname(en(i))&""
txtShow=txtShow&Format(h(i),"0.000")&""&Format(s(i),"0.000")&vbCrLf
Nexti
Close#1'关闭文件
EndSub
'近似高程的计算
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
'显示近似高程计算结果
txtShow.Text=txtShow.Text&"近似高程计算结果:
"&vbCrLf
Fori=1Toun
txtShow=txtShow&Pname(i+nn)&":
"&Format(Hknown(i+nn),"0.000")&vbCrLf
Ne