测量程序设计报告(2)

2018-12-17 10:54

end

(4)水准网平差

%间接平差后高程、高差及中误差 %确定系数矩阵A

A=zeros(num_obs,num_unknown); for i=1:num_obs

m=strmatch(start_point(i),id_bm); %从id_bm中寻找和起始一样点号的下标

n=strmatch(end_point(i),id_bm); %从id_bm中寻找和终点一样的点号下标

L(i)=height_dif(i)+height(m)-height(n); if m<=num_unknown %确定系数矩阵A A(i,m)=-1; end

if n<=num_unknown A(i,n)=1; end end

%权系数的确定、条件平差和中误差 p=diag(1./distance); %权矩阵 dh=inv(A'*p*A)*A'*p*L'; v=A*dh-L';

height_dif_v=height_dif'+v; %平差后的高差

height_v=height(1:num_unknown)'+dh; %平差后的未知点高程 xlgema0=sqrt(v'*p*v/(num_obs-num_unknown)); %单位权中误差 Qxx=inv(A'*p*A); %协因数

xlgema_H=xlgema0*sqrt(diag(Qxx)); %未知点高程平差值中误差 Qff=A*Qxx*A';

xlgema_h_dif=xlgema0*sqrt(diag(Qff));%高差平差值中误差

(5)输出结果

%计算成果和精度评定输出成.txt格式的文本文件

[filename,pathname]=uiputfile('.txt','请选择需要输出的文件'); data2=[pathname,filename]; fidout=fopen(data2,'wt');

fprintf(fidout,'一、所有点近似高程(height) \\n');

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f\\n',height); %输出所有点近似高程,一行输出 fprintf(fidout,'\\n') %换行 fprintf(fidout,'二、权矩阵(p)\\n');

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f\\n',p); %输出权矩阵

fprintf(fidout,'\\n')

fprintf(fidout,'三、平差后单位权中误差(xlgema0)\\n'); %输出平差后单位权中误差,一个值

fprintf(fidout,' %5.4f \\n',xlgema0); fprintf(fidout,'\\n')

fprintf(fidout,'四、平差后未知点高程(height_v)\\n'); %输出平差后未知点高程

fprintf(fidout,' %5.4f %5.4f %5.4f \\n',height_v); fprintf(fidout,'\\n')

fprintf(fidout,'五、平差后未知点精度(xlgema_H)\\n'); %输出平差后未知点精度

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',xlgema_H);

fprintf(fidout,'\\n')

fprintf(fidout,'六、改正后的高差值(height_dif_v)\\n'); %输出改正后的高差值

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',height_dif_v); fclose(fidout);

(6)最终代码

[filename, pathname] = uiputfile('*.txt', '保存数据文件到'); %通过对话窗口找到或创建要存放观测数据的文本文件,获取他们的文件名路径名 file = [pathname,filename]; fid = fopen(file,'wt');

num_known = input('请输入已知水准点个数:'); num_unknown = input('请输入未知水准点个数:'); num_obs = input('请输入观测值个数:');

fprintf(fid,'%5.0f %5.0f %5.0f\\n',num_known,num_unknown,num_obs); for i = 1:num_unknown

id_bm1 = input(['请输入第',num2str(i),'个未知水准点编号'],'s'); id_bm1 = upper(id_bm1); fprintf(fid,' %s',id_bm1); end

for i = 1:num_known

id_bm1 = input(['请输入第',num2str(i),'个已知水准点编号'],'s'); id_bm1 = upper(id_bm1); fprintf(fid,' %s',id_bm1);

height(i) = input(['请输入该已知水准点的高程']); end

fprintf(fid,'\\n'); %换行 for i = 1:num_known

fprintf(fid,' %5.4f',height(i)); end

fprintf(fid,'\\n'); %换行

for i = 1:num_obs

start_point = input(['请输入第',num2str(i),'个测段起始点编号'],'s');%输入num2str(i)个测段起始点编号

start_point = upper(start_point); %大小写字母的转化 end_point = input('终点编号','s');

end_point = upper(end_point); %大小写字母的转化 height_dif = input('测段高差观测值(m)'); distance = input('测段水准路线长度(km)');

fprintf(fid,'%s %s %4.3f %3.2f\\n',start_point,end_point,height_dif,distance); end

fclose('all'); clear;

[filename, pathname]= uigetfile('*.*'); %文件查找窗口 file=fullfile(pathname, filename); %合并路径文件名 fid=fopen(file,'rt'); %rt表示打开的只读文件

num_known = fscanf(fid,'%f',1); %fscanf 函数当能正常读入数据时,返回读入数据的个数,否则返回 %f'以数字格式读取,fid句柄,1.读的数目 num_unknown = fscanf(fid,'%f',1); %每次读一个数 num_obs = fscanf(fid,'%f',1);

num_all = num_known+ num_unknown;

for i = 1: num_all %按字符串方式逐个读取,并存储在字符串数组id_bm中,{}以字符串数组整个BM1存储

id_bm(i) = {fscanf(fid,'%s',1)}; %读出的是点号,字符型 end

height(1: num_unknown)= 0;

height(1+num_unknown: num_all)= fscanf(fid,'%f', num_known);%一一对应高程 for i=1: num_obs

start_point(i) = {fscanf(fid,'%s',1)};%所有起始点在字符串数组中 end_point(i) = {fscanf(fid,'%s',1)}; height_dif(i) = fscanf(fid,'%f',1); distance(i) = fscanf(fid,'%f',1); end

flag(1: num_unknown) = 0; %flag是一个变量

flag(1+num_unknown: num_all) = 1;%0表示该点近似高程未计算,1表示该点近似高程已计算。 while(1)

for i = 1: num_obs

m = strmatch(start_point(i) ,id_bm); %从id_bm中寻找和起始点一样点号的下标

n = strmatch(end_point(i) ,id_bm); %从id_bm中寻找和终点一样点号的下标

if (flag(m)==0 && flag(n)==1)

height(m) = height(n)-height_dif(i); flag(m) = 1;

end

if (flag(n)==0 && flag(m)==1)

height(n) = height(m)+height_dif(i); flag(n) = 1; end end

id_un = find(flag ==0); % 寻找未计算近似高程点的下标 if length(id_un) == 0 %如果无为计算近似高程点,终止循环 break; end end

r=num_obs-num_unknown; %r表示自由度 A=zeros(num_obs,num_unknown); %求解系数阵,初始值化为0 for i=1:num_obs

m=strmatch(start_point(i),id_bm); %从id_bm中寻找和起始一样点号的下标 n=strmatch(end_point(i),id_bm); %从id_bm中寻找和终点一样的点号下标 L(i)=height_dif(i)+height(m)-height(n); %从start_point(i)到end_point(i)高程值 if m<=num_unknown

A(i,m)=-1; %判断未知数的存在与否,开始赋值 end

if n<=num_unknown A(i,n)=1; end end

p=diag(1./distance); %权矩阵,函数diag生成对角矩阵,或提取矩阵对角元素 dh=inv(A'*p*A)*A'*p*L'; v=A*dh-L';

height_dif_v=height_dif'+v; %平差后的高差

height_v=height(1:num_unknown)'+dh; %平差后的未知点高程 xlgema0=sqrt(v'*p*v/r); %单位权中误差 Qxx=inv(A'*p*A);

xlgema_H=xlgema0*sqrt(diag(Qxx)); %未知点高程平差值中误差 Qff=A*Qxx*A';

xlgema_h_dif=xlgema0*sqrt(diag(Qff));%高差平差值中误差 [filename,pathname]=uiputfile('.txt','请选择需要输出的文件'); data2=[pathname,filename]; fidout=fopen(data2,'wt');

fprintf(fidout,'一、所有点近似高程(height) \\n');

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',height); %输出所有点近似高程,一行输出 fprintf(fidout,'\\n') %换行 fprintf(fidout,'二、权矩阵(p)\\n');

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',p); %输出权矩阵

fprintf(fidout,'\\n')

fprintf(fidout,'三、平差后单位权中误差(xlgema0)\\n'); %输出平差后单位权中误差,一个值

fprintf(fidout,' %5.4f \\n',xlgema0); fprintf(fidout,'\\n')

fprintf(fidout,'四、平差后未知点高程(height_v)\\n'); %输出平差后未知点高程 fprintf(fidout,' %5.4f %5.4f %5.4f \\n',height_v); fprintf(fidout,'\\n')

fprintf(fidout,'五、平差后未知点精度(xlgema_H)\\n'); %输出平差后未知点精度

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',xlgema_H); fprintf(fidout,'\\n')

fprintf(fidout,'六、改正后的高差值(height_dif_v)\\n'); %输出改正后的高差值

fprintf(fidout,' %5.4f %5.4f %5.4f %5.4f %5.4f %5.4f \\n',height_dif_v); fclose(fidout);

3、最终成果

《误差理论与测量平差》书上108页例题


测量程序设计报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2012年11月师级薪酬认证试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: