版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 測繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告</p><p><b> 一、實(shí)習(xí)目的</b></p><p> 鞏固之前所學(xué)的c++類定義、文件操作等各方面知識,掌握矩陣計(jì)算的基本算法,熟悉并熟練運(yùn)用平差模型,掌握測量平差的基本原理和公式,并處理測量觀測數(shù)據(jù)。</p><p><b> 二、實(shí)習(xí)內(nèi)容</b><
2、/p><p> 該課程的實(shí)習(xí)主要為c語言及c++編程基礎(chǔ),矩陣操作算法,條件平差,間接平差,以及在水準(zhǔn)網(wǎng)平差中的應(yīng)用。</p><p><b> 三、實(shí)習(xí)過程</b></p><p> 實(shí)習(xí)1(文件的基本操作以及角度、弧度的轉(zhuǎn)化)</p><p><b> 準(zhǔn)備</b></p>&
3、lt;p> C++文件操作函數(shù)包含于頭文件<fstream><ofstream><ifstream>,一般情況下使用<fstream>即可。在計(jì)算過程中需要文件輸出格式控制,函數(shù)包含于<iomainip>。c++的流操作函數(shù)包含于<iostream>,相應(yīng)的流函數(shù)在命名空間“std”。</p><p> 角度轉(zhuǎn)弧度的過程中,首先判斷
4、正負(fù),對符號進(jìn)行不同情況的處理。將度數(shù)的分,秒位分別除以60、3600,然后把得到的結(jié)果與度位絕對值相加,判斷符號。</p><p> 弧度轉(zhuǎn)角度的過程中,同樣判斷正負(fù),取小數(shù)位乘以60取整數(shù)得到相應(yīng)角度的分,再取剩余的小數(shù)乘以60即得到相應(yīng)角度的秒。</p><p><b> 代碼</b></p><p> #include <i
5、ostream></p><p> #include <math.h></p><p> #include <fstream></p><p> #include <string></p><p> using namespace std;</p><p> cons
6、t double pi = 3.14159;</p><p> int main()</p><p><b> {</b></p><p> fstream file("a.txt"); //定義文件操作對象</p><p> string aa;</p><p>&
7、lt;b> file>>aa;</b></p><p> cout<<aa<<endl; //輸出文件中的內(nèi)容</p><p> int a = 1;//定義重復(fù)輸入使用的變量</p><p> while(a) //限制循環(huán),重復(fù)輸入</p><p><b&
8、gt; {</b></p><p> float a1,a2,a3;</p><p> cout<<endl;</p><p> double deg;</p><p> cout<<"輸入度"<<endl;</p><p><b>
9、; cin>>a1;</b></p><p> cout<<"輸入分"<<endl;</p><p><b> cin>>a2;</b></p><p> cout<<"輸入秒"<<endl;</p>
10、<p><b> cin>>a3;</b></p><p> cout<<"角度為 "<<a1<<"° "<<a2<<"′ "<<a3<<"″"<<endl;<
11、;/p><p> if(a1 >= 0) //判斷輸入度數(shù)的正負(fù)</p><p> deg = a1 + a2/60 + a3/3600;</p><p><b> else</b></p><p> deg = a1 - a2/60 - a3/3600;</p><p&g
12、t; double radian;</p><p> radian = deg/180*pi;</p><p> cout<<"轉(zhuǎn)換得弧度為 "<<radian<<endl;</p><p> cout<<endl;</p><p> cout<&l
13、t;"輸入弧度: "<<endl;</p><p> cin>>radian;</p><p> bool tm = 0;</p><p> deg = radian*180/pi;</p><p> if(deg<0) </p><p><b&
14、gt; {</b></p><p><b> tm = 1;</b></p><p> deg = -deg;</p><p><b> }</b></p><p> a1 = int(deg);</p><p> a2 = int( (deg-a1
15、)*60 );</p><p> a3 = ( (deg-a1-a2/60)*3600 );</p><p> if(tm == 1)</p><p><b> {</b></p><p><b> a1 = -a1;</b></p><p><b>
16、tm = 0;</b></p><p><b> }</b></p><p> cout<<"轉(zhuǎn)換后角度為 "<<a1<<"° "<<a2<<"′ "<<a3<<"″"<
17、<endl; </p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果</b></p><p>&l
18、t;b> 輸入度</b></p><p><b> 20</b></p><p><b> 輸入分</b></p><p><b> 55</b></p><p><b> 輸入秒</b></p><p>
19、;<b> 32</b></p><p> 角度為 20° 55′ 32″</p><p> 轉(zhuǎn)換得弧度為 0.36522</p><p><b> 輸入弧度:</b></p><p><b> 3.14</b></p>&l
20、t;p> 轉(zhuǎn)化后角度為 179° 54′ 32.0387″</p><p> Press any key to continue</p><p><b> 出現(xiàn)的問題</b></p><p> 角度轉(zhuǎn)換過程中需要考慮角度的正負(fù)號問題,角度轉(zhuǎn)化可以添加是否超過59的判斷。</p><p><
21、;b> 實(shí)習(xí)2(概率計(jì)算)</b></p><p><b> 準(zhǔn)備</b></p><p> 在誤差檢驗(yàn)、粗差探測等平差計(jì)算中經(jīng)常需要計(jì)算某些特定分布函數(shù)的反函數(shù)值,為滿足計(jì)算需要,使用CProbability類對相關(guān)計(jì)算進(jìn)行封裝。</p><p> 代碼及運(yùn)行結(jié)果與書上相同。</p><p>
22、 實(shí)習(xí)3(矩陣基本運(yùn)算)</p><p><b> 準(zhǔn)備</b></p><p> 矩陣的運(yùn)算有加法、減法、乘法、轉(zhuǎn)置、求逆,封裝在一個(gè)類中。為了方便之后的計(jì)算與使用,類中還添加了從文件中讀入矩陣、輸出矩陣,向控制臺(tái)輸入輸出矩陣的函數(shù)。</p><p> 代入運(yùn)算的矩陣均用動(dòng)態(tài)的一維數(shù)組表示。先定義double型指針,在確定矩陣大小后動(dòng)
23、態(tài)申請空間,row行col列的矩陣定義為:double *mat = new double[row*col]; 第i行j列的元素為mat[i*col+j]。</p><p> 矩陣的加法、減法只需遍歷兩個(gè)矩陣的每個(gè)元素,相加之后放到結(jié)果矩陣中(如有必要先判斷相加的兩矩陣行數(shù)與列數(shù)是否相等)。</p><p> 乘法計(jì)算中設(shè)相成的兩個(gè)矩陣mat1、mat2的行列分別為row1、col,
24、col、col2,則所求結(jié)果矩陣第i行j列的元素 用三個(gè)循環(huán)即可計(jì)算矩陣中所有的元素。</p><p> 矩陣轉(zhuǎn)置將結(jié)果矩陣中的i行j列元素賦值為需要計(jì)算的矩陣中的j行i列個(gè)元素即可。</p><p> 矩陣求逆,由于平差計(jì)算中需要求逆的矩陣一般為實(shí)對稱正定矩陣,為了提高大型矩陣的計(jì)算效率,可以使用對實(shí)對稱正定矩陣求逆的方法。</p><p> 設(shè)C為n階
25、對稱正定矩陣,y、x為n維向量,其關(guān)系式為:</p><p> y=C·x (3-1)</p><p> 確定了上的一個(gè)映像,如能寫出逆關(guān)系:</p><p> x=B·y (3-2)</p><p> 則B為C的逆陣,即B=</p>
26、<p> 現(xiàn)將式(3-1)寫成</p><p> ...... </p><p> ...... (3-3)</p><p><b> .......</b></p><p><b> ......</b></p><
27、p> 因C對稱正定,必有0,用除式(3-3)第一個(gè)方程的兩端,解出,把和的位置交換,并將代入其他各式得</p><p> ...... </p><p> ...... (3-4)</p><p> ......
28、 </p><p> ...... </p>&
29、lt;p> 事實(shí)上式(3-4)可以改寫為</p><p><b> ...... +</b></p><p><b> ...... +</b></p><p> ........ (3-5)</p><p><b> ......
30、+</b></p><p> 如果對式(3-5)中的變量按如下規(guī)則重新編號</p><p><b> (3-6)</b></p><p> 經(jīng)n次變換后恢復(fù)原狀,采用變量循環(huán)重新編號法的計(jì)算公式如下:</p><p><b> 對于</b></p><p>
31、; 由于變量循環(huán)重新編號法求逆均在下三角陣(包括對角元素)進(jìn)行,因而運(yùn)行速快,在大型矩陣的計(jì)算中可以很好的適用。</p><p> 矩陣運(yùn)算的函數(shù)封裝在類mat中,函數(shù)在mat.h中定義,在mat.cpp中實(shí)現(xiàn)。</p><p><b> 代碼</b></p><p><b> 文件mat.h:</b></p
32、><p> #include <fstream></p><p> #include <iostream></p><p> #include<math.h></p><p> using namespace std;</p><p><b> class mat&l
33、t;/b></p><p><b> {</b></p><p><b> public:</b></p><p> void add(int row,int col,double m[],double n[],double result[]);//加法</p><p> vo
34、id sub(int row,int col,double m[],double n[],double result[]);//減法</p><p> double* multiply(int row, int col, int col2, double m[],double n[]);//乘法</p><p>
35、 void trans(int row, int col, double m[], double result[]);//轉(zhuǎn)置</p><p> bool inverse(double a[], int n);//求逆</p><p> void fileIn(ifstream &in, int size, double *mat);//從文件中讀入</p>&
36、lt;p> void fileOut(ofstream out, int row, int col, double *mat);</p><p><b> //向文件輸出</b></p><p> void outPut(int row, int col, double *mat);//向控制臺(tái)輸出</p><p> void i
37、nPut(int row, int col, double *mat);//從控制臺(tái)輸入</p><p> int ij(int i, int j)//下三角矩陣元素判斷</p><p><b> {</b></p><p> return (i>=j)? i*(i+1)/2+j : j*(j+1)/2+i;</p>
38、<p><b> }</b></p><p><b> };</b></p><p> 文件mat.cpp:</p><p> #include "mat.h"</p><p> void mat::add(int row,int col,double m[]
39、,double n[],double result[])</p><p><b> {</b></p><p> for(int i=0; i<row*col; i++)</p><p> result[i] = m[i]+n[i];</p><p><b> }</b></p&
40、gt;<p> void mat::sub(int row,int col,double m[],double n[],double result[])</p><p><b> {</b></p><p> for(int i=0; i<row*col; i++)</p><p> result[i] = m[i]
41、-n[i];</p><p><b> }</b></p><p> double* mat::multiply(int row, int col, int col2, double m[],double n[])</p><p><b> {</b></p><p> int i,j,k;
42、</p><p> double *result = new double[row*col2];</p><p> for(i=0; i<row; i++)</p><p><b> {</b></p><p> for(j=0; j<col2; j++)</p><p>&l
43、t;b> {</b></p><p> result[i*col2+j] = 0;</p><p> for(k=0; k<col; k++)</p><p> result[i*col2+j] += m[i*col+k] * n[k*col2+j]; </p><p><b> }</b&g
44、t;</p><p><b> }</b></p><p> return result;</p><p><b> }</b></p><p> void mat::trans(int row, int col, double m[], double result[])</p>
45、<p><b> {</b></p><p><b> int i,j;</b></p><p> double *temp = new double[row*col];</p><p> for(i=0; i<col; i++)</p><p><b> {
46、</b></p><p> for(j=0; j<row; j++)</p><p><b> {</b></p><p> result[i*row+j] = m[j*col+i];</p><p><b> }</b></p><p><b
47、> }</b></p><p><b> }</b></p><p> bool mat::inverse(double mat[], int n)</p><p><b> {</b></p><p><b> int i;</b></p&g
48、t;<p><b> int j;</b></p><p><b> int k;</b></p><p> double *c = new double[n];</p><p> for(k=0; k<n; k++)</p><p><b> {</b
49、></p><p> double c11 = mat[0];</p><p> if(c11 + 1.0 == 1.0)</p><p><b> {</b></p><p> delete []c;</p><p> return false;</p><p
50、><b> }</b></p><p> for(i=1; i<n; i++)</p><p><b> {</b></p><p> double ai0 = mat[i*(i+1)/2];</p><p> if(i<=n-k-1)</p><p&
51、gt; c[i] = -ai0/c11;</p><p><b> else</b></p><p> c[i] = ai0/c11;</p><p> for(j=1; j<=i; j++)</p><p><b> {</b></p><p> mat[
52、(i-1)*i/2 + j -1] = mat[i*(i+1)/2+j] + ai0*c[j];</p><p><b> }</b></p><p><b> }</b></p><p> for(i=1; i<n; i++)</p><p><b> {<
53、;/b></p><p> mat[(n-1)*n/2+i-1] = c[i];</p><p><b> }</b></p><p> mat[n*(n+1)/2-1] = 1.0/c11;</p><p><b> }</b></p><p> delet
54、e []c;</p><p> return true;</p><p><b> }</b></p><p> void mat::fileIn(ifstream &in, int size, double *mat)</p><p><b> {</b></p>&
55、lt;p> for(int i=0; i<size; i++)</p><p> in>>mat[i];</p><p><b> }</b></p><p> void mat::fileOut(ofstream out, int row, int col, double *mat)</p>&l
56、t;p><b> {</b></p><p> for(int i=0; i<row; i++)</p><p><b> {</b></p><p> for(int j=0; j<col; j++)</p><p> out<<mat[i*col+j]&l
57、t;<" "<<endl;</p><p> out<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> void mat::outPut(int row, int col, doub
58、le *mat)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0; i<row; i++)</p><p><b> {</b></p><p> for(j=0
59、; j<col; j++)</p><p> cout<<mat[i*col+j]<<" ";</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p&g
60、t;<p> void mat::inPut(int row, int col, double *mat)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0; i<row; i++)</p><p>
61、; for(j=0; j<col; j++)</p><p> cin>>mat[i*col+j];</p><p><b> }</b></p><p> 測試文件main.cpp:</p><p> #include "mat.h"</p><p&g
62、t; mat g_mat;</p><p> void main()</p><p><b> {</b></p><p> double *mat1;</p><p> double *mat2;</p><p> double *mat3;</p><p&g
63、t; double *mat4;</p><p> double *mat_result;</p><p> mat1 = new double[2*3];</p><p> mat2 = new double[2*3];</p><p> mat3 = new double[3*1];</p><p>
64、mat4 = new double[2*2];</p><p> cout<<"從文件中讀取"<<endl;</p><p> ifstream in("in.txt");</p><p> g_mat.fileIn(in,2*3,mat1);</p><p> cou
65、t<<"矩陣mat1為:"<<endl;</p><p> g_mat.outPut(2,3,mat1);</p><p> cout<<endl;</p><p> g_mat.fileIn(in,2*3,mat2);</p><p> cout<<"矩
66、陣mat2為:"<<endl;</p><p> g_mat.outPut(2,3,mat1);</p><p> cout<<endl;</p><p> g_mat.fileIn(in,3*1,mat3);</p><p> cout<<"矩陣mat3為:"<
67、<endl;</p><p> g_mat.outPut(3,1,mat1);</p><p> cout<<endl;</p><p> g_mat.fileIn(in,2*2,mat4);</p><p> cout<<"矩陣mat4為:"<<endl;</p&g
68、t;<p> g_mat.outPut(2,2,mat1);</p><p> cout<<endl;</p><p> in.close();</p><p> cout<<"mat1 + mat2 = "<<endl;</p><p> mat_result
69、= new double[2*3];</p><p> g_mat.add (2, 3, mat1, mat2, mat_result);</p><p> g_mat.fileIn(in, 2*3, mat_result);</p><p> g_mat.outPut(2, 3, mat_result);</p><p> cout
70、<<"mat1 - mat2 = "<<endl;</p><p> g_mat.sub (2, 3, mat1, mat2, mat_result);</p><p> g_mat.fileIn(in, 2*3, mat_result);</p><p> g_mat.outPut(2, 3, mat_result
71、);</p><p> cout<<"mat1 * mat3 = "<<endl;</p><p> delete mat_result;</p><p> mat_result = g_mat.multiply (2, 3, 1, mat1, mat3);</p><p> g_mat.f
72、ileIn(in, 2*3, mat_result);</p><p> g_mat.outPut(2, 1, mat_result);</p><p> cout<<"inv(mat4) = "<<endl;</p><p> g_mat.inverse (mat4, 2);</p><p>
73、; g_mat.outPut (2, 2, mat4);</p><p> cout<<"轉(zhuǎn)置 mat3 為"<<endl;</p><p> delete mat_result;</p><p> mat_result = new double[1*3];</p><p> g_mat.
74、trans (3, 1, mat3, mat_result);</p><p> g_mat.outPut(1, 3, mat_result);</p><p> delete []mat1;</p><p> delete []mat2;</p><p> delete []mat3;</p><p> d
75、elete []mat_result;</p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果</b></p><p> 測試文件“in.txt”:</p><p><b> 1 2 3</b></p><p><b>
76、; 4 5 6</b></p><p><b> 2 3 4</b></p><p><b> 5 6 7</b></p><p><b> 1</b></p><p><b> 2</b></p><p>&
77、lt;b> 3</b></p><p><b> 1 3</b></p><p><b> 4 5</b></p><p><b> 測試結(jié)果:</b></p><p><b> 從文件中讀取</b></p>&l
78、t;p><b> 矩陣mat1為:</b></p><p><b> 1 2 3</b></p><p><b> 4 5 6</b></p><p><b> 矩陣mat2為:</b></p><p><b> 1 2
79、 3</b></p><p><b> 4 5 6</b></p><p><b> 矩陣mat3為:</b></p><p><b> 1</b></p><p><b> 2</b></p><p>&
80、lt;b> 3</b></p><p><b> 矩陣mat4為:</b></p><p><b> 1 2</b></p><p><b> 3 4</b></p><p> mat1 + mat2 =</p><p>
81、<b> 3 5 7</b></p><p><b> 9 11 13</b></p><p> mat1 - mat2 =</p><p> -1 -1 -1</p><p> -1 -1 -1</p><p> mat1 * mat3 =<
82、;/p><p><b> 14</b></p><p><b> 32</b></p><p> inv(mat4) =</p><p><b> -0.8 0.6</b></p><p><b> -0.2 5</b>&
83、lt;/p><p><b> 轉(zhuǎn)置 mat3 為</b></p><p><b> 1 2 3</b></p><p> Press any key to continue</p><p><b> 出現(xiàn)的問題</b></p><p> 矩陣的
84、輸入與輸出都要與一維數(shù)組相對應(yīng),在用動(dòng)態(tài)指針操作內(nèi)存容易出現(xiàn)數(shù)組越界的問題,直接造成程序崩潰,可以在關(guān)鍵的代碼上使用try……catch排錯(cuò)。定義的類可以將函數(shù)體放在類中形成內(nèi)聯(lián)函數(shù)以增加程序的效率。函數(shù)除了使用類外還可以考慮使用一個(gè)命名空間對函數(shù)進(jìn)行封裝,或是在類中封裝矩陣的其他元素,重載操作符元素(在簡單的運(yùn)算中比較方便,在較為復(fù)雜的運(yùn)算中不太適用,比如用下三角存放的矩陣)。</p><p><b>
85、; 實(shí)習(xí)3(間接平差)</b></p><p><b> 準(zhǔn)備</b></p><p> 間接平差法(參數(shù)平差法)是通過選定t個(gè)與觀測值有一定關(guān)系的獨(dú)立未知量作為參數(shù),將每個(gè)觀測值都分別表達(dá)成這t個(gè)參數(shù)的函數(shù),建立函數(shù)模型,按最小二乘原理,用求自由極值的方法解出參數(shù)的最或然值,從而求得各觀測值的平差值。</p><p> 設(shè)
86、誤差方程 V = Bx-l 其中V為觀測值改正數(shù),A為系數(shù)矩陣,x為參數(shù)向量,L為觀測值向量,則x的最小二乘解</p><p><b> 其中P為觀測值權(quán)陣</b></p><p><b> 單位權(quán)中誤差</b></p><p> 在間接平差的計(jì)算函數(shù)中,需要輸入已知參數(shù):</p><p>
87、<b> n(觀測值數(shù))</b></p><p><b> t(參數(shù)個(gè)數(shù))</b></p><p> B(誤差方程系數(shù)矩陣,大小n*t)</p><p> L(觀測值向量,大小n*1)</p><p> P(觀測值權(quán)陣簡化為對角數(shù)組)</p><p><b&g
88、t; 需要求解的參數(shù):</b></p><p> X(參數(shù)平差值向量,大小t*1)</p><p> V(觀測值平差值向量,大小n*1)</p><p><b> u(單位權(quán)中誤差)</b></p><p><b> 計(jì)算過程:</b></p><p>
89、 通過B、P、L計(jì)算、</p><p><b> 求的逆矩陣</b></p><p><b> 計(jì)算平差值 </b></p><p> 將X代入計(jì)算 V = Bx-l </p><p><b> 代入計(jì)算 </b></p><p> 計(jì)
90、算函數(shù)void adjust(int n, int t, double V[], double B[], double X[], double L[], double P[],double &u)</p><p><b> 代碼</b></p><p> 文件“mat.cpp” “mat.h”同上;</p><p> 文件“mai
91、n.cpp”:</p><p> #include"mat.h"</p><p> #include<iomanip></p><p> mat mat_c;</p><p><b> /**</b></p><p><b> V = BX-L;
92、</b></p><p><b> V: n*1</b></p><p><b> B: n*t</b></p><p><b> X: t*1</b></p><p><b> L: n*1</b></p><p&
93、gt;<b> P: n*1</b></p><p><b> 已知:B、L、P</b></p><p><b> 求:X、V、</b></p><p><b> */</b></p><p> void adjust(int n, int t,
94、 double V[], double B[], double X[], double L[], double P[],double &u)</p><p><b> {</b></p><p> int i,j,k;</p><p> double *BTPB = new double[(t+1)*t/2];</p>
95、<p> double *BTPB2 = new double[(t+1)*t/2];</p><p> for(i=0; i<(t+1)*t/2; i++)</p><p> BTPB2[i] = 0;</p><p> cout<<"BTPB2"<<endl;</p><
96、p> for(i=0; i<t; i++)</p><p><b> {</b></p><p> for(j=0; j<=i; j++)</p><p><b> {</b></p><p> for(k=0; k<n; k++)</p><p
97、> BTPB2[i*(i+1)/2+j] += B[k*t+i]*P[k]*B[k*t+j];</p><p> cout<<BTPB2[i*(i+1)/2+j];</p><p><b> }</b></p><p> cout<<endl;</p><p><
98、;b> }</b></p><p> mat_c.inverse(BTPB2,t);</p><p> double *BTPL = new double[t*1];</p><p> for(i=0; i<t; i++)</p><p><b> {</b></p>&l
99、t;p> BTPL[i] = 0;</p><p> for(k=0; k<n; k++)</p><p><b> {</b></p><p> BTPL[i] += B[k*t+i]*P[k]*L[k];</p><p><b> }</b></p><
100、p><b> }</b></p><p> for(i=0; i<t; i++)</p><p><b> {</b></p><p><b> X[i] = 0;</b></p><p> for(j=0; j<t; j++)</p>
101、<p> X[i] += BTPB2[mat_c.ij(i,j)]*BTPL[j];</p><p><b> }</b></p><p> //X = mat_c.multiply(t,t,1,BTPB2,BTPL); 下三角矩陣不能用一般乘法</p><p> double *BX;</p>
102、<p> BX = mat_c.multiply(n,t,1,B,X);</p><p> mat_c.sub(n,1,BX,L,V);// V = BX-L </p><p><b> u = 0;</b></p><p> for(i=0; i<n; i++)</p><p><b&g
103、t; {</b></p><p> u += V[i]*P[i]*V[i];</p><p><b> }</b></p><p> u = sqrt(u/(n-t));</p><p><b> }</b></p><p> void mai
104、n()</p><p><b> {</b></p><p> double* B = new double[3*6];</p><p> double* L = new double[6*1];</p><p> double* P = new double[6];</p><p>
105、double* X = new double[3];</p><p> double* V = new double[6];</p><p> double u = 0;</p><p> ifstream file("filein.txt");</p><p> mat_c.fileIn(file,3*6,B);
106、</p><p> mat_c.fileIn(file,6,L);</p><p> mat_c.fileIn(file,6,P);</p><p><b> int n,t;</b></p><p><b> file>>n;</b></p><p>&
107、lt;b> file>>t;</b></p><p> cout<<setiosflags(ios::fixed) << setprecision(6) ;</p><p> adjust(n,t,V,B,X,L,P,u);</p><p> cout<<u<<endl;</
108、p><p> mat_c.outPut(6,1,V);</p><p> double H[] = {0.023,1.114,1.142,0.079,0.099,1.21};</p><p> for(int i=0; i<6; i++)</p><p><b> {</b></p><p&
109、gt; cout<<"改正后H"<<i<<":"<<H[i]+V[i]<<endl;</p><p> H[i] = H[i]+V[i];</p><p><b> }</b></p><p> cout<<"A:
110、"<<10+H[3]<<endl;</p><p> cout<<"B: "<<10+H[4]<<endl;</p><p> cout<<"D: "<<10+H[5]<<endl;</p><p><b>
111、 }</b></p><p><b> 測試文件數(shù)據(jù):</b></p><p> -1 1 0 </p><p> 0 -1 1</p><p> -1 0 1</p><p> 1 0 0</p><p> 0
112、 1 0</p><p> 0 0 1</p><p><b> 0.003</b></p><p><b> 0.003</b></p><p><b> 0.011</b></p><p><b> 0</
113、b></p><p><b> 0</b></p><p><b> 0</b></p><p><b> 2</b></p><p><b> 2</b></p><p><b> 2</b>
114、</p><p><b> 1</b></p><p><b> 1</b></p><p><b> 1</b></p><p><b> 6 3</b></p><p><b> 運(yùn)行結(jié)果</b>
115、</p><p><b> BTPB2</b></p><p><b> 5.000000</b></p><p> -2.0000005.000000</p><p> -2.000000-2.0000005.000000</p><p><b> 0.
116、004243</b></p><p><b> 0.001000</b></p><p><b> 0.001000</b></p><p><b> -0.003000</b></p><p><b> -0.004000</b>&l
117、t;/p><p><b> -0.000000</b></p><p><b> 0.004000</b></p><p> 改正后H0:0.024000</p><p> 改正后H1:1.115000</p><p> 改正后H2:1.139000</p>
118、<p> 改正后H3:0.075000</p><p> 改正后H4:0.099000</p><p> 改正后H5:1.214000</p><p> A: 10.075000</p><p> B: 10.099000</p><p> D: 11.214000</p>&l
119、t;p> Press any key to continue</p><p><b> 出現(xiàn)的問題</b></p><p> 由于double類型計(jì)算精度問題,輸出時(shí)容易出現(xiàn)很趨近于0的小數(shù),需要控制輸出流格式,包含頭文件<iomainip>,使用</p><p> cout<<setiosflags(io
120、s::fixed) << setprecision(6) ;</p><p> 最后的數(shù)字為控制小數(shù)輸出的位數(shù)。</p><p> 為了提高計(jì)算效率,使用下三角矩陣存儲(chǔ),使用向量存儲(chǔ)權(quán)陣,使用這種方法時(shí),之前所用的矩陣類中乘法不能使用,需要直接用for循環(huán)進(jìn)行計(jì)算。</p><p><b> 實(shí)習(xí)4(條件平差)</b><
121、/p><p><b> 準(zhǔn)備</b></p><p> 條件平差是根據(jù)各觀測元素間所構(gòu)成的幾何條件以及起始數(shù)據(jù)間的強(qiáng)制條件,按最小二乘法的原理求得各觀測值的最或然值,以消除由于多次觀測產(chǎn)生的矛盾的平差方法。</p><p> 條件平差模型為 其中V為觀測值改正數(shù),A為系數(shù)矩陣,W為條件方程自由項(xiàng)向量,則由最小二乘原理:</p>
122、<p> 其中P為觀測值權(quán)陣,K為拉格朗日算法中聯(lián)系數(shù)向量,解為:</p><p> 改正數(shù)向量V的解為:</p><p><b> 單位權(quán)中誤差</b></p><p> 在條件平差的計(jì)算函數(shù)中,需要輸入已知參數(shù):</p><p><b> n(觀測值數(shù))</b></p
123、><p><b> r(條件方程個(gè)數(shù))</b></p><p> A(條件方程系數(shù)矩陣,大小r*n)</p><p> W(條件方程自由項(xiàng)向量,大小r*1)</p><p> P(觀測值權(quán)陣簡化為對角數(shù)組)</p><p><b> 需要求解的參數(shù):</b></p
124、><p> V(觀測值平差值向量,大小n*1)</p><p><b> u(單位權(quán)中誤差)</b></p><p><b> 計(jì)算過程:</b></p><p><b> 通過A、P計(jì)算</b></p><p><b> 求的逆矩陣&l
125、t;/b></p><p><b> 計(jì)算平聯(lián)系數(shù)向量 </b></p><p><b> 計(jì)算單位權(quán)中誤差 </b></p><p><b> 代碼</b></p><p> 文件“mat.cpp” “mat.h”同上;</p><p>
126、 文件“main.cpp”:</p><p> #include <iostream></p><p> #include <cmath></p><p> #include <iomanip></p><p> #include "mat.h"</p><
127、p> using namespace std;</p><p> mat mat_cul;</p><p> void condition(int n, int r, double A[], double W[],</p><p> double P[], double V[],double &u)</p><p>&l
128、t;b> {</b></p><p> int i,j,k;</p><p> double *AQAT = new double[r*(r+1)/2];</p><p><b> //法方程系數(shù)陣</b></p><p> for(i=0; i<r; i++)</p>&
129、lt;p><b> {</b></p><p> for(j=0; j<=i; j++)</p><p><b> {</b></p><p> AQAT[mat_cul.ij(i,j)] = 0;</p><p> for(k=0; k<n; k++)</p>
130、;<p> AQAT[mat_cul.ij(i,j)] += A[i*n+k]*A[j*n+k]/P[k]; </p><p><b> }</b></p><p><b> }</b></p><p><b> //系數(shù)陣求逆</b></p>
131、<p> if(mat_cul.inverse(AQAT,r) == false)</p><p><b> return ;</b></p><p> double *K = new double [r];</p><p> for(i=0; i<r; i++)</p><p><b&g
132、t; {</b></p><p> K[i] = 0.0;</p><p> for(j=0; j<r; j++)</p><p> K[i] -= AQAT[mat_cul.ij(i,j)]*W[j];</p><p><b> }</b></p><p><b
133、> //計(jì)算V</b></p><p> double pvv = 0;</p><p> for(i=0; i<n; i++)</p><p><b> {</b></p><p> double vi =0.0;</p><p> for(int j=0;
134、j<r; j++)</p><p> vi += A[j*n+i]*K[j];</p><p> vi /= P[i];</p><p> V[i] = vi;</p><p> pvv+= vi*vi*P[i];</p><p><b> }</b></p><
135、;p> delete []AQAT;</p><p> delete []K;</p><p> u = sqrt(pvv/r);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></
136、p><p> double V[6];</p><p> double A[] = {1,0,0,1,-1,0,</p><p> 0,0,-1,-1,0,1,</p><p> 0,1,0,0,1,-1};</p><p> double W[] = {0.003,-0.011,0.003};</p>
137、;<p> double P[] = {2,2,2,1,1,1};</p><p> double H[] = {0.023,1.114,1.142,0.079,0.099,1.21};</p><p><b> double u;</b></p><p> condition(6,3,A,W,P,V,u);</p&
138、gt;<p> cout<<"中誤差: "<<u<<endl;</p><p> cout<<setiosflags(ios::fixed) << setprecision(4) ;</p><p><b> int i;</b></p><p&g
139、t; for(i=0; i<6; i++)</p><p> cout<<V[i]<<endl;</p><p> for(i=0; i<6; i++)</p><p><b> {</b></p><p> cout<<"改正后H"<&
140、lt;i<<":"<<H[i]+V[i]<<endl;</p><p> H[i] = H[i]+V[i];</p><p><b> }</b></p><p> cout<<"A: "<<10+H[3]<<endl;<
141、/p><p> cout<<"B: "<<10+H[4]<<endl;</p><p> cout<<"D: "<<10+H[5]<<endl;</p><p><b> }</b></p><p><
142、b> 運(yùn)行結(jié)果</b></p><p> 中誤差: 0.00424264</p><p><b> 0.0010</b></p><p><b> 0.0010</b></p><p><b> -0.0030</b></p><
143、;p><b> -0.0040</b></p><p><b> -0.0000</b></p><p><b> 0.0040</b></p><p> 改正后H0:0.0240</p><p> 改正后H1:1.1150</p><p&g
144、t; 改正后H2:1.1390</p><p> 改正后H3:0.0750</p><p> 改正后H4:0.0990</p><p> 改正后H5:1.2140</p><p> A: 10.0750</p><p> B: 10.0990</p><p> D: 11.2140
145、</p><p> Press any key to continue</p><p><b> 出現(xiàn)的問題</b></p><p> 和之前間接平差的問題類似,主要為輸出流控制與矩陣計(jì)算方面的問題。</p><p> 實(shí)習(xí)5(水準(zhǔn)網(wǎng)平差)</p><p><b> 準(zhǔn)備<
146、;/b></p><p> 利用前面的間接平差函數(shù),通過已知的數(shù)據(jù)求出平差計(jì)算所需要的</p><p><b> n(觀測值數(shù))</b></p><p><b> t(參數(shù)個(gè)數(shù))</b></p><p> B(誤差方程系數(shù)矩陣,大小n*t)</p><p>
147、L(觀測值向量,大小n*1)</p><p> P(觀測值權(quán)陣簡化為對角數(shù)組)</p><p> 水準(zhǔn)網(wǎng)平差用類Clevel進(jìn)行封裝,類中主要包含計(jì)算所需的矩陣和數(shù)據(jù),以及進(jìn)行計(jì)算的函數(shù)。通過類的封裝在建立對象時(shí)輸入水準(zhǔn)網(wǎng)數(shù)據(jù)所在文件名,并計(jì)算后輸出相應(yīng)的結(jié)果。</p><p> 類中的函數(shù)成員如下:</p><p> 構(gòu)造函數(shù)Cle
148、vel(char *fileName) 輸入文件的名稱,并調(diào)用其它的計(jì)算函數(shù),輸出平差結(jié)果。</p><p> void inputdata(char *fileName);//從文件中輸入讀入計(jì)算所需的數(shù)據(jù),存到相應(yīng)的數(shù)組和變量中。</p><p> 首先從文件中讀取觀測值n、總點(diǎn)數(shù)pNum、已知點(diǎn)數(shù)p_k、精度m。</p><p> 從中得到t = pN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 測繪程序設(shè)計(jì)技術(shù)基礎(chǔ)
- 程序設(shè)計(jì)實(shí)習(xí)
- 程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- web程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- linux程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 測繪程序設(shè)計(jì)復(fù)習(xí)題
- c課程設(shè)計(jì)報(bào)告-- windows程序設(shè)計(jì)報(bào)告
- vb課程設(shè)計(jì)報(bào)告---打字程序設(shè)計(jì)報(bào)告
- vb課程設(shè)計(jì)報(bào)告---打字程序設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--系統(tǒng)時(shí)間程序設(shè)計(jì)
- c語言程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 掃雷游戲程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- c++程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 《高級語言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- 面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 《c語言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- 面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告-- linux c 程序設(shè)計(jì)
評論
0/150
提交評論