水准网平差VB代码.docx
- 文档编号:28290808
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:31
- 大小:29.04KB
水准网平差VB代码.docx
《水准网平差VB代码.docx》由会员分享,可在线阅读,更多相关《水准网平差VB代码.docx(31页珍藏版)》请在冰豆网上搜索。
水准网平差VB代码
误差理论与测量平差础)
课程设计报告
系(部):
土木工程系
实习单位:
山东交通学院
班级:
测绘084
学生姓名:
田忠星学号080712420
带队教师:
夏小裕﹑周宝兴
时间:
10年12月13日到10年12月19日
山东交通学院
目录:
1.摘要P3
2.概述P3
3.水准网间接平差程序设计思路P3—P4
4.平差程序流程图P4—P6
5.程序源代码及说明P7—P23
6.计算结果P23—P26
7.总结P26—P27
一:
摘要在测量工作中,为了能及时发现错误和提高测量成果的精度,常作多余观测,这就产生了平差问题。
在一个平差问题中,当所选的独立参数X?
的个数等于必要观测数t时,可将每个观测值表达成这t个参数的函数,组成观测方程,这种以观测方程为函数模型的平差方法,就是间接平差。
二:
概述:
该课程设计的主要目是对水准网进行间接平差,在输入数据后依次计算高程近似值﹑误差方程和平差计算。
三:
水准网间接平差程序设计思路
1.根据平差问题的性质,选择t个独立量(既未知点的高程)作为参数X?
2.将每一个观测量的平差值(既观测的高程差值)分别表达成
LLV
3.由误差方程系数B和自由项组成法方程,法方程个数等于参数的个数t;
4.解算法方程,求出参数X?
计算参数(高程)的平差值
X?
=X0+x?
;
5.由误差方程计算V,求出观测量(高差)平差值LLV6.评定精度
单位权中误差
VTPV
r
VTPV
nus
平差值函数的中误差
四:
平差程序流程图
1.已知数据的输入需要输入的数据包括水准网中已知点数﹑未知点数以及这些点的点号,已知高程和高差观测值﹑距离观测值。
程序采用文件方式进行输入,约定文件输入的格式如下:
第一行:
已知点数﹑未知点数﹑观测值个数第二行:
点号(已知点在前,未知点在后)第三行:
已知高程(顺序与上一行的点号对应)第四行:
高差观测值,按“起点点号,终点点号。
高差观测值,距离观测值”的顺序输入。
本节中使用的算例的数据格式如下
2,3,7
1,2,3,4,5
5.016,6.016
1,3,1.359,1.1
1,4,2.009,1.72,3,0.363,2.3
2,4,1.012,2.73,4,0.657,2.4
3,5,0.238,1.4
5,2,-0.595,2.6
2.平差计算过程
(1)近似高程的计算。
用一个数组来存储高程近似值,已知点的高程放在这个数组的开头,然后按照点号输入顺序依次搜索涉及该店的高差观测值,看该高差涉及的另一点是否已知,若未知,则检查下一个高差观测值,若已知,则可以计算出当前未知点的高差近似值,并放入高程近似值数组,依次类推,直到所有未知点的高程近似值都被求出为止。
(2)列立观测值的误差方程。
根据各观测值的起止点信息及高差﹑距离值和误差方程的系数矩阵﹑权矩阵和常数项的各个元素赋值。
(3)平差计算。
通过间接平差通用过程进行平差计算,该过程将系数矩阵数组A﹑权矩阵数组P和常数向量数组L以参数的方式传入,通过计算,把平差结果存放在解向量数组X中,以参数的形式传出。
3.计算结果的输出计算的中间结果和最后结果都实时在文本框中显示,最后还可以把文本框中的内容保存在文本文件中。
4.界面设计
根据以上分析,本程序采用菜单组织程序,用文本框显示数据的输入﹑计算和输出情况。
由于涉及到打开和保存文件的操作,所以还需要一个通用对话框。
(1)菜单设计。
本程序的菜单结构如表所示。
标题
名称
快捷键
文件
(&File)
mnuFile
—
⋯打开数据
mnuOpen
—
⋯保存结果
mnuSave
—
⋯—
aa
—
⋯退出
mnuExit
Ctrl+E
计算
(&Calc)
mnuCalc
—
⋯近似高程
mnuHeight
—
⋯误差方程
mnuEqu
—
⋯平差计算
mnuAdj
—
2)窗体﹑文本框和通用对话框。
在主窗体上绘制1个文本
框控件和一个通用对话框控件,并按照下图设置属性
文本框的Name属性改为txtShow)
对象
属性
值
Text1
Text
Text1
MultiLine
True
Form1
Caption
水准网间接平差
CommonDialog1
Name
CDg1
Text1设计好属性后,调整控件和窗体的大小和位置,以方便美观为好。
五:
程序源代码及说明
程序中涉及的公共变量及其说明如下:
DimstrFileNameAsStringDimnn%,un%,tn%,hn%个数,总点数,观测值个数DimPname()AsStringDimHknown()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
'显示读入的数据
txtShow.Text=txtShow.Text&"读入的水准网数据:
"&vbCrLf
txtShow.Text=txtShow.Text&"已知点"&nn&"个,未知点"&un
&"个,观测值"&hn&"个。
"&vbCrLf
txtShow.Text=txtShow.Text&"网中涉及的点名有:
"
Fori=1Totn
txtShow.Text=txtShow.Text&Pname(i)&","NextitxtShow.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.Text=txtShow.Text&"起点"&""&"终点"&""&"高差观测值"&"距离观测值"&vbCrLf
Fori=1Tohn
txtShow.Text=txtShow.Text&Pname(be(i))&""&Pname(en(i))&""&Format(h(i),"0.000")&""&Format(s(i),"0.000")&vbCrLf
Nexti
Close#1'不要忘记关闭文件
EndSub
其中Order()函数是根据点号(字符串)获得一个点的序号(数值)的自定义函数,之所以要进行这样的排序,是因为在输入和输出时需使用字符串类型的点号,而在程序计算时。
数组的下标元素需要整数型的点号。
该函数定义如下:
'点名-序号转换函数
PublicFunctionOrder(strAsString)AsInteger
Dimi%
Fori=1Totn
Ifstr=Pname(i)Then
Order=i
ExitFor
EndIf
Nexti
EndFunction
2.高程近似值的计算
输入数据后,点击“计算→近似高程”,程序根据已知数据计算未知点的高程近似值,并将计算的中间结果显示在文本框中,代码如下:
'计算近似高程
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&"近似高程计算结果: "&vbCrLfFori=1Toun txtShow.Text=txtShow.Text&Pname(i+nn)&": "&Format(Hknown(i+ nn),"0.000")&vbCrLf Nexti EndSub 3.列立误差方程 点击“计算→误差方程”命令,程序根据输入的数据给误差方程的系数矩阵﹑权矩阵和常数向量赋值,并将其结果显示在文本框中,代码如下: '列立误差方程: 给A、P、L赋值 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 '显示误差方程 txtShow.Text=txtShow.Text&"列立的误差方程: "&vbCrLf Fori=1Tohn Forj=1Toun txtShow.Text=txtShow.Text&A(i,j)&"" Nextj txtShow.Text=txtShow.Text&""&Format(L(i),"0.0000")& vbCrLf Nexti txtShow.Text=txtShow.Text&"权矩阵: "&vbCrLf Fori=1Tohn Forj=1Tohn txtShow.Text=txtShow.Text&P(i,j)&""Nextj txtShow.Text=txtShow.Text&vbCrLf Nexti EndSub 4.计算高程平差值和高程中误差和高差中误差点击“计算→平差计算”命令,程序调用间接平差通用过程求解误差方程,并求出高程平差值﹑高程中误差和高差中误差,显示在文本框中,代码如下: '平差计算 PrivateSubmnuAdj_Click() Dimi%,j%,VtP#(),VtPV#(),z#,AtP#(),AtPA#(),r(),Naan#(),b() Dimo()AsDouble ReDimX(1Toun) ReDimo(1Toun,1To1) ReDims(1Tohn,1To1) ReDimAX(1Tohn,1To1) ReDimV(1Tohn,1To1) ReDimVtP(1To1,1Tohn) ReDimVtPV(1To1,1To1) ReDimAtP(1Toun,1Tohn) ReDimAtPA(1Toun,1Toun) ReDimbAt(1Toun,1Tohn) ReDimAbAt(1Tohn,1Tohn) ReDimr(1Toun,1Toun) ReDimb(1Toun,1Toun) InAdjustA,P,L,X'调用间接平差的通用过程求解 '计算并显示高程平差结果 txtShow.Text=txtShow.Text&"平差计算结果: "&vbCrLf txtShow.Text=txtShow.Text&"点号初始高程(m)高程改正数(m)平差后高程(m)"&vbCrLf Fori=1Toun txtShow.Text=txtShow.Text&Pname(nn+i)&""& Format(Hknown(nn+i),"0.0000") Hknown(nn+i)=Hknown(nn+i)+X(i) txtShow.Text=txtShow.Text&""&Format(X(i),"0.0000")&" "&Format(Hknown(nn+i),"0.0000")&vbCrLf Nexti txtShow.Text=txtShow.Text&vbCrLf '计算改正数V Fori=1Toun Forj=1To1 o(i,j)=X(i) NextjNextiMatrix_MultyAX,A,o Fori=1Toun Forj=1To1s(i,j)=L(i)*1000NextjNextiMatrixMinusAX,s,V Fori=1Tohn Forj=1To1 V(i,j)=AX(i,j)*1000-s(i,j)Nextj Nexti'计算并显示单位权中误差MatrixTransV,Vt txtShow.Text=txtShow.Text&vbCrLfMatrix_MultyVtP,Vt,P txtShow.Text=txtShow.Text&vbCrLf Matrix_MultyVtPV,VtP,V Fori= 1To1 Forj= 1To1 z= VtPV(i,j) Nextj Nexti σ0=Sqr(z/(hn-nn)) txtShow.Text=txtShow.Text&"单位权中误差: (mm)"&vbCrLftxtShow.Text=txtShow.Text&Format(σ0,"0.0000") txtShow.Text=txtShow.Text&vbCrLf '计算未知点的高程中误差MatrixTransA,At Matrix_MultyAtP,At,P Matrix_MultyAtPA,AtP,A Fori=1Toun Forj=1Toun r(i,j)=AtPA(i,j) Nextj Nexti Calljzqn(r(),b()) txtShow.Text=txtShow.Text&"点号高程中误差: (mm)"&vbCrLfFori=1Toun z=b(i,i)zz=σ0*Sqr(z) txtShow.Text=txtShow.Text&Pname(nn+i)&"" txtShow.Text=txtShow.Text&""&Format(zz,"0.0000")&vbCrLf Nexti '计算高差平差值的中误差MatrixTransA,AtMatrix_MultybAt,b,At Matrix_MultyAbAt,A,bAttxtShow.Text=txtShow.Text&"起点"&""&"终点"&""&"高差平差值的中误差(mm)"&vbCrLf Fori=1Tohn y=AbAt(i,i) yy=σ0*Sqr(y) txtShow.Text=txtShow.Text&Pname(be(i))&""&Pname(en(i))&""&Format(yy,"0.0000")&vbCrLf NextiEndSub在此程序中用到了过程jzqn()代码如下: PublicSubjzqn(Qa(),na())DimA()n=UBound(Qa,1)ReDimna(n,n)ReDimA(n,2*n) Fori=1Ton Forj=1Ton A(i,j)=Qa(i,j) Nextj NextiFori=1Ton Forj=n+1To2*nIfj-i=nThenA(i,j)=1ElseA(i,j)=0EndIfNextjNexti Fori=1Ton IfA(i,i)=0ThenForQ=iTon IfA(Q,i)<>0Then ForW=iTo2*n zj=A(i,W) A(i,W)=A(Q,W) A(Q,W)=zj NextW ExitFor EndIf NextQ IfQ>nThenMsgBox"此矩阵不可逆": ExitSubEndIf ForK=2*nToiStep-1 A(i,K)=A(i,K)/A(i,i) NextK Forj=i+1Ton IfA(j,i)<>0Then ForK=2*nToiStep-1 A(j,K)=A(j,K)/A(j,i)-A(i,K) NextK EndIf Nextj Nexti Fori=nTo1Step-1 IfA(i,i)=0Then ForQ=i-1To1Step-1 IfA(Q,i)<>0Then ForW=iTo2*nzj=A(i,W)A(i,W)=A(Q,W)A(Q,W)=zj NextW ExitFor EndIf NextQ EndIf ForK=2*nToiStep-1 A(i,K)=A(i,K)/A(i,i) NextK Forj=i-1To1Step-1 IfA(j,i)<>0Then xxx=A(j,i) ForK=2*nTo1Step-1 A(j,K)=A(j,K)/xxx-A(i,K) NextK EndIf Nextj Nexti Fori=1Ton Forj=1Ton na(i,j)=A(i,j+n) Nextj Nexti EndSub 5.保存﹑退出 点击“文件→保存结果”命令,将文本框中的内容保存在指定的文件中,代码如下: '保存计算结果 PrivateSubmnuSave_Click() CDg1.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"CDg1.ShowSave strFileName=CDg1.FileName OpenstrFileNameForOutputAs#1 Print#1,txtShow.Text Close#1 EndSub 点击“文件→退出”命令,退出程序。 代码如下: PrivateSubmnuExit_Click() End EndSub 6.此程序用到的通用过程mdlAdjust()代码如下: '矩阵转置的通用过程 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 水准 网平差 VB 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)