测量平差课程设计实验报告_第1页
测量平差课程设计实验报告_第2页
测量平差课程设计实验报告_第3页
测量平差课程设计实验报告_第4页
测量平差课程设计实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

测量平差课程设计学院:专业:班级:姓名:学号:指导教师:、任务概述1、任务背景条件平差课程设计是在继大学二年级完成误差理论与测量平差基础课程之后所开设的一门实践性课程,以便于学生更加巩固与运用这些知识,并培养学生的综合应用能力。2、软件说明本程序采用C#语言编写完成,旨在计算条件平差中的改正数矩阵,具体所参考例题在平差教材99页例5-8,网形为水准网。具有四个误差方程。二、平差原理如果一个几何模型中有r个多余观测,就会产生r个多余方程,就产生r个条件方程,以条件方程为函数模型的平差方法叫做条件平差。条件平差原理:AV+W=0D=O02Q=O02P-1平差准则为:VTPV=min法方程:NAA平差准则为:VTPV=min法方程:NAAK+W=0解为:K=-NAA-1W改正数方程:V=QATK三、系统设计总体框架及模块划分:数据输入:本程序采用Excel表格输入数据预处理:本程序需要现在纸上写出条件方程,并将条件方程系数填入上图Excel表中。平差计算成果输出实用工具采用visualstudio2013所支持的C#语言的Windows窗体应用程序进行编程。四、平差计算流程1、 首先用矩阵读取datagridview1中的观测高差列,条件方程系数,与W矩阵,在这,我是先用数组进行读取,再利用循环语句将其赋予到矩阵之中。2、 利用之前封装的矩阵相乘,求交,求逆,与转置代码进行相应的矩阵运算,具体计算步骤参考之前的平差计算原理。(矩阵运算代码张瑞娅老师学习通里有过讲解)3、 再将运算的结果输入到datagridview表格中,程序运行结束。五、代码Excel输入代码:dataGridViewl.DataSource=null;dataGridViewl.Rows.Clear();dataGridViewl.Columns.Clear();OpenFileDialogfile=newOpenFileDialogO;file.Filter="Excel文件|*.xls|Excel文件|*.xlsx";if(file.ShowDialogO==DialogResult.OK){stringfname=file.FileName;stringstrSource="provider二Microsoft.ACE.OLEDB.12.O;"+"DataSource二"+fname+";ExtendedProperties='Excel8.0;HDR=Yes;IMEX=1'";OleDbConnectionconn=newOleDbConnection(strSource);stringsqlstring="SELECT*FROM[Sheetl$]";OleDbDataAdapteradapter=newOleDbDataAdapter(sqlstring,conn);DataSetda=newDataSet();adapter.Fill(da);dataGridViewl.DataSource=da.Tables[O];}elsereturn;矩阵运算代码://矩阵转置publicdouble],]tranMatrix(double[,]a){intm,n;m=a.GetLength(0); //获取二维数组即矩阵中第一维的长度,即行数n=a.GetLength(l);//获取矩阵中第二维的长度,即列数double[,]b=newdouble[n,m]; //定义新的矩阵为n行m列,用于存放转置后矩阵for(inti二0;i<n;i++)for(intj二0;j<m;j++)b[i,j]=a[j,i];returnb;}//矩阵相乘publicdouble],]MultiplyMatrix(double[,]a,double[,]b){intm,n,M,N;m=a.GetLength(0);//获取a,b两个矩阵的行列数n=a.GetLength(l);M=b.GetLength(0);N=b.GetLength(1);double[,]c=newdouble[m,N];//定义新的矩阵为m行N列,用于存放相乘后矩阵if(n!=M)MessageBox.Show(“输入的两个矩阵不能相乘!");//检查矩阵a的列数是否等于b的行数else{for(inti二0;i<m;i++)for(intj二0;j<N;j++){doublesum=0;for(intk=0;k<n;k++)sum+=a[i,k]*b[k,j];//将矩阵a的第i行与b的第j列对应相乘再相加c[i,j]=sum;}}returnc;}//矩阵求逆一首先计算矩阵对应行列式的值publicstaticdoubleMatrixValue(double[,]MatrixList)//首先需要计算行列式的值|A|,如果为0说明不可逆//计算行列式的方法//ala2a3//b1b2b3//c1c2c3//结果为a1・b2・c3+b1•c2•a3+c1•a2•b3-a3•b2•c1-b3•c2•a1-c3・a2・b1(注意对角线就容易记住了){intLevel=MatrixList.GetLength(0); //获取矩阵维数double[,]dMatrix=newdouble[Level,Level];//定义二维数组,行列数相同for(inti二0;i<Level;i++)for(intj=0;j<Level;j++)dMatrix[i,j]=MatrixList[i,j];//将参数的值,赋值给定义的数组doublec,x;intk=1;for(inti二0,j=0;i<Level&&j<Level;i++,j++){if(dMatrix[i,j]==0)//判断对角线上的数据是否为0(从i=j=0即第一个数据开始){intm=i;for(;dMatrix[m,j]==0;m++);//如果对角线上数据为0,从该数据开始依次往后判断该列是否为0if(m==Level)//当该列从对角线数据开始数据都为0的时候返回0return0;else{//Rowchangebetweeni-rowandm-row从对角线数据开始交换第i行和第m行数据,因为对角线之前都是0for(intn二j;n<Level;n++){c=dMatrix[i,n];dMatrix[i,n]=dMatrix[m,n];dMatrix[m,n]=c;}//Changevaluepre-value交换两行后行列式变号k*=(-1);}}//Set0tothecurrentcolumnintherowsaftercurrentrow化成下三角for(ints=Level-1;s>i;s—){x=dMatrix[s,j];for(intt二j;t<Level;t++)dMatrix[s,t]-二dMatrix[i,t]*(x/dMatrix[i,j]);}}doublesn=1;for(inti=0;i<Level;i++)//化成下三角后,行列式值为对角线相乘{if(dMatrix[i,i]!=0)sn*=dMatrix[i,i];elsereturn0;}returnk*sn;}//矩阵相加publicdouble],]MatrixAdd(double[,]A,double[,]B){introwA=A.GetLength(0);intcolA=A.GetLength(l);introwB=B.GetLength(0);intcolB=B.GetLength(l);double],]C=newdouble[rowA,colA];try{for(inti二0;i<rowA;i++){for(intj=0;j<colA;j++){C[i,j]=A[i,j]+B[i,j];}returnC;catch{System.Exceptionexp二newException(“相加的两个矩阵行数或者列数不相等,不能相加!〃);throwexp;}}//矩阵求逆一开始求逆publicstaticdouble[,]ReverseMatrix(double[,]dMatrix)//开始求逆{intLevel=dMatrix.GetLength(0); //获取矩阵维数doubledMatrixValue=MatrixValue(dMatrix);//求取矩阵的行列式值if(dMatrixValue==0)returnnull;//A为该矩阵若|A|=0则该矩阵不可逆返回空double[,]dReverseMatrix二newdouble[Level,2*Level];//列为行的2倍,用于存放单位阵Idoublex,c;//InitReversematrixfor(inti=0;i<Level;i++)//创建一个矩阵(A|I)以对其进行初等变换求得其矩阵的逆{for(intj=0;j<2*Level;j++){if(j<Level)dReverseMatrix[i,j]=dMatrix[i,j];//该(A|I)矩阵前Level列为矩阵A后面为数据全部为0elsedReverseMatrix[i,j]=0;}dReverseMatrix[i.Level+i]=1;//将Level+1行开始的Level阶矩阵装换为单位矩阵(起初的时候该矩阵都为0现在在把对角线位置装换为1)//参考/gaosuzk/content/lljx/wzja/12/12-6.htm}for(inti二0,j=0;i<Level&&j<Level;i++,j++){if(dReverseMatrix[i,j]==0)//判断一行对角线是否为0{intm=i;for(;dMatrix[m,j]==0;m++);if(m==Level)returnnull;//某行对角线为0的时候判断该行该数据所在的列在该数据后是否为0都为0的话不可逆返回空值else{//Addi-rowwithm-rowfor(intn=j;n<2*Level;n++)//如果对角线为0则该i行加上m行m行为(初等变换要求对角线为1,0—>1先加上某行,下面在变1)dReverseMatrix[i,n]+=dReverseMatrix[m,n];}}//此时数据:第二行加上第一行为第一行的数据TOC\o"1-5"\h\z//1 1 3 1 1 0//1 0 1 0 1 0//4 2 1 0 0 1////Formatthei-rowwith"T"startx=dReverseMatrix[i,j];if(x!=1)//如果对角线元素不为1执行以下{for(intn二j;n<2*Level;n++)if(dReverseMatrix[i,n]!=0)dReverseMatrix[i,n]/=x;//相除使i行第一个数字为1}//Set0tothecurrentcolumnintherowsaftercurrentrowfor(ints=Level-1;s>i;s—)//该对角线数据为1时,这一列其他数据要转换为0{x=dReverseMatrix[s,j];//第一次时//113110//101010//4(x)21001//for(intt二j;t<2*Level;t++)dReverseMatrix[s,t]-二(dReverseMatrix[i,t]*x);//第一个轮回用第一行*4减去第三行为第三行的数据依次类推//113110//101010//0(x)-2-11-4-41}}//Formatthefirstmatrixintounit-matrixfor(inti二Level-2;i>=0;i--)//处理第一行二列的数据思路如上就是把除了对角线外的元素转换为0{for(intj=i+1;j<Level;j++)if(dReverseMatrix[i,j]!=0){c=dReverseMatrix[i,j];for(intn二j;n<2*Level;n++)dReverseMatrix[i,n]-二(c*dReverseMatrix[j,n]);}}double[,]dReturn=newdouble[Level,Level];for(inti二0;i<Level;i++)for(intj=0;j<Level;j++)dReturn[i,j]=dReverseMatrix[i,j+Level];//就是把Level阶的矩阵提取出来(减去原先为单位矩阵的部分)}计算代码:returndReturn;double[]h=newdouble[7];//新建一个数组存放观测高差double[]s=newdouble[7];double[]v1=newdouble[4];//输入条件方程系数double[]v2=newdouble[4];double[]v3=newdouble[4];double[]v4=newdouble[4];double[]v5=newdouble[4];double[]v6=newdouble[4];double[]v7=newdouble[4];double[]w=newdouble[4];for(inti二0;i<4;i++){v1[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[4].Value);//读取表格中数据v2[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[5].Value);v3[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[6].Value);v4[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[7].Value);v5[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[8].Value);v6[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[9].Value);v7[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[10].Value);w[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[ll].Value);}for(inti二0;i<h.Length;i++){h[i]=Convert.ToDouble(dataGridViewl.Rows[i].Cells[2].Value);//获取第一个观测高差s[i]Convert.ToDouble(dataGridViewl.Rows[i].Cells[l].Value);}double[]p=newdouble[h.Length];for(inti二0;i<h.Length;i++){p[i]=1/s[i];//根据长度计算权}double[,]A=newdouble[4,7];//新建一个二维矩阵存放条件平差方程矩阵Afor(inti二0;i<4;i++){A[i,0]=v1[i];A[i,1]=v2[i];A[i,2]=v3[i];A[i,3]=v4[i];A[i,4]=v5[i];A[i,5]=v6[i];A[i,6]=v7[i];}double[,]P=newdouble[7,7];//新建一个矩阵存放测段距离for(inti二0;i<7;i++){P[i,i]=p[i];}double[,]W=newdouble[4,l];for(inti二0;i<4;i++){W[i,0]=w[i];//新建一个矩阵存放W}double[,]H=newdouble[h.Length,1];//新建一个矩阵存放改正后高差for(inti二0;i<7;i++){H[i,0]=h[i];}double],]Q=ReverseMatrix(P);//计算Q矩阵double],]NA1=MultiplyMa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论