误差理论与测量平差上机指导书.docx

上传人:b****9 文档编号:25199621 上传时间:2023-06-06 格式:DOCX 页数:26 大小:64.71KB
下载 相关 举报
误差理论与测量平差上机指导书.docx_第1页
第1页 / 共26页
误差理论与测量平差上机指导书.docx_第2页
第2页 / 共26页
误差理论与测量平差上机指导书.docx_第3页
第3页 / 共26页
误差理论与测量平差上机指导书.docx_第4页
第4页 / 共26页
误差理论与测量平差上机指导书.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

误差理论与测量平差上机指导书.docx

《误差理论与测量平差上机指导书.docx》由会员分享,可在线阅读,更多相关《误差理论与测量平差上机指导书.docx(26页珍藏版)》请在冰豆网上搜索。

误差理论与测量平差上机指导书.docx

误差理论与测量平差上机指导书

 

误差理论与测量平差上机指导书

 

辽宁工程技术大学

测绘与地理科学学院测绘工程系

 

 

实验1矩阵加法与乘法运算

一、实验名称:

矩阵加法与乘法运算。

二、实验目的和任务:

掌握矩阵加法与乘法通用程序的编写。

三、实验要求:

1每人独立编写出矩阵加法与乘法的程序,并上机调试通过;

2采用VC++6.0开发平台,C或者C++语言编写程序;

3写出矩阵运算的结果。

四、实验内容:

1矩阵加法的示例函数(C语言)

voidJZjiafa(doublea[15][15],doubleb[15][15],doublec[15][15],intm,intn)

{

for(inti=0;i<=m-1;i++)

for(intj=0;j<=n-1;j++)

{

c[i][j]=a[i][j]+b[i][j];

}

return;

}

2矩阵乘法的示例程序(C语言)

#include"stdafx.h"

voidmatrixMultiply(doublea[14][15],doubleb[15][13],doublec[14][13],longm,longn,longk)

{

for(longi=0;i<=m-1;i++)

{

for(longj=0;j<=k-1;j++)

{

c[i][j]=0.0;

for(longq=0;q<=n-1;q++)

{

c[i][j]=c[i][j]+a[i][q]*b[q][j];

}

}

}

return;

}

intmain(intargc,char*argv[])

{

longn,m,k,i,j;

doublea[14][15],c[14][13],b[15][13];

FILE*stream;

stream=fopen("矩阵输入.txt","r");

fscanf(stream,"%ld%ld",&n,&m);

for(i=0;i

{

for(j=0;j

{

fscanf(stream,"%lf",&a[i][j]);

}

}

fscanf(stream,"%ld%ld",&m,&k);

for(i=0;i

{

for(j=0;j

{

fscanf(stream,"%lf",&b[i][j]);

}

}

fclose(stream);

matrixMultiply(a,b,c,4,5,3);

stream=fopen("矩阵计算结果.txt","w");

for(i=0;i<=3;i++)

{

for(j=0;j<=2;j++)

fprintf(stream,"%16.7e",c[i][j]);

fprintf(stream,"\n");

}

fprintf(stream,"\n");

fclose(stream);

return0;

}

 

实验2矩阵转置与求逆运算

一、实验名称:

矩阵转置与求逆运算。

二、实验目的和任务:

掌握矩阵转置的编写,会调用矩阵求逆函数。

三、实验要求:

1每人独立编写出矩阵转置的程序,并上机调试通过;

2每人独立完成矩阵求逆函数的调用,并调试通过;

3采用VC++6.0开发平台,C或者C++语言编写程序;

4写出矩阵运算的结果。

四、实验内容:

i.矩阵的转置示例函数(C语言)

doubleJZzhuanzhi(doublea[15][15],doubleb[15][15],intm,intn)

{

{

for(inti=0;i

for(intj=0;j

b[j][i]=a[i][j];

}

return0.0;

}

ii.矩阵求逆的示例函数(C语言)

intinvGJ(double**a,intn)

{

int*is,*js,i,j,k,l,u,v;

doubled,p;

is=(int*)malloc(n*sizeof(int));

js=(int*)malloc(n*sizeof(int));

for(k=0;k<=n-1;k++)

{

d=0.0;

for(i=k;i<=n-1;i++)

for(j=k;j<=n-1;j++)

{

l=i*n+j;p=fabs(a[i][j]);

if(p>d)

{d=p;is[k]=i;js[k]=j;}

}

if(d+1.0==1.0)

{

free(is);free(js);printf("errornotinv\n");

return(0);

}

if(is[k]!

=k)

for(j=0;j<=n-1;j++)

{

u=k*n+j;v=is[k]*n+j;

p=a[k][j];a[k][j]=a[is[k]][j];a[is[k]][j]=p;

}

if(js[k]!

=k)

for(i=0;i<=n-1;i++)

{

u=i*n+k;v=i*n+js[k];

p=a[i][k];a[i][k]=a[i][js[k]];a[i][js[k]]=p;

}

l=k*n+k;

a[k][k]=1.0/a[k][k];

for(j=0;j<=n-1;j++)

if(j!

=k)

{

u=k*n+j;a[k][j]=a[k][j]*a[k][k];

}

for(i=0;i<=n-1;i++)

if(i!

=k)

for(j=0;j<=n-1;j++)

if(j!

=k)

{

u=i*n+j;

a[i][j]=a[i][j]-a[i][k]*a[k][j];

}

for(i=0;i<=n-1;i++)

if(i!

=k)

{

u=i*n+k;a[i][k]=-a[i][k]*a[k][k];

}

}

for(k=n-1;k>=0;k--)

{

if(js[k]!

=k)

for(j=0;j<=n-1;j++)

{

u=k*n+j;v=js[k]*n+j;

p=a[k][j];a[k][j]=a[js[k]][j];a[js[k]][j]=p;

}

if(is[k]!

=k)

for(i=0;i<=n-1;i++)

{

u=i*n+k;v=i*n+is[k];

p=a[i][k];a[i][k]=a[i][is[k]];a[i][is[k]]=p;

}

}

free(is);free(js);

return

(1);

}intinvGJ(double**a,intn)

{

int*is,*js,i,j,k,l,u,v;

doubled,p;

is=(int*)malloc(n*sizeof(int));

js=(int*)malloc(n*sizeof(int));

for(k=0;k<=n-1;k++)

{

d=0.0;

for(i=k;i<=n-1;i++)

for(j=k;j<=n-1;j++)

{

l=i*n+j;p=fabs(a[i][j]);

if(p>d)

{d=p;is[k]=i;js[k]=j;}

}

if(d+1.0==1.0)

{

free(is);free(js);printf("errornotinv\n");

return(0);

}

if(is[k]!

=k)

for(j=0;j<=n-1;j++)

{

u=k*n+j;v=is[k]*n+j;

p=a[k][j];a[k][j]=a[is[k]][j];a[is[k]][j]=p;

}

if(js[k]!

=k)

for(i=0;i<=n-1;i++)

{

u=i*n+k;v=i*n+js[k];

p=a[i][k];a[i][k]=a[i][js[k]];a[i][js[k]]=p;

}

l=k*n+k;

a[k][k]=1.0/a[k][k];

for(j=0;j<=n-1;j++)

if(j!

=k)

{

u=k*n+j;a[k][j]=a[k][j]*a[k][k];

}

for(i=0;i<=n-1;i++)

if(i!

=k)

for(j=0;j<=n-1;j++)

if(j!

=k)

{

u=i*n+j;

a[i][j]=a[i][j]-a[i][k]*a[k][j];

}

for(i=0;i<=n-1;i++)

if(i!

=k)

{

u=i*n+k;a[i][k]=-a[i][k]*a[k][k];

}

}

for(k=n-1;k>=0;k--)

{

if(js[k]!

=k)

for(j=0;j<=n-1;j++)

{

u=k*n+j;v=js[k]*n+j;

p=a[k][j];a[k][j]=a[js[k]][j];a[js[k]][j]=p;

}

if(is[k]!

=k)

for(i=0;i<=n-1;i++)

{

u=i*n+k;v=i*n+is[k];

p=a[i][k];a[i][k]=a[i][is[k]];a[i][is[k]]=p;

}

}

free(is);free(js);

return

(1);

}

iii.矩阵求逆函数的调用(C语言)

#include

#include

#include

intinvGJ(double**a,intn);

voidmain()

{

inti,j;

double**AA;

//首先对二维指针Naa分配内存,采用C语言的方法

/*AA=(double**)malloc(sizeof(double)*2);

for(i=0;i<2;i++)

{

AA[i]=(double*)mallo(sizeof(double)*2);

}

*/

//首先对二维指针Naa分配内存,采用C++语言的方法

AA=newdouble*[2];

for(i=0;i<2;i++)

{

AA[i]=newdouble[2];

}

doubleBB[2][2]={1,2,3,4};

for(i=0;i<2;i++)

{

for(j=0;j<2;j++)

{

AA[i][j]=BB[i][j];

}

}

//调用矩阵求逆函数

invGJ(AA,2);

printf("矩阵AA的逆阵如下\n");

for(i=0;i<2;i++)

{

for(j=0;j<2;j++)

{

printf("%10.4lf",AA[i][j]);

}

printf("\n");

}

doubleCC[2][2];

printf("AA与其逆阵的乘积如下(理论上是单位阵)\n");

for(i=0;i<2;i++)

{

for(j=0;j<2;j++)

{

CC[i][j]=0.0;

for(intk=0;k<2;k++)

{

CC[i][j]+=AA[i][k]*BB[k][j];

}

printf("%10.4lf",CC[i][j]);

}

printf("\n");

}

//C语言释放AA二维指针的方法

/*for(i=0;i<2;i++)

{

free(AA[i]);

}

free(AA);

*/

//C++语言释放AA二维指针的方法

for(i=0;i<2;i++)

{

deleteAA[i];

}

deleteAA;

}

实验3误差椭圆元素计算

一、实验名称:

误差椭圆元素计算。

二、实验目的和任务:

掌握误差椭圆和相对误差椭圆元素的计算公式,并采用C或者C++语言变成实现。

三、实验要求:

1每人独立编写出误差椭圆和相对误差椭圆元素的计算程序,并调试通过;

2采用VC++6.0开发平台,C或者C++语言编写程序;

3写出计算的结果。

4本实验属于综合性,设计性实验,对学生的要求比较高,会综合使用矩阵加法,乘法以及转置和求逆的程序。

5注意事项:

坐标方位角计算时必须考虑X与Y所在的象限。

四、实验内容:

参考教材《测量平差》P103-P112。

具体的例子可以参考P111页的例题,进行程序的调试。

(一)误差椭圆元素计算公式:

(二)相对误差椭圆元素计算公式:

五、例子(P111)

在某三角网中插入P1及P2两个新点。

设用间接平差法平差。

平差之后这两点之间的协因数阵如下:

根据以上的公式,分别计算出未知点P1和P2的误差椭圆元素以及这两点之间的相对误差椭圆元素。

实验4水准网间接平差程序设计

一、实验名称:

水准网间接平差程序设计

二、实验目的:

掌握用间接平差法对任意网形的水准网进行平差的算法设计以及程序编制;并学习采用读文件处理数据的方法。

三、实验任务:

用C/C++编写水准网间接平差程序,并调试通过,用实测数据实算分析;同时评定精度。

四、实验要求:

1个人独立编写程序,原始数据存放于文本文件或者数据库文件中;

2程序应该具有通用性,即任意网形都可以平差;

3用实测的数据进行计算分析。

4评定待定点的高程精度。

五、实验内容

1数据文件的编制格式

总点数未知点数测段数(观测高差的个数)

已知点1点名高程

已知点2点名高程

未知点3点名0

未知点4点名0

未知点5点名0

起点点号终点点号观测高差路线长度(km)

起点点号终点点号观测高差路线长度(km)

起点点号终点点号观测高差路线长度(km)

2平差原理

由观测值的起始和终点号或者水准网网形,形成误差方程的系数矩阵B(也叫设计矩阵),由观测的路线长度形成观测高差的权阵P(观测值独立,P为对角阵),

原理如下:

(C为任意常数)

3法方程系数矩阵与闭合差的自动累加

由于N和W具有可加性,即每读取一个高差观测值,即可得到一个误差方程的系数向量,然后累加到法方程系数矩阵与闭合差中;当高差观测值读取完毕的时候,法方程系数矩阵与闭合差也累加完毕;此时可用公式直接计算待定点高程的改正数,加上高程近似值,就得到了高程的平差值。

4精度评定

验后单位权中误差:

待定点高程(未知参数)的协因数阵:

待定点高程的方差:

改正数V的协因数阵:

高差平差值的协因数阵:

5例子1(P79)

(1)in.txt文件

435

1A237.483

2B0.0

3C0.0

4D0.0

125.8353.5

233.7822.7

139.6404.0

437.3843.0

142.2702.5

(2)源程序

//Gckzwpc.h头文件代码

classCGckzwpc

{

public:

CGckzwpc();

virtual~CGckzwpc();

public:

boolReadData(CStringfilename);//读水准网平差数据文件

voidpc();//平差函数

voidjdpd();//精度评定函数

intinvGJ(double**a,intn);//求逆函数

intnz,nw,ne,nn;//文件头信息:

总点数,未知点数,已知点数,测段数

intn1[20],n2[20];//存放高差起点与终点的点号

doubleH[50],h[50],W[20],X[20],B[50][20],V[50],VPV;

double**Nbb,S[50],l[50],P[50],ph[50];

CStringdm[20];//控制点点名

doubleSIG0,DX[20][20];

};

//Gckzwpc.cpp代码

boolCGckzwpc:

:

ReadData(CStringfilename)

{

inti;

intMAXLINE=512;

charbuff[513],ch1[15];

CStdioFilefp;

if(!

fp.Open(filename,CFile:

:

modeRead|CFile:

:

typeText,NULL))

{

AfxGetApp()->m_pMainWnd->MessageBox(

"数据文件不存在或数据文件错!

",

"进程......!

!

!

",MB_OK|MB_ICONSTOP);

_exit

(1);

returnFALSE;

}

fp.ReadString(buff,MAXLINE);

sscanf(buff,"%d%d%d",&nz,&nw,&nn);

ne=nz-nw;

intdh;

doublegc;

for(i=0;i

{

fp.ReadString(buff,MAXLINE);

sscanf(buff,"%d%s%lf",&dh,ch1,&gc);

dm[i]=ch1;H[i]=gc;

}

for(i=0;i

{

fp.ReadString(buff,MAXLINE);

sscanf(buff,"%d%d%lf%lf",

&n1[i],&n2[i],&h[i],&S[i]);

}

fp.Close();

returnTRUE;

}

voidCGckzwpc:

:

pc()

{

inti,j,k;

//doubleNbb1[20][20];

Nbb=newdouble*[nw];

for(i=0;i

Nbb[i]=newdouble[nw];

for(i=0;i

{

P[i]=0.0;

l[i]=0.0;

for(j=0;j

B[i][j]=0.0;

}

for(i=0;i

{

if(n1[i]>ne)B[i][n1[i]-ne-1]=-1;

if(n2[i]>ne)B[i][n2[i]-ne-1]=+1;

P[i]=1/S[i];

l[i]=H[n1[i]-1]+h[i]-H[n2[i]-1];

}

for(i=0;i

{

for(j=0;j

{

Nbb[i][j]=0.0;

for(k=0;k

{

Nbb[i][j]+=B[k][i]*B[k][j]*P[k];

}

}

}

for(i=0;i

{

W[i]=0.0;

for(k=0;k

{

W[i]+=B[k][i]*P[k]*l[k];

}

}

invGJ(Nbb,nw);

for(i=0;i

{

X[i]=0.0;

for(k=0;k

{

X[i]+=Nbb[i][k]*W[k];

}

}

}

//精度评定函数

voidCGckzwpc:

:

jdpd()

{

inti,j,k;

FILE*fp;

fp=fopen("out.txt","w");

VPV=0.0;

for(i=0;i

{

V[i]=0.0;

for(k=0;k

{

V[i]+=B[i][k]*X[k];

}

V[i]+=-l[i];

VPV+=V[i]*V[i]*P[i];

ph[i]=h[i]+V[i];

}

//计算验后单位权中误差

SIG0=sqrt(VPV/(nn-nw));

//计算未知参数的方差

for(i=0;i

{

for(j=0;j

{

DX[i][j]=SIG0*SIG0*Nbb[i][j];

}

}

doubleQLL[50][50],SIGL[50][50];

//计算观测值的平差值的中误差QLL=B*inv(Nbb)*BTDLL=SIG0*SIG0*QLL

for(i=0;i

{

for(j=0;j

{

QLL[i][j]=0.0;

SIGL[i][j]=0.0;

for(k=0;k

{

for(intm=0;m

{

QLL[i][j]+=Nbb[k][m]*B[i][k]*B[j][m];

}

}

SIGL[i][j]=SIG0*sqrt(QLL[i][j]);

}

}

fprintf(fp,"********水准网间接平差结果**********\n\n");

fprintf(fp,"总点数=%3d未知点数=%3d测段数=%3d\n",

nz,nw,nn);

fprintf(fp,"\n验后单位权中误差=%6.2lf(mm)\n\n",SIG0*1000);

fprintf(fp,"\n起点号终点号观测高差(m)路线长(km)改正数(mm)平差高差(m)中误差(mm)\n");

for(i=0;i

{

fprintf(fp,"%3d%3d%8.4lf%8.4lf%8.2lf%8.4lf%8.2lf\n",

n1[i],n2[i],h[i],S[i],V[i]*1000,ph[i],SIGL[i][i]*1000);

}

fprintf(fp,"\n\n已知点已知高程(m)\n");

for(i=0;i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1