GNSS网平差-间接平差法(附Python和Matlab代码)

GNSS网平差-间接平差法(附Python和Matlab代码)

一、实验目的与要求

  1. 掌握GNSS网无约束平差的原理;

  2. 理解间接平差原理;

  3. 掌握GNSS网无约束平差计算步骤。

二、实验内容、步骤及结果

  1. 根据GNSS网,确定平差方法(约束平差还是无约束平差,或与地面数据联合平差),因只给一个已知点坐标,采用无约束平差;
  2. 确定参数t和间接平差方程数;
  3. 列出间接平差方程;
  4. 计算P阵;
  5. 写出间接平差计算过程和中间结果
  6. 计算出参数(未知点坐标)。

Python代码

import numpy as np
from scipy.linalg import block_diag


# load covariance and calculate P
D1=np.mat([[2.32099900000000e-07,-5.09700800000000e-07,-4.37140100000000e-07],[-5.09700800000000e-07,1.33993100000000e-06,1.10935600000000e-06],[-4.37140100000000e-07,1.10935600000000e-06,1.00859200000000e-06]])
D2=np.mat([[1.04489400000000e-06,-2.39653300000000e-06,-2.31968300000000e-06],[-2.39653300000000e-06,6.34129100000000e-06,5.902876E-06],[-2.31968300000000e-06,5.902876E-06,6.03557700000000e-06]])
D3=np.mat([[5.85006400000000e-07,-1.32962000000000e-06,-1.25237400000000e-06],[-1.32962000000000e-06,3.36254800000000e-06,3.06982000000000e-06],[-1.25237400000000e-06,3.06982000000000e-06,3.01923300000000e-06]])
D4=np.mat([[1.20531900000000e-06,-2.63670200000000e-06,-2.17410600000000e-06],[-2.63670200000000e-06,6.85858500000000e-06,5.48074500000000e-06],[-2.17410600000000e-06,5.48074500000000e-06,4.82012500000000e-06]])
D5=np.mat([[9.66265700000000e-06,-2.17547600000000e-05,-1.97146800000000e-05],[-2.17547600000000e-05,5.19477700000000e-05,4.63356500000000e-05],[-1.97146800000000e-05,4.63356500000000e-05,4.32411000000000e-05]])
D=block_diag(D1,D2,D3,D4,D5)
P=np.linalg.inv(D/(0.00298**2))

# matrix of coefficients
_ones=-np.diag([1,1,1])
ones=np.diag([1,1,1])
zeros=-np.diag([0,0,0])
B=np.r_[
np.c_[_ones,zeros,zeros],
np.c_[zeros,zeros,-ones],
np.c_[ones,zeros,-ones],
np.c_[ones,-ones,zeros],
np.c_[zeros,ones,-ones]
]
l=np.mat([-0.00100000000000000,0.000700000000000000,0.00150000000000000,-0.00700000000000000,0.0140000000000000,0.001150000000000000,-0.0110000000000000,0.0243000000000000,0.0250000000000000,0.00400000000000000,-0.00970000000000000,-0.0120000000000000,0,0,0],
).transpose()

# Solving the normal equation
Nbb=np.matmul(np.matmul((B.transpose()),P),B)
W=np.matmul(np.matmul((B.transpose()),P),l)
# W=(B.transpose())*P*l
x=np.matmul(np.linalg.inv(Nbb),W)
# x=np.linalg.inv(Nbb)*W

# Calculate the result
X0Y0Z0=np.mat([-1973420.17400000,4591054.04670000,3951407.20500000, -1974825.70100000,4591232.19400000,3950235.81300000, -1974909.19800000,4590518.04100000,3951265.01200000]).transpose()
X0Y0Z0_=X0Y0Z0+x
print("The final result of adusting")
print(X0Y0Z0_)

Matlab代码

clc;clear;

%% load covariance and calculate P
D1=[2.32099900000000e-07,-5.09700800000000e-07,-4.37140100000000e-07;-5.09700800000000e-07,1.33993100000000e-06,1.10935600000000e-06;-4.37140100000000e-07,1.10935600000000e-06,1.00859200000000e-06];
D2=[1.04489400000000e-06,-2.39653300000000e-06,-2.31968300000000e-06;-2.39653300000000e-06,6.34129100000000e-06,5.902876E-06;-2.31968300000000e-06,5.902876E-06,6.03557700000000e-06];
D3=[5.85006400000000e-07,-1.32962000000000e-06,-1.25237400000000e-06;-1.32962000000000e-06,3.36254800000000e-06,3.06982000000000e-06;-1.25237400000000e-06,3.06982000000000e-06,3.01923300000000e-06];
D4=[1.20531900000000e-06,-2.63670200000000e-06,-2.17410600000000e-06;-2.63670200000000e-06,6.85858500000000e-06,5.48074500000000e-06;-2.17410600000000e-06,5.48074500000000e-06,4.82012500000000e-06];
D5=[9.66265700000000e-06,-2.17547600000000e-05,-1.97146800000000e-05;-2.17547600000000e-05,5.19477700000000e-05,4.63356500000000e-05;-1.97146800000000e-05,4.63356500000000e-05,4.32411000000000e-05];
D = blkdiag(D1,D2,D3,D4,D5);
P=(D/(0.00298^2))^(-1);
P1=(D1/(0.00298^2))^(-1);
%% matrix of coefficients
one3=ones(1,3);
B=[-diag(one3) zeros(3) zeros(3);
    zeros(3) zeros(3) -diag(one3);
    diag(one3) zeros(3)  -diag(one3);
    diag(one3) -diag(one3) zeros(3);
    zeros(3) diag(one3) -diag(one3)];
l=[-0.00100000000000000;0.000700000000000000;0.00150000000000000;-0.00700000000000000;0.0140000000000000;0.001150000000000000;-0.0110000000000000;0.0243000000000000;0.0250000000000000;0.00400000000000000;-0.00970000000000000;-0.0120000000000000;0;0;0];

%% Solving the normal equation
Nbb=B'*P*B;
W=B'*P*l;
x=Nbb^(-1)*W;

%% accuracy assessment
V=B*x-l;
sigma0=sqrt((V'*P*V)/(15-9));
Q=inv(P);
disp("The accuracy");
sigma=sigma0*(diag(Q)).^0.5

%% Calculate the result
X0Y0Z0=[-1973420.17400000,4591054.04670000,3951407.20500000 -1974825.70100000,4591232.19400000,3950235.81300000 -1974909.19800000,4590518.04100000,3951265.01200000]';
XYZ=[-1218.56100000000,-1039.22700000000,1737.72000000000 270.457000000000,-503.208000000000,1879.92300000000 1489.01300000000,536.030000000000,142.218000000000 1405.53100000000,-178.157000000000,1171.38000000000 83.4970000000000,714.153000000000,-1029.19900000000]';
XYZ_=XYZ+V;
disp("The result of adjusting");
X0Y0Z0_=X0Y0Z0+x
间接原理写的代码,绝对有用,真实可靠 Dim strFileName As String Dim nn%, un%, tn%, hn% '已知点个数,未知点个数,总点数,观测值个数 Dim Pname() As String '点名数组 Dim Hknown() As Double '已知高程数组,存放已知点高程高程近似值 Dim be%(), en%() '观测值的起点终点编号数组,存储的是点序号 Dim h#(), s#() '高观测值数组距离观测值数组 Dim A#(), X#(), P#(), L#() '间接的系数阵、解向量、权阵常数向量 '计算 Private Sub mnuAdj_Click() Dim i%, j% ReDim X(1 To un) InAdjust A, P, L, X '调用间接的通用过程求解 '计算并显示高程结果 txtShow.Text = txtShow.Text & "计算结果:" & vbCrLf txtShow.Text = txtShow.Text & "点号 初始高程(m) 高程改正数(m) 后高程(m)" & vbCrLf For i = 1 To un 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 Next i txtShow.Text = txtShow.Text & vbCrLf '计算并显示单位权中误差--------->>精度评定部分应该也包含在间接模块里,一起来调用 ' Dim dblT As Double ' dblT = 0 ' For i = 1 To un ' ' Next i End Sub '列立误差方程:给A、P、L赋值 Private Sub mnuEqu_Click() Dim i%, j% ReDim A(1 To hn, 1 To un), L(1 To hn), P(1 To hn, 1 To hn) '对每个观测值列误差方程 For i = 1 To hn If en(i) > nn Then A(i, en(i) - nn) = 1 '若终点未知,则给终点对应的系数矩阵元素赋值 If be(i) > nn Then A(i, be(i) - nn) = -1 '若起点未知,则给起点对应的系数矩阵元素赋值 L(i) = -(Hknown(en(i)) - Hknown(be(i)) - h(i)) '根据起终点计算常数项 P(i, i) = 1 / s(i) '以距离的倒数为权 Next i '显示误差方程 txtShow.Text = txtShow.Text & " 列立的误差方程:" & vbCrLf For i = 1 To hn For j = 1 To un txtShow.Text = txtShow.Text & A(i, j) & " " Next j txtShow.Text = txtShow.Text & " " & Format(L(i), "0.0000") & vbCrLf Next i txtShow.Text = txtShow.Text & "权矩阵:" & vbCrLf For i = 1 To hn For j = 1 To hn txtShow.Text = txtShow.Text & P(i, j) & " " Next j txtShow.Text = txtShow.Text & vbCrLf Next i End Sub '计算近似高程 Private Sub mnuHeight_Click() Dim i%, j% For i = 1 To un For j = 1 To hn If be(j) = nn + i And en(j) < nn + i Then '找到一个起点相同且终点已知的观测值 Hknown(nn + i) = Hknown(en(j)) - h(j) Exit For End If If en(j) = nn + i And be(j) < nn + i Then '找到一个终点相同且起点已知的观测值 Hknown(nn + i) = Hknown(be(j)) + h(j) Exit For End If Next j Next i '显示近似高程计算结果 txtShow.Text = txtShow.Text & " 近似高程计算结果: " & vbCrLf For i = 1 To un txtShow.Text = txtShow.Text & Pname(i + nn) & ":" & Format(Hknown(i + nn), "0.000") & vbCrLf Next i End Sub '退出程序 Private Sub mnuExit_Click() End End Sub '打开文件 Private Sub mnuOpen_Click() Dim i As Integer '循环变量 Dim strT1 As String, strT2 As String CDg1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*" CDg1.ShowOpen '打开对话框 strFileName = CDg1.FileName '获得选中的文件名路径 Open strFileName For Input As #1 '打开文件 Input #1, nn, un, hn '读入已知点个数,未知点个数,观测值个数 tn = nn + un ReDim Pname(1 To tn), Hknown(1 To tn) ReDim h(1 To hn), s(1 To hn), be(1 To hn), en(1 To hn) For i = 1 To tn '读入点名 Input #1, Pname(i) Next i For i = 1 To nn '读入已知高程 Input #1, Hknown(i) Next i For i = 1 To hn '读入各观测值 Input #1, strT1, strT2, h(i), s(i) be(i) = Order(strT1): en(i) = Order(strT2) '给起终点数组排序 Next i '显示读入的数据 txtShow.Text = txtShow.Text & "读入的水准数据:" & vbCrLf txtShow.Text = txtShow.Text & " 已知点" & nn & "个,未知点" & un & "个,观测值" & hn & "个。" & vbCrLf txtShow.Text = txtShow.Text & " 中涉及的点名有:" For i = 1 To tn txtShow.Text = txtShow.Text & Pname(i) & "," Next i txtShow.Text = txtShow.Text & vbCrLf txtShow.Text = txtShow.Text & " 已知点高程为:" & vbCrLf For i = 1 To nn txtShow.Text = txtShow.Text & Pname(i) & "的高程为:" & Hknown(i) & vbCrLf Next i txtShow.Text = txtShow.Text & " 各观测值分别为:" & vbCrLf txtShow.Text = txtShow.Text & "起点" & " " & "终点" & " " & "高观测值 " & " 距离观测值" & vbCrLf For i = 1 To hn txtShow.Text = txtShow.Text & Pname(be(i)) & " " & Pname(en(i)) & " " & Format(h(i), "0.000") & " " & Format(s(i), "0.000") & vbCrLf Next i Close #1 '不要忘记关闭文件 End Sub '点名-序号转换函数 Public Function Order(str As String) As Integer Dim i% For i = 1 To tn If str = Pname(i) Then Order = i Exit For End If Next i End Function '保存计算结果 Private Sub mnuSave_Click() CDg1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*" CDg1.ShowSave strFileName = CDg1.FileName Open strFileName For Output As #1 Print #1, txtShow.Text Close #1 End Sub
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬_冬_

若觉得文章对您有用,请随意打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值