误差理论与测量平差课程设计报告Word文档格式.docx
- 文档编号:21600700
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:25
- 大小:24.01KB
误差理论与测量平差课程设计报告Word文档格式.docx
《误差理论与测量平差课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《误差理论与测量平差课程设计报告Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
3-5
6
5-2
7
(3)求各待定点的高程;
3-4点的高差中误差;
3号点、4号点的高程中误差。
第三部分设计思路
一、解题步骤
(1)此次设计我所采用的模型为间接平差模型,根据已知条件我们可知观测总数n=7,必要观测数t=3(则多余观测数r=n-t=4),因此我需先选定三个参数,即3、4、5点的最或然高程X3、X4、X5(X=X0+x,X30=、X40=、X50=;
其中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、v4=x4-3、v5=-x3+x4-7、v6=-x3+x5-2、v7=-x5,即v=Bx-l的形式。
(3)定权,令每千米的观测高差为单位权观测,即Pi=1/Si,从而可写出权阵P;
根据误差方程式又可得其系数矩阵B和自由项l,并由它们组成法方程NBBx-W=0(其中NBB=BTPB,W=BTPl),法方程的个数等于所选参数的个数。
(4)解算法方程,求出参数改正值x并计算参数的平差值X=X0+x。
(5)由误差方程计算V,并求出观测量的平差值。
为了检查平差计算的正确性,将所求的值代入条件方程,看其是否满足方程。
(6)精度评定,计算单位权中误差,按照题设要求列出权函数式,再根据平差参数的协方差阵求出协因数,最后求出某段高差中误差,某些点的高程中误差。
二、程序设计思想
考虑到在解题过程中一些计算的复杂性,我们需借助一些技术将计算简单化,快捷化,因此在课程设计过程中,我们把一些C语言程序设计引入其中;
通过一些简单、明了的程序及子函数调用,我们就可以很方便快捷的求出用笔算比较繁琐、费时的矩阵乘积、矩阵的逆(如BTPB、BTPl)等运算。
第四部分程序流程图
根据题目列出条件方程并写成误差方程的形式V=Bx-l
↓
确定权阵,根据误差方程得到矩阵B、l进而写出BT
运用C程序语言求出BTP,进一步得到NBB=BTPB、W=BTPl并求出NBB-1
用C程序求出参数的改正数x=NBB-1W
根据C程序语言求Bx,进而由V=Bx-l写出各观测值的改正数
根据L=L+V求出各观测值的平差值
检验所求各值是否正确,若无误则往下进行,反之检查各步骤查出错误并改正
由程序计算VTP进而求出VTPV,求单位权中误差,再根据权函数式、协因数传播定律评定各观测值及所求高程的精度
第五部分程序及说明
一、矩阵相乘计算函数
#include“”
voidMatrix(a,b,m,n,k,c)
intm,n,k;
doublea[],b[],c[];
{
inti,j,l,u;
for(i=0;
i<
=m-1;
i++)
for(j=0;
j<
=k-1;
j++)
{
u=i*k+j;
c[u]=;
for(l=0;
l<
=n-1;
l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}
1.计算BTP
main()
inti,j;
staticdoublea[3][7]=BT;
staticdoublec[3][7],b[7][7]=P;
Matrixmul(a,b,3,7,7,c);
printf(“\n”);
=2;
=6;
printf(“%\t”,c[i][j];
printf(“\n”);
return0;
2.计算BTPB,即NBB
staticdoublea[3][7]=BTP;
staticdoublec[3][3],b[7][3]=B;
Matrixmul(a,b,3,7,3,c);
3.计算BTPl,即W
staticdoublec[3][1],b[7][1]=l;
Matrixmul(a,b,3,7,1,c);
=0;
二、矩阵的逆计算函数(求NBB-1)
#include"
"
#defineM3
voidmain()
{
floatMAT[M][2*M];
floatMAT1[M][M];
floatt;
inti,j,k,l;
/***********************************************/
/*对矩阵进行初始化*/
M;
i++)
for(j=0;
2*M;
j++)
MAT1[j]='
\0'
;
/*对MAT1矩阵赋初值*/
for(j=0;
scanf("
%f"
&
MAT1[j]);
/*打印目标矩阵*/
printf("
原矩阵为:
\n"
);
for(i=0;
{
%"
MAT1[j]);
printf("
}/********************************************/
/*对MAT1矩阵进行扩展,MAT1矩阵添加单位阵,由M*M变成2M*2M矩阵*/
if(j<
M)MAT[j]=MAT1[j];
elseif(j==M+i)MAT[j]=1;
elseMAT[j]=0;
/*对M矩阵进行变换,使得前半部分矩阵成为单位阵,则*/
/*后半部分矩阵即为所求矩阵逆阵*/
/*对第i行进行归一化*/
for(k=i+1;
k<
k++)
MAT[j]=MAT[j]+MAT[k][j];
t=MAT;
for(j=i;
MAT[j]=MAT[j]/t;
/*对矩阵进行行变换,使得第i列只有一个元素不为零,且为1*/
for(k=0;
if(k!
=i)
t=MAT[k];
for(l=i;
l++)
MAT[k][l]=MAT[k][l]-MAT[l]*t;
}
}
/*将后半部分矩阵即所求矩阵逆阵存入MAT2矩阵。
*/
MAT1[j]=MAT[j+M];
/*********************************************/
/*输出所求的逆阵*/
逆阵为:
for(i=0;
4.求NBB-1W,即改正数x
staticdoublea[3][3]=NBB-1;
staticdoublec[3][1],b[3][1]=W;
Matrixmul(a,b,3,3,1,c);
5.计算Bx
staticdoublea[7][3]=B;
staticdoublec[7][1],b[3][1]=x;
Matrixmul(a,b,7,3,1,c);
6.计算VTP
staticdoublea[1][7]=VT;
staticdoublec[1][7],b[7][7]=P;
Matrixmul(a,b,1,7,7,c);
7.计算VTPV
staticdoublea[1][7]=VTP;
staticdoublec[1][1],b[7][1]=V;
Matrixmul(a,b,1,7,1,c);
注:
程序中有下划线部分在C语言环境中运行时,需根据已知条件及所求结果进行替换!
第六部分计算结果
根据条件方程及定权原则写出B、l、P及BT
B={{,,},
{,,},
{,,}}
l={{},
{},
{}}
P={{,,,,,,},
{,,,,,,},
{,,,,,,}}
BT={{,,,,,,},
{,,,,,,},
{,,,,,,}}
一、在矩阵相乘计算函数的程序前提下,进行以下子程序的调用
1.替换第1个程序中的BT、P并运行程序得到BTP
BTP={{,,,,,,},
2.替换第2个程序中的BTP、B并运行程序得到BTPB,即NBB
NBB={{,,},
{,,},
{,,}}
3.替换第3个程序中的BTP、l并运行程序得到BTPl,即W
W={{},
{},
{}}
二、在矩阵的逆计算函数程序中进行以下操作
运行程序,按照提示及以上运算得到的矩阵NBB输入其元素,运行的结果即为NBB-1NBB-1={{,,},
三、再次在矩阵相乘计算函数的程序前提下,进行以下子程序的调用
1.替换第4个程序中的NBB-1、W并运行程序得到NBB-1W,即所选参数的改正数x
x={{},
2.替换第5个程序中的B、x并运行程序得到Bx
Bx={{},
3.根据V=Bx-l求出各观测值的改正数V,并写出VT,然后替换第6个程序中的VT、P并运行程序得到VTP
V={{},
VT={{,,,,,,}}
VTP={{,,,,,,}}
4.替换第7个程序中的VTP、V并运行程序得到VTPV
VTPV=
四、求出各个观测值平差值并按要求平定精度
X3=mX4=mX5=m
h1=h2=h3=h4=h5=h6=h7=
根据公式可求得单位权中误差为
h34=X3-X4Q34=[1-10]NBB-1[1-10]T=
H3=X3Q34=[100]NBB-1[100]T=
H4=X4Q34=[010]NBB-1[010]T=
3、4点高差中误差为
3号点高程中误差为
4号点高程中误差为
第七部分总结
通过这次误差理论与测量平差的课程设计,我又对整本书有了一个更深的理解。
其实课程设计就是将我们所学的理论知识应用于实践的过程,在这一过程中,进一步掌握测量平差的基本原理和基本公式,并熟悉测量数据处理的基本技能和计算方法。
或许我们已对《误差理论与测量平差》这本书的理论知识有了一定了解,但将它应用于实践依然是我们的一个难点,尤其是将这门课程与计算机程序完美地结合。
这便要求我们在原有的解题思路中加入C语言程序,并让它来帮助我们解决矩阵的复杂运算。
既然用到了程序,我们就必须保证其运算的简洁性、正确性,尤其是在编写过程中要认真检查,为程序顺利运行打下基础。
另外在各个子程序调用过程中,我们要充分考虑其顺序性并反复调试,以便得到理想结果。
尽管在这次课程设计中遇到了很多困难,但我却得到了不少收获,并培养了自己正确应用公式、综合分析和解决问题的能力,同时也为今后步入社会打下了一定的基础。
另外,我们还要学会综合利用自身所学的知识,并将它们联系起来帮助自己有效地解决实际中的问题。
总之,在这次课程设计中我不但过了比较充实的一周,还收获了不少知识。
#include<
iostream>
fstream>
>
iomanip>
usingnamespacestd;
classSZWPC
private:
intgcz_zs;
//高差总数
intszd_zs;
//总点数
intyz_szd_zs;
//已知点数
doubles0;
//单位权水准路线长度
doublem_pvv;
//[pvv]
int*qsd_dh;
//高差起点号
int*zd_dh;
//高差终点号
char**dm;
//点名地址数组
double*gcz;
//观测值数组
double*szd_gc;
//高程值数组
double*P;
//观测值的权
double*BTPB,*BTPL;
//法方程系数矩阵与自由项
double*dX;
//高程改正数、平差值
double*V;
//残差
doublezwc;
//单位权中误差
public:
SZWPC();
~SZWPC();
intij(inti,intj);
//对称矩阵下标计算函数
boolinverse(doublea[],intn);
//对称正定矩阵求逆(仅存下三角元素)(参考他人)
voidinputdata(char*datafile);
//输入原始数据函数
intdm_dh(char*name);
//点名转点号
voidca_H0();
//近似高程计算函数
voidca_BTPB();
//法方程组成函数
voidca_dX();
//高程平差值计算函数
voidprintresult(char*resultfile);
//精度估计与平差值输出函数
doubleca_V();
//残差计算函数
voidzxecpc(char*resultfile);
//最小二乘平差函数
};
//////////构造函数
SZWPC:
:
SZWPC()
gcz_zs=0;
szd_zs=0;
yz_szd_zs=0;
//////析构函数
~SZWPC()
if(gcz_zs>
0)
delete[]qsd_dh;
delete[]zd_dh;
delete[]gcz;
delete[]P;
delete[]V;
if(szd_zs>
delete[]szd_gc;
delete[]BTPB;
delete[]BTPL;
delete[]dX;
for(inti=0;
i<
szd_zs;
if(dm[i]!
=NULL)delete[](dm[i]);
delete[]dm;
////////对称矩阵下标计算函数
intSZWPC:
ij(inti,intj)
return(i>
=j)i*(i+1)/2+j:
j*(j+1)/2+i;
//对称正定矩阵求逆(仅存下三角元素)
boolSZWPC:
inverse(doublea[],intn)
double*a0=newdouble[n];
for(intk=0;
n;
k++)
doublea00=a[0];
if(a00+==
delete[]a0;
returnfalse;
for(inti=1;
doubleai0=a[i*(i+1)/2];
if(i<
=n-k-1)a0[i]=-ai0/a00;
elsea0[i]=ai0/a00;
for(intj=1;
=i;
a[(i-1)*i/2+j-1]=a[i*(i+1)/2+j]+ai0*a0[j];
a[(n-1)*n/2+i-1]=a0[i];
a[n*(n+1)/2-1]=a00;
returntrue;
//////////原始数据输入函数
voidSZWPC:
inputdata(char*datafile)
ifstreaminfile(datafile,ios:
in);
//声明输入句柄infile打开地址为datafile的文件并
if(!
infile)
cerr<
<
Openerror!
endl;
infile>
gcz_zs>
szd_zs>
yz_szd_zs;
s0;
szd_gc=newdouble[szd_zs];
dX=newdouble[szd_zs];
BTPB=newdouble[szd_zs*(szd_zs+1)/2];
BTPL=newdouble[szd_zs];
qsd_dh=newint[gcz_zs];
zd_dh=newint[gcz_zs];
gcz=newdouble[gcz_zs];
V=newdouble[gcz_zs];
P=newdouble[gcz_zs];
dm=newchar*[szd_zs];
dm[i]=NULL;
//dm_dh函数根据dm[i]是否为NULL确定dm[i]是否为点名地址
charbuffer[128];
//临时数组,保存从文件中读到的点名
=yz_szd_zs-1;
i++)//读取已知高程数据
buffer;
intc=dm_dh(buffer);
szd_gc[i];
gcz_zs;
i++)//读取观测数据
//读取高程起点名
qsd_dh[i]=dm_dh(buffer);
//读取高程终点
zd_dh[i]=dm_dh(buffer);
gcz[i]>
P[i]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 误差 理论 测量 课程设计 报告