平差课程设计
编程语言为matlab,使用designer制作界面
希望同学们交流学习,在程序基础上进一步作出更酷的东西,切忌直接照抄。
程序源码及相关文档放在资源里,解压后使用matlab打开文件夹,并进一步打开gps.mlapp
除此之外也可以直接打开“打包后的程序”中的.exe文件,不过这种打开方式需要等待很久。打包好的程序后续发在资源里
链接:https://download.csdn.net/download/retuen0/18394146
当初我写的报告就不发给大家了,发几个截图可以大概参考
下面展示部分源码,完整代码可在资源https://download.csdn.net/download/retuen0/18394146中获取
// A code block
核心计算源码
// An highlighted block
function funOpenFile(app)
%读取 txt 格式的 GPS 观测数据
[filename1,filepath]=uigetfile('*.txt','请选择 GPS 数据文
件');
fid=fopen(strcat(filepath,filename1),'rt');
if (fid==-1)
msgbox('文件打开失败','Warn','warn');
return;
end
yzds=fscanf(fid,'%f',1);%已知点数
yzdh=fscanf(fid,'%f',1);%已知点号
for i=1:yzds
x0(i)=fscanf(fid,'%f',1);y0(i)=fscanf(fid,'%f',1);z0(i)=fscanf(fid,'%
f',1);%已知点坐标
end
%disp(x0)
wzds=fscanf(fid,'%f',1);%未知点数
disp(wzds)
jxs=fscanf(fid,'%f',1);%基线数
sigma=fscanf(fid,'%f',1);
for i=1:jxs
qd(i)=fscanf(fid,'%f',1);zd(i)=fscanf(fid,'%f',1);%起
点与终点
dx(i)=fscanf(fid,'%f',1);dy(i)=fscanf(fid,'%f',1);dz(i)=fscanf(fid,'%
f',1);%基线向量
sigmaxx(i)=fscanf(fid,'%f',1);sigmaxy(i)=fscanf(fid,'%f',1);sigmaxz(i
)=fscanf(fid,'%f',1);
sigmayy(i)=fscanf(fid,'%f',1);sigmayz(i)=fscanf(fid,'%f',1);sigmazz(i
)=fscanf(fid,'%f',1);%基线方差阵
end
end
end4.4.2 法方程系数阵 B 和权阵 P、l 的计算
%权阵 P 的形成
D0=zeros(jxs*3,jxs*3);
for i=1:jxs
D0(3*i-1,3*i-2)=sigmaxy(i);
D0(3*i,3*i-1)=sigmayz(i);
D0(3*i,3*i-2)=sigmaxz(i);
end
D=zeros(jxs*3,jxs*3);
for i=1:jxs
D(3*i-2,3*i-2)=sigmaxx(i);
D(3*i-1,3*i-1)=sigmayy(i);
D(3*i,3*i)=sigmazz(i);
end
D=D0+D0'+D;
P=inv((D/sigma^2));
%系数阵 B
B0=zeros(jxs*3,(wzds+1)*3);
for i=1:jxs
B0(3*i-2:3*i,3*qd(i)-2:3*qd(i))=diag([-1,-1,-1]);
end
for i=1:jxs
B0(3*i-2:3*i,3*zd(i)-2:3*zd(i))=diag([1,1,1]);
end
B=B0(1:jxs*3,4:(wzds+1)*3);
%l 阵的形成
l=zeros(jxs*3,1);
for i=1:jxs
l(3*i-2:3*i)=[dx(i)-(x(zd(i))-x(qd(i)));dy(i)-
(y(zd(i))-y(qd(i)));dz(i)-(z(zd(i))-z(qd(i)))];
end4.4.3 GPS 控制网及误差椭圆的绘制
%绘制控制网图
XT0=[x0(1),X(2:wzds+1)];
YT0=[y0(1),Y(2:wzds+1)];
dm=zeros(wzds+1,1);
for i=1:wzds+1
dm(i)=i;
end
%dm;
for i=1:wzds+1
text(app.UIAxes,XT0(i)+30,YT0(i)+30,num2str(dm(i)));
end
hold(app.UIAxes,'on')
plot(app.UIAxes,x0(1),y0(1),'k^')
hold(app.UIAxes,'on')
plot(app.UIAxes,X(2:wzds+1),Y(2:wzds+1),'Ko')
hold(app.UIAxes,'on')
for i=1:jxs
XT(2*i-1:2*i)=[XT0(qd(i)),XT0(zd(i))];
YT(2*i-1:2*i)=[YT0(qd(i)),YT0(zd(i))];
plot(app.UIAxes,XT(2*i-1:2*i),YT(2*i-1:2*i))
end
hold(app.UIAxes,'on')
4.4.5 运算结果输出
%绘制误差椭圆
K=zeros(wzds+1,1);
QEE=zeros(wzds+1,1);
QFF=zeros(wzds+1,1);
faiE=zeros(wzds+1,1);
for i=2:wzds+1
K(i)=sqrt((Q(3*(i-1)-2,3*(i-1)-2)-Q(3*(i-1)-1,3*(i-1)-
1))^2+4*Q(3*(i-1)-1,3*(i-1)-2)^2);
QEE(i)=0.5*(Q(3*(i-1)-2,3*(i-1)-2)+Q(3*(i-1)-1,3*(i1)-1)+K(i));
QFF(i)=0.5*(Q(3*(i-1)-2,3*(i-1)-2)+Q(3*(i-1)-1,3*(i1)-1)-K(i));
pd(i)=(QEE(i)-Q(3*(i-1)-2,3*(i-1)-2))/Q(3*(i-1)-
1,3*(i-1)-2);
if pd(i)>0
faiE(i)=(atan(pd(i)))*180/pi;
end
if pd(i)<0
faiE(i)=(atan(pd(i)))*180/pi+180;
end
end
E=sqrt(delta0^2*QEE);
F=sqrt(delta0^2*QFF);
sita=0:pi/50:2*pi;
lines=1;
d11={'10000'};
cl2=d11;
scale=str2num(str2mat(cl2));
hold on;
for i=2:wzds+1
plot(app.UIAxes2,X(i)+cos(faiE(i)*pi/180)*E(i)*scale*cos(sita)-
sin(faiE(i)*pi/180)*F(i)*scale*sin(sita),Y(i)+cos(faiE(i)*pi/180)*F(i
)*scale*sin(sita)+sin(faiE(i)*pi/180)*E(i)*scale*cos(sita),'m')
end
hold on;
zoom on;
hold off;
fn=fopen('GPS 网算例二平差报告.txt','w');
fprintf(fn,'%s\n\n','GPS 网无约束平差报告:');
fclose(fn);
fn=fopen('GPS 网算例二平差报告.txt','a');
fprintf(fn,'%s%s\n\n',strcat('单位权中误差
σ0=',num2str(delta0)),'m');
fprintf(fn,'%s\n','平差后各点坐标如下所示(单位:m):');
fprintf(fn,'%s\n','点名 X Y Z');
for i=1:wzds
fprintf(fn,'%s',num2str(dh(i)));
fprintf(fn,'%16.4f',X(i));
fprintf(fn,'%16.4f',Y(i));
fprintf(fn,'%16.4f\n',Z(i));
end
fprintf(fn,'\n');
fprintf(fn,'%s\n\n','各未知点平面点位中误差如下所示(单位:
mm):');
fprintf(fn,'%s\n','点名 点位误差');
for i=1:wzds
fprintf(fn,'%s',num2str(dh(i)));
fprintf(fn,'%16.4f\n',dwwc(i));
end
fprintf(fn,'\n');
fprintf(fn,'%s\n\n','平差后各点误差椭圆如下所示(单位:mm):
');
fprintf(fn,'%s\n','点名 长轴 短轴 极大值方向
');
for i=1:wzds
fprintf(fn,'%s',num2str(dh(i)));
fprintf(fn,'%16.4f',E(i));
fprintf(fn,'%16.4f',F(i));
fprintf(fn,'%16.4f\n',phiE(i));
end