測量平差課程設計實驗報告_第1頁
測量平差課程設計實驗報告_第2頁
測量平差課程設計實驗報告_第3頁
測量平差課程設計實驗報告_第4頁
測量平差課程設計實驗報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

測量平差課程設計學院:專業(yè):班級:姓名:學號:指導教師:、任務概述1、任務背景條件平差課程設計是在繼大學二年級完成誤差理論與測量平差基礎課程之后所開設的一門實踐性課程,以便于學生更加鞏固與運用這些知識,并培養(yǎng)學生的綜合應用能力。2、軟件說明本程序采用C#語言編寫完成,旨在計算條件平差中的改正數(shù)矩陣,具體所參考例題在平差教材99頁例5-8,網(wǎng)形為水準網(wǎng)。具有四個誤差方程。二、平差原理如果一個幾何模型中有r個多余觀測,就會產(chǎn)生r個多余方程,就產(chǎn)生r個條件方程,以條件方程為函數(shù)模型的平差方法叫做條件平差。條件平差原理:AV+W=0D=O02Q=O02P-1平差準則為:VTPV=min法方程:NAA平差準則為:VTPV=min法方程:NAAK+W=0解為:K=-NAA-1W改正數(shù)方程:V=QATK三、系統(tǒng)設計總體框架及模塊劃分:數(shù)據(jù)輸入:本程序采用Excel表格輸入數(shù)據(jù)預處理:本程序需要現(xiàn)在紙上寫出條件方程,并將條件方程系數(shù)填入上圖Excel表中。平差計算成果輸出實用工具采用visualstudio2013所支持的C#語言的Windows窗體應用程序進行編程。四、平差計算流程1、 首先用矩陣讀取datagridview1中的觀測高差列,條件方程系數(shù),與W矩陣,在這,我是先用數(shù)組進行讀取,再利用循環(huán)語句將其賦予到矩陣之中。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); //獲取二維數(shù)組即矩陣中第一維的長度,即行數(shù)n=a.GetLength(l);//獲取矩陣中第二維的長度,即列數(shù)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兩個矩陣的行列數(shù)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的列數(shù)是否等于b的行數(shù)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); //獲取矩陣維數(shù)double[,]dMatrix=newdouble[Level,Level];//定義二維數(shù)組,行列數(shù)相同for(inti二0;i<Level;i++)for(intj=0;j<Level;j++)dMatrix[i,j]=MatrixList[i,j];//將參數(shù)的值,賦值給定義的數(shù)組doublec,x;intk=1;for(inti二0,j=0;i<Level&&j<Level;i++,j++){if(dMatrix[i,j]==0)//判斷對角線上的數(shù)據(jù)是否為0(從i=j=0即第一個數(shù)據(jù)開始){intm=i;for(;dMatrix[m,j]==0;m++);//如果對角線上數(shù)據(jù)為0,從該數(shù)據(jù)開始依次往后判斷該列是否為0if(m==Level)//當該列從對角線數(shù)據(jù)開始數(shù)據(jù)都為0的時候返回0return0;else{//Rowchangebetweeni-rowandm-row從對角線數(shù)據(jù)開始交換第i行和第m行數(shù)據(jù),因為對角線之前都是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(“相加的兩個矩陣行數(shù)或者列數(shù)不相等,不能相加!〃);throwexp;}}//矩陣求逆一開始求逆publicstaticdouble[,]ReverseMatrix(double[,]dMatrix)//開始求逆{intLevel=dMatrix.GetLength(0); //獲取矩陣維數(shù)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++)//創(chuàng)建一個矩陣(A|I)以對其進行初等變換求得其矩陣的逆{for(intj=0;j<2*Level;j++){if(j<Level)dReverseMatrix[i,j]=dMatrix[i,j];//該(A|I)矩陣前Level列為矩陣A后面為數(shù)據(jù)全部為0elsedReverseMatrix[i,j]=0;}dReverseMatrix[i.Level+i]=1;//將Level+1行開始的Level階矩陣裝換為單位矩陣(起初的時候該矩陣都為0現(xiàn)在在把對角線位置裝換為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的時候判斷該行該數(shù)據(jù)所在的列在該數(shù)據(jù)后是否為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];}}//此時數(shù)據(jù):第二行加上第一行為第一行的數(shù)據(jù)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執(zhí)行以下{for(intn二j;n<2*Level;n++)if(dReverseMatrix[i,n]!=0)dReverseMatrix[i,n]/=x;//相除使i行第一個數(shù)字為1}//Set0tothecurrentcolumnintherowsaftercurrentrowfor(ints=Level-1;s>i;s—)//該對角線數(shù)據(jù)為1時,這一列其他數(shù)據(jù)要轉換為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減去第三行為第三行的數(shù)據(jù)依次類推//113110//101010//0(x)-2-11-4-41}}//Formatthefirstmatrixintounit-matrixfor(inti二Level-2;i>=0;i--)//處理第一行二列的數(shù)據(jù)思路如上就是把除了對角線外的元素轉換為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];//新建一個數(shù)組存放觀測高差double[]s=newdouble[7];double[]v1=newdouble[4];//輸入條件方程系數(shù)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);//讀取表格中數(shù)據(jù)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];//根據(jù)長度計算權}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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論