平差课程设计报告.docx

上传人:b****6 文档编号:7841402 上传时间:2023-01-26 格式:DOCX 页数:30 大小:104.97KB
下载 相关 举报
平差课程设计报告.docx_第1页
第1页 / 共30页
平差课程设计报告.docx_第2页
第2页 / 共30页
平差课程设计报告.docx_第3页
第3页 / 共30页
平差课程设计报告.docx_第4页
第4页 / 共30页
平差课程设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

平差课程设计报告.docx

《平差课程设计报告.docx》由会员分享,可在线阅读,更多相关《平差课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。

平差课程设计报告.docx

平差课程设计报告

一.设计原始资料

水准网严密平差及精度评定示例。

如图所示水准网,有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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1