误差理论与测量平差课程设计报告.docx

上传人:b****5 文档编号:5975730 上传时间:2023-01-02 格式:DOCX 页数:23 大小:333.55KB
下载 相关 举报
误差理论与测量平差课程设计报告.docx_第1页
第1页 / 共23页
误差理论与测量平差课程设计报告.docx_第2页
第2页 / 共23页
误差理论与测量平差课程设计报告.docx_第3页
第3页 / 共23页
误差理论与测量平差课程设计报告.docx_第4页
第4页 / 共23页
误差理论与测量平差课程设计报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

误差理论与测量平差课程设计报告.docx

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

误差理论与测量平差课程设计报告.docx

误差理论与测量平差课程设计报告

一.设计原始资料

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

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

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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