误差理论与测量平差上机指导书辽宁工程技术大学测绘与地理科学学院测绘工程系误差理论与测量平差上机指导书目录实验1矩阵加法与乘法运算.................................................................................1实验2矩阵转置与求逆运算.................................................................................3实验3误差椭圆元素计算....................................................................................11实验4水准网间接平差程序设计.......................................................................12误差理论与测量平差上机指导书1实验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语言)#includestdafx.hvoidmatrixMultiply(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++){误差理论与测量平差上机指导书2c[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;in;i++){for(j=0;jm;j++){fscanf(stream,%lf,&a[i][j]);}}fscanf(stream,%ld%ld,&m,&k);for(i=0;im;i++){for(j=0;jk;j++){fscanf(stream,%lf,&b[i][j]);}}fclose(stream);误差理论与测量平差上机指导书3matrixMultiply(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){{误差理论与测量平差上机指导书4for(inti=0;im;i++)for(intj=0;jn;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(pd){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;误差理论与测量平差上机指导书5p=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)误差理论与测量平差上机指导书6for(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(pd){d=p;is[k]=i;js[k]=j;}}if(d+1.0==1.0){free(is);free(js);printf(errornotinv\n);误差理论与测量平差上机指导书7return(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){误差理论与测量平差上机指导书8u=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语言)#includestdio.h#includestdlib.h#includemath.hintinvGJ(double**a,intn);voidmain(){inti,j;double**AA;误差理论与测量平差上机指导书9//首先对二维指针Naa分配内存,采用C语言的方法/*AA=(double**)malloc(sizeof(double)*2);for(i=0;i2;i++){AA[i]=(double*)mallo(sizeof(double)*2);}*///首先对二维指针Naa分配内存,采用C++语言的方法AA=newdouble*[2];for(i=0;i2;i++){AA[i]=newdouble[2];}doubleBB[2][2]={1,2,3,4};for(i=0;i2;i++){for(j=0;j2;j++){AA[i][j]=BB[i][j];}}//调用矩阵求逆函数invGJ(AA,2);printf(矩阵AA的逆阵如下\n);for(i=0;i2;i++){for(j=0;j2;j++){printf(%10.4lf,AA[i][j]);}printf(\n);误差理论与测量平差上机指导书10}doubleCC[2][2];printf(AA与其逆阵的乘积如下(理论上是单位阵)\n);for(i=0;i2;i++){for(j=0;j2;j++){CC[i][j]=0.0;for(intk=0;k2;k++){CC[i][j]+=AA[i][k]*BB[k][j];}printf(%10.4lf,CC[i][j]);}printf(\n);}//C语言释放AA二维指针的方法/*for(i=0;i2;i++){free(AA[i]);}free(AA);*///C++语言释放AA二维指针的方法for(i=0;i2;i++){deleteAA[i];}deleteAA;}误差理论与测量平差上机指导书11实验3误差椭圆元素计算一、实验名称:误差椭圆元素计算。二、实验目的和任务:掌握误差椭圆和相对误差椭圆元素的计算公式,并采用C或者C++语言变成实现。三、实验要求:1每人独立编写出误差椭圆和相对误差椭圆元素的计算程序,并调试通过;2采用VC++6.0开发平台,C或者C++语言编写程序;3写出计算的结果。4本实验属于综合性,设计性实验,对学生的要求比较高,会综合使用矩阵加法,乘法以及转置和求逆的程序。5注意事项:坐标方位角计算时必须考虑X与Y所在的象限。四、实验内容:参考教材《测量平差》P10