导线网平差Word文档下载推荐.docx
《导线网平差Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《导线网平差Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
PrivateSub打开文件_Click()'
打开文件
Dimff$,temp$,A_name$,A_x!
A_y!
A_l#,A_s!
B_name$,B_l#,C_name$,C_x!
C_y!
D_name$,D_x!
D_y!
Form1.Cls'
清屏
CommonDialog1.DialogTitle="
打开数据文件"
CommonDialog1.FileName="
"
CommonDialog1.ShowOpen
'
出错处理
OnErrorGoToFileErr
ff=CommonDialog1.FileName'
ff是文件路径名
OpenffForInputAs#1'
以顺序文件方式打开文件,使用input
LineInput#1,temp'
读取文件中的说明语句
Input#1,n'
读取n,n为(测站数-1)
ReDimPo(n)AsPoint'
定义Po(n),其中Po(0)存A点数据,Po(n)存B点数据,Po
(1)到Po(n-1)存n-1个未知点数据。
Input#1,m,e1,e2'
读取先验方向观测值中误差m,测距仪固定误差e1,比例误差e2
Input#1,C_name,C_x,C_y'
读取已知点C
Input#1,A_name,A_x,A_y,A_l,A_s'
读取已知点A
Fori=1Ton-1'
读取n-1个未知点
Input#1,Po(i).name,Po(i).l,Po(i).s
Nexti
Input#1,B_name,B_x,B_y,B_l'
读取已知点B
Input#1,D_name,D_x,D_y'
读取已知点D
Close#1
tc=ZBiaoFSuan(C_x,C_y,A_x,A_y)'
坐标反算,求点C到A的坐标方位角,并记作tc,单位是度
tb=ZBiaoFSuan(B_x,B_y,D_x,D_y)'
坐标反算,求点B到D的坐标方位角,并记作tb,单位是度
Po(0).name=A_name:
Po(0).x=A_x:
Po(0).y=A_y:
Po(0).l=A_l:
Po(0).s=A_s'
Po(0)存A点数据
Po(n).name=B_name:
Po(n).x=B_x:
Po(n).y=B_y:
Po(n).l=B_l'
Po(n)存B点数据
Fori=0Ton
Po(i).l=deg(Po(i).l)'
将观测方向左角的单位度分秒化作度
ReDimQ#(2*n),A#(2,2*n),V#(2*n),C#(1,2*n-2),mx#(n-1),my#(n-1),_
mk#(n-1),e#(n-1),f#(n-1),zz#(n-1)'
变量重新定义
bb=True
MsgBox"
文件已成功打开"
,"
提示"
显示平差数据ff
ExitSub
FileErr:
您的文件未打开或打开的文件格式有误!
注意:
请重新运行本程序!
!
EndSub
PrivateSub开始计算_Click()
Ifbb=TrueThen
推算方位角和坐标'
求近似坐标
求条件式
Ifdd=TrueThen'
若平差数据没有超限,则进行下面的计算
组法方程式
求逆求K
求改正数和平差值
求平差后坐标
精度评定
Else
MsgBox"
限差超限!
ExitSub
EndIf
Else
数据文件未打开!
EndIf
aa=True
计算完毕!
显示平差结果
PrivateSub保存_Click()
Dimff$
Ifaa=TrueThen
保存平差结果"
CommonDialog1.Filter="
(*.txt)|*.txt"
平差结果.txt"
CommonDialog1.ShowSave
ff=CommonDialog1.FileName
Ifff="
Then
文件名不能为空"
警告"
OpenffForOutputAs#2'
以顺序文件方式保存文件,使用output
Print#2,"
平差结果:
---------------------------------------------------------------------------------------------"
单位权中误差m0="
&
Format(m0,"
####.##"
)&
"
秒"
点名"
"
x(m)"
y(m)"
点位误差(cm)"
E(cm)"
F(cm)"
Z(度分秒)"
Fori=1Ton-1
Po(i).name,Format(Po(i).x,"
########.####"
),Format(Po(i).y,"
),"
Format(mk(i),"
#####.##"
),_
Format(e(i),"
Format(f(i),"
Format(zz(i),"
###.#####"
)
Close#2
cc=True
保存完毕!
没有需要保存平差结果!
PrivateSub退出_Click()
Ifaa=TrueAndcc=FalseThen
提示.Show'
若平差结果未保存则进行提示
End'
若没有平差结果或平差结果已保存则退出
PrivateSub推算方位角和坐标()
Po(0).t=tc+Po(0).l-180
IfPo(0).t>
360ThenPo(0).t=Po(0).t-360
IfPo(0).t<
0ThenPo(0).t=Po(0).t+360
Fori=1Ton
求方位角
Po(i).t=Po(i-1).t+Po(i).l-180
IfPo(i).t>
360ThenPo(i).t=Po(i).t-360
IfPo(i).t<
0ThenPo(i).t=Po(i).t+360
求坐标
Po(i).x=Po(i-1).x+Po(i-1).s*Cos(Po(i-1).t/p0)'
t要以度为单位
Po(i).y=Po(i-1).y+Po(i-1).s*Sin(Po(i-1).t/p0)
角度改正数的单位是秒,边长改正数的单位是厘米
方向观测值中误差为单位权
方向观测值中误差的先验值为m(秒)
角度观测值的权为0.5
距离观测值中误差的先验值为ms=e1+e2*s*0.0001(厘米)
PrivateSub求条件式()
Dimsums!
求A
Fori=0Ton'
求角度改正数系数
A(0,n+i)=1
A(1,n+i)=(Po(i).y-Po(n).y)/2062.65
A(2,n+i)=(Po(n).x-Po(i).x)/2062.65
Q(n+i)=2'
求角度观测值的权倒数
Fori=0Ton-1'
求边长改正数系数
A(1,i)=Cos(Po(i).t/p0)
A(2,i)=Sin(Po(i).t/p0)
Q(i)=(e1+e2*Po(i).s*0.0001)^2/m^2'
求距离观测值的权倒数
求W
W(0)=(Po(n).t-tb)*3600'
单位是s
W
(1)=(Po(n).x-B_x)*100'
单位是cm
W
(2)=(Po(n).y-B_y)*100'
Fori=0Ton-1
sums=sums+Po(i).s
限差判断
这是首级图根导线的精度要求,其中n+1为测站数
IfAbs(W(0))>
40*Sqr(n+1)OrSqr((W
(1)/100)^2+(W
(2)/100)^2)/sums>
0.00025Then'
方位角闭合差和导线全长相对闭合差
dd=True
PrivateSub组法方程式()
Dimg%
Fori=0To2
Forj=iTo2'
由于Naa是对称的,只求其上三角即可。
Forg=0To2*n
Naa(i,j)=Naa(i,j)+A(i,g)*A(j,g)*Q(g)
Nextg
Nextj
对于3*3的矩阵来说,利用公式 Naa逆=Naa*/|Naa| 去求Naa的逆即可,其中Naa*是伴随矩阵。
PrivateSub求逆求K()
Dimee#,ii#,jj#,kk#,det#'
det是|Naa|的值
ee=1
ee=ee*Naa(i,i)
ee=ee+2*Naa(0,1)*Naa(1,2)*Naa(0,2)
ii=Naa(0,1)^2
jj=Naa(0,2)^2
kk=Naa(1,2)^2
det=ee-(ii*Naa(2,2)+jj*Naa(1,1)+kk*Naa(0,0))
求伴随矩阵Naa*,用Naa逆存储
Naa逆(0,0)=Naa(1,1)*Naa(2,2)-kk
Naa逆(0,1)=Naa(0,2)*Naa(1,2)-Naa(0,1)*Naa(2,2)
Naa逆(1,0)=Naa逆(0,1)
Naa逆(1,1)=Naa(0,0)*Naa(2,2)-jj
Naa逆(0,2)=Naa(0,1)*Naa(1,2)-Naa(0,2)*Naa(1,1)
Naa逆(2,0)=Naa逆(0,2)
Naa逆(2,2)=Naa(0,0)*Naa(1,1)-ii
Naa逆(1,2)=Naa(0,2)*Naa(0,1)-Naa(0,0)*Naa(1,2)
Naa逆(2,1)=Naa逆(1,2)
求Naa逆
Forj=0To2
Naa逆(i,j)=Naa逆(i,j)/det
求K
K(i)=K(i)-Naa逆(i,j)*W(j)
PrivateSub求改正数和平差值()
Dimpvv#
pvv=0
Fori=0To2*n
V(i)=V(i)+K(j)*A(j,i)*Q(i)'
求改正数V
pvv=pvv+V(i)*V(i)/Q(i)'
求pvv
m0=Sqr(pvv/3)'
求单位权中误差m0
Po(i).s=Po(i).s+V(i)/100'
求导线边长的平差值,其中边长改正数的单位是厘米,边长的单位是米
Po(i).l=Po(i).l+V(n+i)/3600'
求导线左角的平差值,其中角度改正数的单位是秒,角度的单位是度
列出待定点坐标的权函数式,据此进行精度评定。
PrivateSub精度评定()
Dimuu#,vv#,ww#,ss#,r#,kk!
Forj=1Ton-1
uu=0:
vv=0:
ww=0
Fori=0Toj-1
C(0,i)=Cos(Po(i).t/p0)
C(1,i)=Sin(Po(i).t/p0)
C(0,n+i)=(Po(i).y-Po(j).y)/2062.65
C(1,n+i)=(Po(j).x-Po(i).x)/2062.65
uu=uu+C(0,i)^2*Q(i)+C(0,n+i)^2*Q(n+i)
vv=vv+C(1,i)^2*Q(i)+C(1,n+i)^2*Q(n+i)
ww=ww+C(0,i)*C(1,i)*Q(i)+C(0,n+i)*C(1,n+i)*Q(n+i)
Forkk=0To2
ss=0:
r=0
ss=ss+A(kk,i)*C(0,i)*Q(i)+A(kk,n+i)*C(0,n+i)*Q(n+i)
r=r+A(kk,i)*C(1,i)*Q(i)+A(kk,i+n)*C(1,n+i)*Q(n+i)
fx(kk)=ss:
fy(kk)=r
Nextkk
ss=ss-Naa逆(kk,i)*fx(i)
r=r-Naa逆(kk,i)*fy(i)
K(kk)=ss:
qq(kk)=r
uu=uu+fx(i)*K(i)
vv=vv+fy(i)*qq(i)
ww=ww+fx(i)*qq(i)
mx(j)=m0*Sqr(Abs(uu))
my(j)=m0*Sqr(Abs(vv))
mk(j)=Sqr((mx(j))^2+(my(j))^2)'
每个点的点位中误差,单位cm
r=uu+vv
ss=Sqr((uu-vv)^2+4*ww^2)
e(j)=m0*Sqr((r+ss)/2)'
点位误差椭圆元素E,单位cm
f(j)=m0*Sqr(Abs(r-ss)/2)'
点位误差椭圆元素F,单位cm
z=Atn(2*ww/(uu-vv))
z=z/2*p0
Ifz<
0Thenz=z+90
Ifww<
0Thenz=z+180
zz(j)=dms(z)'
点位误差椭圆元素Z
PrivateFunction显示平差数据(ByValfname$)
DimlinesfromFile$,Nextline$
OpenfnameForInputAs#1
DoUntilEOF
(1)
LineInput#1,Nextline
linesfromFile=linesfromFile+Nextline+Chr(13)
Loop
PrintlinesfromFile
EndFunction
PrivateSub显示平差结果()
Print"
),Format(f(i),"
),Format(zz(i),"
可以将平差所得的B点坐标和B点的实际坐标输出进行比较,以验证平差结果是否正确
PrintFormat(Po(n).x,"
########.######"
),Format(Po(n).y,"
PrintB_x,B_y