Matlab课程设计报告.docx
《Matlab课程设计报告.docx》由会员分享,可在线阅读,更多相关《Matlab课程设计报告.docx(8页珍藏版)》请在冰豆网上搜索。
Matlab课程设计报告
课程设计报告
设计题目:
水准网平差程序设计
专业:
测绘工程
班级学号:
测绘100206
姓名:
指导教师:
束蝉芳
起屹日期:
2013年7月1日~2012年7月8日
南京工业大学测绘学院
目录
1.课程设计目的、意义…………………………………..1
2.课程设计任务和内容…………………………………..1
3.程序代码………………………………………………..2
4.结果……………………………………………………..3
5.设计总结………………………………………………...11
一、课程设计的目的、意义
测绘程序设计是一门实践性很强的课程,且具有很强的综合性,要求学生既要掌握相关数据处理理论知识又要掌握相关的程序分析与设计技术。
开展一定程度的数据处理程序分析与设计工作,可以使学生从根本上对问题分析、程序设计等具体问题与方法具有感性的直观了解,打破同学们对程序设计的神秘感与畏难情绪;培养同学们具体问题分析与处理的基本能力;提高解决具体问题的实际动手能力、在不同问题的程序设计实践中培养同学们对程序设计的兴趣,进一步掌握matlab语言、结构化的测绘程序设计技术。
为加深学生对相关理论、技术和方法的理解,掌握测绘数据处理软件的开发特点和技术,在《测绘程序设计》课程结束后安排为期一周的测绘程序设计课程设计。
在进一步理解课程相关程序设计的思路、掌握相关技术的前提下,要求每位同学按要求独立进行问题分析、程序设计、功能测试等工作,开发相关程序,达到锻炼学生具体问题分析、程序设计的能力,培养勇于钻研、团结协作的精神。
二、课程设计任务和内容
1.分析课程相关既有软件,掌握结构化程序的设计思想、技术和方法。
2.根据具体问题进行题目分析、程序设计、开发和调试工作。
3.根据具体算例验证设计程序的正确性、可靠性。
4、编写个人课程设计报告,上交相关资料,进行课程设计总结。
三、程序代码
编写matlab函数用于将水准观测数据按标准格式写入txt文本文件,Matlab函数名为levelling_data_input。
水准数据文件的编排标准格式为:
首行记录已知点个数、未知点个数、观测值个数;
第二行记录点号(未知点编号在前,已知点在后);
第三行记录已知点高程;
第四行开始记录起始点编号、终点编号、高差观测值(m)、测段距离(km)
函数实现功能:
通过命令窗口分别提示输入
已知点个数(num_known)、未知点个数(num_unknown)、观测值个数(num_obs);
2、数据读入
对上述标准格式的数据文件,可以利用fscanf来读取文本中的信息
如第一行三个数可通过下面两种方式来获取:
1)每次读一个数
num_known=fscanf(fid,'%f',1);
num_unknown=fscanf(fid,'%f',1);
num_obs=fscanf(fid,'%f',1);
2)一次读三个数
num=fscanf(fid,'%f',3);
num_known=num
(1);
num_unknown=num
(2);
num_obs=num(3);
第二行编号读取可用fscanf按字符串方式逐个读取,并存储在字符串数组id_bm中
num_all=num_known+num_unknown
fori=1:
num_all
id_bm(i)={fscanf(fid,'%s',1)};
end
第三行和第一行读取方式类似,数据放在变量height(1行num_all列)中,其中前num_unknown个放未知点高程(未计算得到近似高程前可给它们赋一个初始值如0),后num_known个方已知点高程.
height(1:
num_unknown)=0;
height(1+num_unknown:
num_all)=fscanf(fid,'%f',num_known);
第四行开始的数据可以参考上面利用fscanf逐行读取,例如:
fori=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
3、近似高程计算程序
根据已知点高程,观测高差,求未知点近似高程
令变量flag(1:
num_unknown)=0;flag(1+num_unknown:
num_all)=1;,0表示该点近似高程未计算,1表示该点近似高程已计算。
可通过循环来计算未知点近似高程,直到所有点的flag都为1;
while
(1)
fori=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);%寻找未计算近似高程点的下标
iflength(id_un)==0%如果无为计算近似高程点,终止循环
break;
end
end
4、根据间接平差模型建立观测方程,按照水准路线长度定权,求出平差后各未知点高程,高差值,评定精度,并将结果输出到文本文件中(包含未知点近似坐标、权矩阵,平差后单位权中误差,平差后各未知点高程及其精度、改正后高差值)。
r=num_obs-num_unknown;%r表示自由度
A=zeros(num_obs,num_unknown);%求解系数阵,初始值化为0
fori=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)高程值
ifm<=num_unknown
A(i,m)=-1;%判断未知数的存在与否,开始赋值
end
ifn<=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));%高差平差值中误差
%第五步:
计算成果和精度评定输出成.txt格式的文本文件
fidout=fopen('resultlevelling.txt','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);%输出权矩阵,是6*6矩阵
fprintf(fidout,'\n')
fprintf(fidout,'三、平差后单位权中误差(xlgema0)\n');%输出平差后单位权中误差,一个值
fprintf(fidout,'%5.4f\n',xlgema0);
fprintf(fidout,'\n')
fprintf(fidout,'四、平差后未知点高程(height_v)\n');%输出平差后未知点高程,是3*1矩阵
fprintf(fidout,'%5.4f%5.4f%5.4f\n',height_v);
fprintf(fidout,'\n')
fprintf(fidout,'五、平差后未知点精度(xlgema_H)\n');%输出平差后未知点精度,是6*1矩阵
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');%输出改正后的高差值,是6*1矩阵
fprintf(fidout,'%5.4f%5.4f%5.4f%5.4f%5.4f%5.4f\n',height_dif_v);
fclose(fidout);
四、程序运行结果
一、所有点近似高程(height)
12.030013.075012.052013.375012.377010.0000
10.550010.9800
二、权矩阵(p)
三、平差后单位权中误差(xlgema0)
0.1155
四、平差后未知点高程(height_v)
11.864612.953811.7740
13.069912.0614
五、平差后未知点精度(xlgema_H)
0.13990.14180.12180.12910.1115
六、改正后的高差值(height_dif_v)
1.86461.08921.2053-1.17980.1161-1.2960
-1.00860.2874-1.2240-1.0814
五、设计总结
从这次的课程设计中,我对MATLAB又有了更深的了解。
设计水准网平差时,主要是把路线的操作转化为具体的程序实现,进而求出误差方程式的系数方阵、常数项以及权阵,后面的操作与间接平差相同。
在做的过程中,我学会了更多的应用,知道了更多的函数,也学会了创建文件以及按一定的格式输入数据。
学会了如何用一般的程序读取不规则的数据。
在课程设计中遇到了很多问题,循环、条件判断、平差的误差方程都有或多或少的问题。
MATLAB还有更多的应用,现阶段我还只学会了用MATLAB处理测绘测量程序的设计,但它在测量中占有很重要的地位,是复杂的误差处理和平差计算简单话,避免了大量的计算,大大节省了时间。
通过这次的课程设计,了解了自己的不足,知道自己还有很多要学习的地方,今后会认真学习,熟练掌握MATLAB的应用。