n目录一、目录 ----------------------------1二、序言 ---------------------------- 2三、设计思路------------------------ 3四、程序流程图---------------------- 4五、程序及说明---------------------- 5六、计算结果-----------------------12七、总结 --------------------------- 15第二部分序言1、课程设计的性质、目的和任务误差理论与测量平差是一门理论与实践并重的课程,其课程设计是测量数据处理理论学习的一个重要的实践环节,它是在我们学习了专业基础课“误差理论与测量平差基础”课程后进行的一门实践课程。
其目的是增强我们对误差理论与测量平差基础理论的理解,牢固掌握测量平差的基本原理和基本公式,熟悉测量数据处理的基本技能和计算方法,灵活准确地应用于解决各类数据处理的实际问题,并能用所学的计算机理论知识,编制简单的计算程序。
2、误差理论与测量平差课程和其它课程的联系和分工这次课程设计中所用的数学模型和计算方法是我们在误差理论与测量平差课程中所学的内容,所使用的 C 程序语言使我们在计算机基础课程中所学知识。
误差理论与测量平差课程设计是测量平差和计算机程序设计等课程的综合实践与应用,同时也为我们今后步入工作岗位打下了一定基础。
3、课程设计重点及内容本次课程设计重点是培养我们正确应用公式、综合分析和解决问题的能力,以及计算机编程能力。
另外它要求我们完成1-2 个综合性的结合生产实践的题目。
如目前生产实践中经常用到的水准网严密平差及精度评定,边角网(导线)严密平差及精度评定等。
此次我所选的课程设计课题是水准网严密平差及精度评定,其具体内容如下:根据题目要求,正确应用平差模型列出观测值条件方程、误差方程和法方程;解算法方程,得出平差后的平差值及各待定点的高程平差值;评定各平差值的精度和各高程平差值的精度。
具体算例为:如图所示水准网,有 2 个已知点, 3 个未知点,(1)已知点高程H1=5.016m , H2=6.016m 7 个测段。
各已知数据及观测值见下表( 2)高差观测值 (m)端点号高差观测值 m测段距离 km序号1-3 1.359 1.111-4 2.009 1.722-30.363 2.332-4 1.012 2.743-40.657 2.453-50.238 1.465-2-0.595 2.67(3)求各待定点的高程;3-4 点的高差中误差; 3 号点、 4 号点的高程中误差。
第三部分设计思路一、解题步骤(1)此次设计我所采用的模型为间接平差模型,根据已知条件我们可知观测总数n=7,必要观测数 t=3 (则多余观测数 r=n-t=4 ),因此我需先选定三个参数,即 3、4、5 点的最或然高程00X3、X4、X5( X=X +x,X3 =6.375 、00X4 =7.025 、 X5=6.611 ;其中 X0为参数的近似值, x 为其改正值)为参数。
(2)列出条件方程,即将每一个观测量的平差值分别表达成所选参数的函数,H1 +h1=X3、H1+h2=X4、H2 +h3=X3、H2+h4=X4、X3 +h5 =X4、X3+h6=X5、 X5 +h7 =H2;整理后得出误差方程, v1=x3、 v2 =x4、v3=x3-4 、v 4=x4-3 、v 5=-x 3+x4 -7 、v 6=-x 3 +x5 -2 、 v7=-x 5,即 v=Bx-l 的形式。
(3)定权,令每千米的观测高差为单位权观测,即P i =1/S i,从而可写出权阵P;根据误差方程式又可得其T T系数矩阵 B 和自由项l ,并由它们组成法方程N BB x-W=0(其中N BB=B PB,W=BPl ),法方程的个数等于所选参数的个数。
(4)解算法方程,求出参数改正值x 并计算参数的平差值X=X0 +x。
(5)由误差方程计算V,并求出观测量的平差值。
为了检查平差计算的正确性,将所求的值代入条件方程,看其是否满足方程。
(6)精度评定,计算单位权中误差,按照题设要求列出权函数式,再根据平差参数的协方差阵求出协因数,最后求出某段高差中误差,某些点的高程中误差。
二、程序设计思想考虑到在解题过程中一些计算的复杂性,我们需借助一些技术将计算简单化,快捷化,因此在课程设计过程中,我们把一些 C 语言程序设计引入其中;通过一些简单、明了的程序及子函数调用,我们就可以很方便快捷的求出用笔算比较繁琐、费时的矩阵乘积、矩阵的逆(如B T PB、B T Pl )等运算。
第四部分程序流程图根据题目列出条件方程并写成误差方程的形式V=Bx-l↓确定权阵,根据误差方程得到矩阵B、l 进而写出 B T↓运用 C 程序语言求出T T T-1 B P,进一步得到N BB=BPB、W=BPl 并求出 N BB↓-1用C程序求出参数的改正数 x=N BB W↓根据 C 程序语言求B x,进而由 V=Bx-l 写出各观测值的改正数↓根据 L=L+V求出各观测值的平差值↓检验所求各值是否正确,若无误则往下进行,反之检查各步骤查出错误并改正↓由程序计算V T P 进而求出V T PV,求单位权中误差,再根据权函数式、协因数传播定律评定各观测值及所求高程的精度第五部分程序及说明一、矩阵相乘计算函数#include “stdio.h”void Matrix(a,b,m,n,k,c)int m,n,k;double a[],b[],c[];{int i,j,l,u;for(i=0;i<=m-1;i++)for(j=0;j<=k-1;j++){u=i*k+j;c[u]=0.0;for(l=0;l<=n-1;l++)c[u]=c[u]+a[i*n+l]*b[l*k+j];}return;}1. 计算 B T Pmain(){int i,j;static double a[3][7]=B T;static double c[3][7],b[7][7]=P;Matrixmul(a,b,3,7,7,c);printf( “\n ”);for(i=0;i<=2;i++){for(j=0;j<=6;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}2.计算 B T PB,即 N BBmain(){int i,j;static double a[3][7]=B T P;static double c[3][3],b[7][3]=B;Matrixmul(a,b,3,7,3,c);printf( “\n ”);for(i=0;i<=2;i++){for(j=0;j<=2;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}3. 计算 B T Pl ,即 Wmain(){int i,j;static double a[3][7]=B T P;static double c[3][1],b[7][1]=l ;Matrixmul(a,b,3,7,1,c);printf( “\n ”);for(i=0;i<=2;i++){for(j=0;j<=0;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}-1二、矩阵的逆计算函数(求N BB)#include "stdio.h"#define M 3void main(){float MAT[M][2*M];float MAT1[M][M];float t;int i,j,k,l;/***********************************************/ /* 对矩阵进行初始化*/for(i=0;i<M;i++)for(j=0;j<2*M;j++)MAT1[j]='\0';/* 对 MAT1矩阵赋初值*/for(i=0;i<M;i++)for (j=0;j<M;j++)scanf("%f",&MAT1[j]);/* 打印目标矩阵 ?*/printf("原矩阵为: \n");for (i=0;i<M;i++){for (j=0;j<M;j++)printf("%13.7f",MAT1[j]);printf("\n");} /********************************************//* 对 MAT1矩阵进行扩展 ,MAT1 矩阵添加单位阵,由M*M变成 2M*2M矩阵 */ for(i=0;i<M;i++)for(j=0;j<2*M;j++)if (j<M) MAT[j]=MAT1[j];else if (j==M+i) MAT[j]=1;else MAT[j]=0;/* 对 M矩阵进行变换,使得前半部分矩阵成为单位阵,则*//*后半部分矩阵即为所求矩阵逆阵*/for(i=0;i<M;i++){/*对第i行进行归一化*/for (j=0;j<2*M;j++)for(k=i+1;k<M;k++)MAT[j]=MAT[j]+MAT[k][j];for(j=i;j<2*M;j++)MAT[j]=MAT[j]/t;/* 对矩阵进行行变换,使得第i列只有一个元素不为零,且为1*/ for(k=0;k<M;k++)if(k!=i){t=MAT[k];for (l=i;l<2*M;l++)MAT[k][l]=MAT[k][l]-MAT[l]*t;}}/* 将后半部分矩阵即所求矩阵逆阵存入MAT2矩阵。
*/for(i=0;i<M;i++){for(j=0;j<M;j++)MAT1[j]=MAT[j+M];printf("\n");}/*********************************************//* 输出所求的逆阵*/printf("逆阵为: \n");for(i=0;i<M;i++){for(j=0;j<M;j++)printf("%8.4f",MAT1[j]);printf("\n");}}-14. 求 N BB W,即改正数xmain(){int i,j;static double a[3][3]=N BB-1;static double c[3][1],b[3][1]=W;Matrixmul(a,b,3,3,1,c);printf( “\n ”);for(i=0;i<=2;i++){for(j=0;j<=0;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}5. 计算 Bxmain(){int i,j;static double a[7][3]=B;static double c[7][1],b[3][1]=x;Matrixmul(a,b,7,3,1,c);printf( “\n ”);for(i=0;i<=6;i++){for(j=0;j<=0;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}6. 计算 V T Pmain(){int i,j;static double a[1][7]=V T;static double c[1][7],b[7][7]=P;Matrixmul(a,b,1,7,7,c);printf( “\n ”);for(i=0;i<=0;i++){for(j=0;j<=6;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;}7. 计算 V T PVmain(){int i,j;static double a[1][7]=V T P;static double c[1][1],b[7][1]=V;Matrixmul(a,b,1,7,1,c);printf( “\n ”);for(i=0;i<=0;i++){for(j=0;j<=0;j++)printf(“%8.4f\t”,c[i][j];printf(“\n ”);}printf( “\n ”);return0;注:程序中有下划线部分在 C 语言环境中运行时,需根据已知条件及所求结果进行替换!第六部分计算结果根据条件方程及定权原则写出B、l 、P 及 B TB={{1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 1.0 ,0.0},{-1.0, 0.0 ,1.0},{0.0, 0.0, -1.0}}l={{0.0},{0.0},{4.0},{3.0},{7.0},{2.0},{0.0}}P={{0.9091,0.0,0.0,0.0,0.0,0.0,0.0},{0.0,0.5882,0.0,0.0,0.0,0.0,0.0},{0.0,0.0,0.4348,0.0,0.0,0.0,0.0},{0.0,0.0,0.0,0.3704,0.0,0.0,0.0},{0.0,0.0,0.0,0.0,0.4167,0.0,0.0},{0.0,0.0,0.0,0.0,0.0,0.7143,0.0},{0.0,0.0,0.0,0.0,0.0,0.0,0.3846}}B T={{1.0,0.0,1.0,0.0,-1.0,-1.0,0.0},{0.0,1.0,0.0,1.0,1.0,0.0,0.0},{0.0,0.0,0.0,0.0,0.0,1.0,-1.0}}一、在矩阵相乘计算函数的程序前提下,进行以下子程序的调用1.替换第 1 个程序中的 B T、P 并运行程序得到 B T PB T P={{0.9091,0.0,0.4348,0.0,-0.4167,-0.7143,0.0},{0.0,0.5882,0.0,0.374,0.4167,0.0,0.0},{0.0,0.0,0.0,0.0,0.0,0.7143,-0.3846}}2.替换第 2 个程序中的 B T P、 B 并运行程序得到 B T PB,即 N BBN BB={{2.4748 , -0.4167 , -0.7143},{-0.4167 ,1.3753 ,0.0} ,{-0.7143 ,0.0 ,1.0989}}3.替换第 3 个程序中的 B T P、 l 并运行程序得到 B T Pl ,即 WW={{-2.6063},{4.0281} ,{1.4286}}二、在矩阵的逆计算函数程序中进行以下操作运行程序,按照提示及以上运算得到的矩阵N BB输入其元素,运行的结果即为N BB-1 N BB-1 ={{0.5307 ,0.1608 ,0.3450},{0.1608 , 0.7758 , 0.1045} ,{0.3450 , 0.1045 , 1.1342}}三、再次在矩阵相乘计算函数的程序前提下,进行以下子程序的调用1. 替换第 4 个程序中的-1、W并运行程序得到-1W,即所选参数的改正数 x N BB N BBx={{-0.2426},{2.8552} ,{1.1421}}2.替换第 5 个程序中的 B、 x 并运行程序得到 Bx Bx={{-0.2426},{2.8552},{-0.2464},{2.8552},{3.0978},{1.3847},{-1.1421}}3. 根据 V=Bx-l 求出各观测值的改正数V,并写出 V T,然后替换第 6 个程序中的V T、P 并运行程序得到V T P V={{-0.2426},{2.8552},{-4.2426},{-0.1448},{-3.9022},{-0.6153},{-1.1421}}V T={{-0.2426,2.8552,-4.2426,-0.1448,-3.9022,-0.6153,-1.1421}}V T P={{-0.2205,1.6794,-1.8447,-0.0536,1.6260,-0.4395,-0.4393}}4.替换第 7 个程序中的 V T P、 V 并运行程序得到 V T PVV T PV=19.7997四、求出各个观测值平差值并按要求平定精度X3=6.3748 m X4=7.0279 m X5 =6.6122 mh1=1.3588m h2=2.0119mh3=0.3588mh4=1.0119m h5=0.6531mh6=0.2374mh7=-0.5961m根据公式可求得单位权中误差为 2.225mmh34= X3- X4-1[1 -1 0]TQ34=[1 -1 0] N BB=0.9849H =X Q=[100]N-1[100]T=0.5307BB3334H4=X4 Q34=[010]N BB-1[0 1 0]T=0.77583、4点高差中误差为 2.208mm3 号点高程中误差为 1.621mm4 号点高程中误差为 1.96mm第七部分总结通过这次误差理论与测量平差的课程设计,我又对整本书有了一个更深的理解。