測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告_第1頁
測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告_第2頁
測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告_第3頁
測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告_第4頁
測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.測(cè)繪程序設(shè)計(jì)課程實(shí)習(xí)報(bào)告一、實(shí)習(xí)目的鞏固之前所學(xué)的c+類定義、文件操作等各方面知識(shí),掌握矩陣計(jì)算的基本算法,熟悉并熟練運(yùn)用平差模型,掌握測(cè)量平差的基本原理和公式,并處理測(cè)量觀測(cè)數(shù)據(jù)。二、實(shí)習(xí)內(nèi)容該課程的實(shí)習(xí)主要為c語言及c+編程基礎(chǔ),矩陣操作算法,條件平差,間接平差,以及在水準(zhǔn)網(wǎng)平差中的應(yīng)用。三、實(shí)習(xí)過程(1) 實(shí)習(xí)1(文件的基本操作以及角度、弧度的轉(zhuǎn)化)1. 準(zhǔn)備C+文件操作函數(shù)包含于頭文件<fstream><ofstream><ifstream>,一般情況下使用<fstream>即可。在計(jì)算過程中需要文件輸出格式控制,函數(shù)包含于<io

2、mainip>。c+的流操作函數(shù)包含于<iostream>,相應(yīng)的流函數(shù)在命名空間“std”。角度轉(zhuǎn)弧度的過程中,首先判斷正負(fù),對(duì)符號(hào)進(jìn)行不同情況的處理。將度數(shù)的分,秒位分別除以60、3600,然后把得到的結(jié)果與度位絕對(duì)值相加,判斷符號(hào)。弧度轉(zhuǎn)角度的過程中,同樣判斷正負(fù),取小數(shù)位乘以60取整數(shù)得到相應(yīng)角度的分,再取剩余的小數(shù)乘以60即得到相應(yīng)角度的秒。2. 代碼#include <iostream>#include <math.h>#include <fstream>#include <string>using namespac

3、e std;const double pi = 3.14159;int main()fstream file("a.txt"); /定義文件操作對(duì)象string aa;file>>aa;cout<<aa<<endl; /輸出文件中的內(nèi)容int a = 1;/定義重復(fù)輸入使用的變量while(a) /限制循環(huán),重復(fù)輸入float a1,a2,a3;cout<<endl;double deg;cout<<"輸入度"<<endl;cin>>a1;cout<<&quo

4、t;輸入分"<<endl;cin>>a2;cout<<"輸入秒"<<endl;cin>>a3;cout<<"角度為 "<<a1<<"° "<<a2<<" "<<a3<<""<<endl;if(a1 >= 0) /判斷輸入度數(shù)的正負(fù)deg = a1 + a2/60 + a3/3600;elsedeg = a1 - a2

5、/60 - a3/3600;double radian;radian = deg/180*pi;cout<<"轉(zhuǎn)換得弧度為 "<<radian<<endl;cout<<endl;cout<<"輸入弧度: "<<endl;cin>>radian;bool tm = 0;deg = radian*180/pi;if(deg<0)tm = 1;deg = -deg;a1 = int(deg);a2 = int( (deg-a1)*60 );a3 = ( (deg-a1-a

6、2/60)*3600 );if(tm = 1) a1 = -a1; tm = 0;cout<<"轉(zhuǎn)換后角度為 "<<a1<<"° "<<a2<<" "<<a3<<""<<endl;return 0;3. 運(yùn)行結(jié)果 輸入度20輸入分55輸入秒32角度為 20° 55 32轉(zhuǎn)換得弧度為 0.36522輸入弧度:3.14轉(zhuǎn)化后角度為 179° 54 32.0387Press any key to

7、continue4. 出現(xiàn)的問題角度轉(zhuǎn)換過程中需要考慮角度的正負(fù)號(hào)問題,角度轉(zhuǎn)化可以添加是否超過59的判斷。(2) 實(shí)習(xí)2(概率計(jì)算)1. 準(zhǔn)備在誤差檢驗(yàn)、粗差探測(cè)等平差計(jì)算中經(jīng)常需要計(jì)算某些特定分布函數(shù)的反函數(shù)值,為滿足計(jì)算需要,使用CProbability類對(duì)相關(guān)計(jì)算進(jìn)行封裝。2. 代碼及運(yùn)行結(jié)果與書上相同。(3) 實(shí)習(xí)3(矩陣基本運(yùn)算)1. 準(zhǔn)備矩陣的運(yùn)算有加法、減法、乘法、轉(zhuǎn)置、求逆,封裝在一個(gè)類中。為了方便之后的計(jì)算與使用,類中還添加了從文件中讀入矩陣、輸出矩陣,向控制臺(tái)輸入輸出矩陣的函數(shù)。代入運(yùn)算的矩陣均用動(dòng)態(tài)的一維數(shù)組表示。先定義double型指針,在確定矩陣大小后動(dòng)態(tài)申請(qǐng)空間,

8、row行col列的矩陣定義為:double *mat = new doublerow*col; 第i行j列的元素為mati*col+j。矩陣的加法、減法只需遍歷兩個(gè)矩陣的每個(gè)元素,相加之后放到結(jié)果矩陣中(如有必要先判斷相加的兩矩陣行數(shù)與列數(shù)是否相等)。乘法計(jì)算中設(shè)相成的兩個(gè)矩陣mat1、mat2的行列分別為row1、col,col、col2,則所求結(jié)果矩陣第i行j列的元素 用三個(gè)循環(huán)即可計(jì)算矩陣中所有的元素。矩陣轉(zhuǎn)置將結(jié)果矩陣中的i行j列元素賦值為需要計(jì)算的矩陣中的j行i列個(gè)元素即可。矩陣求逆,由于平差計(jì)算中需要求逆的矩陣一般為實(shí)對(duì)稱正定矩陣,為了提高大型矩陣的計(jì)算效率,可以使用對(duì)實(shí)對(duì)稱正定矩

9、陣求逆的方法。設(shè)C為n階對(duì)稱正定矩陣,y、x為n維向量,其關(guān)系式為: y=C·x (3-1)確定了上的一個(gè)映像,如能寫出逆關(guān)系: x=B·y (3-2)則B為C的逆陣,即B=現(xiàn)將式(3-1)寫成 . . (3-3) . .因C對(duì)稱正定,必有0,用除式(3-3)第一個(gè)方程的兩端,解出,把和的位置交換,并將代入其他各式得 . . (3-4) . . 事實(shí)上式(3-4)可以改寫為 . + . + . (3-5) . +如果對(duì)式(3-5)中的變量按如下規(guī)則重新編號(hào) (3-6) 經(jīng)n次變換后恢復(fù)原狀,采用變量循環(huán)重新編號(hào)法的計(jì)算公式如下:對(duì)于 由于變量循環(huán)重新編號(hào)法求逆均在下三角陣(

10、包括對(duì)角元素)進(jìn)行,因而運(yùn)行速快,在大型矩陣的計(jì)算中可以很好的適用。矩陣運(yùn)算的函數(shù)封裝在類mat中,函數(shù)在mat.h中定義,在mat.cpp中實(shí)現(xiàn)。2. 代碼文件mat.h:#include <fstream>#include <iostream>#include<math.h>using namespace std;class matpublic:void add(int row,int col,double m,double n,double result);/加法void sub(int row,int col,double m,double n,do

11、uble result);/減法double* multiply(int row, int col, int col2, double m,double n);/乘法void trans(int row, int col, double m, double result);/轉(zhuǎn)置bool inverse(double a, int n);/求逆void fileIn(ifstream &in, int size, double *mat);/從文件中讀入void fileOut(ofstream out, int row, int col, double *mat);/向文件輸出voi

12、d outPut(int row, int col, double *mat);/向控制臺(tái)輸出void inPut(int row, int col, double *mat);/從控制臺(tái)輸入int ij(int i, int j)/下三角矩陣元素判斷return (i>=j)? i*(i+1)/2+j : j*(j+1)/2+i; ;文件mat.cpp:#include "mat.h"void mat:add(int row,int col,double m,double n,double result)for(int i=0; i<row*col; i+)r

13、esulti = mi+ni;void mat:sub(int row,int col,double m,double n,double result)for(int i=0; i<row*col; i+)resulti = mi-ni;double* mat:multiply(int row, int col, int col2, double m,double n)int i,j,k;double *result = new doublerow*col2;for(i=0; i<row; i+)for(j=0; j<col2; j+)resulti*col2+j = 0;f

14、or(k=0; k<col; k+)resulti*col2+j += mi*col+k * nk*col2+j; return result;void mat:trans(int row, int col, double m, double result)int i,j;double *temp = new doublerow*col;for(i=0; i<col; i+)for(j=0; j<row; j+)resulti*row+j = mj*col+i;bool mat:inverse(double mat, int n)int i;int j;int k;doubl

15、e *c = new doublen;for(k=0; k<n; k+)double c11 = mat0;if(c11 + 1.0 = 1.0)delete c;return false;for(i=1; i<n; i+)double ai0 = mati*(i+1)/2;if(i<=n-k-1)ci = -ai0/c11;elseci = ai0/c11;for(j=1; j<=i; j+)mat(i-1)*i/2 + j -1 = mati*(i+1)/2+j + ai0*cj;for(i=1; i<n; i+)mat(n-1)*n/2+i-1 = ci;m

16、atn*(n+1)/2-1 = 1.0/c11;delete c;return true;void mat:fileIn(ifstream &in, int size, double *mat)for(int i=0; i<size; i+)in>>mati;void mat:fileOut(ofstream out, int row, int col, double *mat)for(int i=0; i<row; i+)for(int j=0; j<col; j+)out<<mati*col+j<<" "&l

17、t;<endl;out<<endl;void mat:outPut(int row, int col, double *mat)int i,j;for(i=0; i<row; i+)for(j=0; j<col; j+)cout<<mati*col+j<<" "cout<<endl;void mat:inPut(int row, int col, double *mat)int i,j;for(i=0; i<row; i+)for(j=0; j<col; j+)cin>>mati*co

18、l+j;測(cè)試文件main.cpp:#include "mat.h"mat g_mat;void main()double *mat1;double *mat2;double *mat3;double *mat4;double *mat_result;mat1 = new double2*3;mat2 = new double2*3;mat3 = new double3*1;mat4 = new double2*2;cout<<"從文件中讀取"<<endl;ifstream in("in.txt");g_mat.

19、fileIn(in,2*3,mat1);cout<<"矩陣mat1為:"<<endl;g_mat.outPut(2,3,mat1);cout<<endl;g_mat.fileIn(in,2*3,mat2);cout<<"矩陣mat2為:"<<endl;g_mat.outPut(2,3,mat1);cout<<endl;g_mat.fileIn(in,3*1,mat3);cout<<"矩陣mat3為:"<<endl;g_mat.outPut(

20、3,1,mat1);cout<<endl;g_mat.fileIn(in,2*2,mat4);cout<<"矩陣mat4為:"<<endl;g_mat.outPut(2,2,mat1);cout<<endl;in.close();cout<<"mat1 + mat2 = "<<endl;mat_result = new double2*3;g_mat.add (2, 3, mat1, mat2, mat_result);g_mat.fileIn(in, 2*3, mat_result

21、);g_mat.outPut(2, 3, mat_result);cout<<"mat1 - mat2 = "<<endl;g_mat.sub (2, 3, mat1, mat2, mat_result);g_mat.fileIn(in, 2*3, mat_result);g_mat.outPut(2, 3, mat_result);cout<<"mat1 * mat3 = "<<endl;delete mat_result;mat_result = g_mat.multiply (2, 3, 1, mat

22、1, mat3);g_mat.fileIn(in, 2*3, mat_result);g_mat.outPut(2, 1, mat_result);cout<<"inv(mat4) = "<<endl;g_mat.inverse (mat4, 2);g_mat.outPut (2, 2, mat4);cout<<"轉(zhuǎn)置 mat3 為"<<endl;delete mat_result;mat_result = new double1*3;g_mat.trans (3, 1, mat3, mat_result)

23、;g_mat.outPut(1, 3, mat_result);delete mat1;delete mat2;delete mat3;delete mat_result;3. 運(yùn)行結(jié)果測(cè)試文件“in.txt”: 1 2 34 5 62 3 45 6 71231 34 5 測(cè)試結(jié)果: 從文件中讀取矩陣mat1為:1 2 34 5 6矩陣mat2為:1 2 34 5 6矩陣mat3為:123矩陣mat4為:1 23 4mat1 + mat2 =3 5 79 11 13mat1 - mat2 =-1 -1 -1-1 -1 -1mat1 * mat3 =1432inv(mat4) =-0.8 0.6

24、-0.2 5轉(zhuǎn)置 mat3 為1 2 3Press any key to continue4. 出現(xiàn)的問題矩陣的輸入與輸出都要與一維數(shù)組相對(duì)應(yīng),在用動(dòng)態(tài)指針操作內(nèi)存容易出現(xiàn)數(shù)組越界的問題,直接造成程序崩潰,可以在關(guān)鍵的代碼上使用trycatch排錯(cuò)。定義的類可以將函數(shù)體放在類中形成內(nèi)聯(lián)函數(shù)以增加程序的效率。函數(shù)除了使用類外還可以考慮使用一個(gè)命名空間對(duì)函數(shù)進(jìn)行封裝,或是在類中封裝矩陣的其他元素,重載操作符元素(在簡(jiǎn)單的運(yùn)算中比較方便,在較為復(fù)雜的運(yùn)算中不太適用,比如用下三角存放的矩陣)。(4) 實(shí)習(xí)3(間接平差)1. 準(zhǔn)備間接平差法(參數(shù)平差法)是通過選定t個(gè)與觀測(cè)值有一定關(guān)系的獨(dú)立未知量作為參

25、數(shù),將每個(gè)觀測(cè)值都分別表達(dá)成這t個(gè)參數(shù)的函數(shù),建立函數(shù)模型,按最小二乘原理,用求自由極值的方法解出參數(shù)的最或然值,從而求得各觀測(cè)值的平差值。設(shè)誤差方程 V = Bx-l 其中V為觀測(cè)值改正數(shù),A為系數(shù)矩陣,x為參數(shù)向量,L為觀測(cè)值向量,則x的最小二乘解 其中P為觀測(cè)值權(quán)陣單位權(quán)中誤差在間接平差的計(jì)算函數(shù)中,需要輸入已知參數(shù):n(觀測(cè)值數(shù))t(參數(shù)個(gè)數(shù))B(誤差方程系數(shù)矩陣,大小n*t)L(觀測(cè)值向量,大小n*1)P(觀測(cè)值權(quán)陣簡(jiǎn)化為對(duì)角數(shù)組)需要求解的參數(shù):X(參數(shù)平差值向量,大小t*1)V(觀測(cè)值平差值向量,大小n*1)u(單位權(quán)中誤差)計(jì)算過程:1) 通過B、P、L計(jì)算、2) 求的逆矩陣3

26、) 計(jì)算平差值 4) 將X代入計(jì)算 V = Bx-l 5) 代入計(jì)算 計(jì)算函數(shù)void adjust(int n, int t, double V, double B, double X, double L, double P,double &u)2. 代碼文件“mat.cpp” “mat.h”同上;文件“main.cpp”:#include"mat.h"#include<iomanip>mat mat_c;/*V = BX-L;V: n*1B: n*tX: t*1L: n*1P: n*1已知:B、L、P求:X、V、*/void adjust(int n

27、, int t, double V, double B, double X, double L, double P,double &u)int i,j,k;double *BTPB = new double(t+1)*t/2;double *BTPB2 = new double(t+1)*t/2;for(i=0; i<(t+1)*t/2; i+)BTPB2i = 0;cout<<"BTPB2"<<endl;for(i=0; i<t; i+)for(j=0; j<=i; j+)for(k=0; k<n; k+)BTPB2

28、i*(i+1)/2+j += Bk*t+i*Pk*Bk*t+j;cout<<BTPB2i*(i+1)/2+j;cout<<endl;mat_c.inverse(BTPB2,t);double *BTPL = new doublet*1;for(i=0; i<t; i+)BTPLi = 0;for(k=0; k<n; k+)BTPLi += Bk*t+i*Pk*Lk;for(i=0; i<t; i+)Xi = 0;for(j=0; j<t; j+)Xi += BTPB2mat_c.ij(i,j)*BTPLj;/X = mat_c.multiply(

29、t,t,1,BTPB2,BTPL); 下三角矩陣不能用一般乘法double *BX;BX = mat_c.multiply(n,t,1,B,X);mat_c.sub(n,1,BX,L,V);/ V = BX-L u = 0;for(i=0; i<n; i+)u += Vi*Pi*Vi;u = sqrt(u/(n-t);void main()double* B = new double3*6;double* L = new double6*1;double* P = new double6;double* X = new double3;double* V = new double6;do

30、uble u = 0;ifstream file("filein.txt");mat_c.fileIn(file,3*6,B);mat_c.fileIn(file,6,L);mat_c.fileIn(file,6,P);int n,t;file>>n;file>>t;cout<<setiosflags(ios:fixed) << setprecision(6) ;adjust(n,t,V,B,X,L,P,u);cout<<u<<endl;mat_c.outPut(6,1,V);double H = 0.

31、023,1.114,1.142,0.079,0.099,1.21;for(int i=0; i<6; i+)cout<<"改正后H"<<i<<":"<<Hi+Vi<<endl;Hi = Hi+Vi;cout<<"A: "<<10+H3<<endl;cout<<"B: "<<10+H4<<endl;cout<<"D: "<<10+H5&l

32、t;<endl;測(cè)試文件數(shù)據(jù):-1 1 0 0 -1 1-1 0 11 0 00 1 00 0 10.0030.0030.0110002221116 33. 運(yùn)行結(jié)果BTPB25.000000-2.0000005.000000-2.000000-2.0000005.0000000.0042430.0010000.001000-0.003000-0.004000-0.0000000.004000改正后H0:0.024000改正后H1:1.115000改正后H2:1.139000改正后H3:0.075000改正后H4:0.099000改正后H5:1.214000A: 10.075000B:

33、10.099000D: 11.214000Press any key to continue4. 出現(xiàn)的問題由于double類型計(jì)算精度問題,輸出時(shí)容易出現(xiàn)很趨近于0的小數(shù),需要控制輸出流格式,包含頭文件<iomainip>,使用cout<<setiosflags(ios:fixed) << setprecision(6) ;最后的數(shù)字為控制小數(shù)輸出的位數(shù)。為了提高計(jì)算效率,使用下三角矩陣存儲(chǔ),使用向量存儲(chǔ)權(quán)陣,使用這種方法時(shí),之前所用的矩陣類中乘法不能使用,需要直接用for循環(huán)進(jìn)行計(jì)算。(5) 實(shí)習(xí)4(條件平差)1. 準(zhǔn)備條件平差是根據(jù)各觀測(cè)元素間所構(gòu)成的

34、幾何條件以及起始數(shù)據(jù)間的強(qiáng)制條件,按最小二乘法的原理求得各觀測(cè)值的最或然值,以消除由于多次觀測(cè)產(chǎn)生的矛盾的平差方法。條件平差模型為 其中V為觀測(cè)值改正數(shù),A為系數(shù)矩陣,W為條件方程自由項(xiàng)向量,則由最小二乘原理: 其中P為觀測(cè)值權(quán)陣,K為拉格朗日算法中聯(lián)系數(shù)向量,解為:改正數(shù)向量V的解為:?jiǎn)挝粰?quán)中誤差在條件平差的計(jì)算函數(shù)中,需要輸入已知參數(shù):n(觀測(cè)值數(shù))r(條件方程個(gè)數(shù))A(條件方程系數(shù)矩陣,大小r*n)W(條件方程自由項(xiàng)向量,大小r*1)P(觀測(cè)值權(quán)陣簡(jiǎn)化為對(duì)角數(shù)組)需要求解的參數(shù):V(觀測(cè)值平差值向量,大小n*1)u(單位權(quán)中誤差)計(jì)算過程:1) 通過A、P計(jì)算2) 求的逆矩陣3) 計(jì)算平

35、聯(lián)系數(shù)向量 4) 計(jì)算單位權(quán)中誤差 2. 代碼文件“mat.cpp” “mat.h”同上;文件“main.cpp”:#include <iostream>#include <cmath>#include <iomanip>#include "mat.h"using namespace std;mat mat_cul;void condition(int n, int r, double A, double W, double P, double V,double &u)int i,j,k;double *AQAT = new do

36、ubler*(r+1)/2;/法方程系數(shù)陣for(i=0; i<r; i+)for(j=0; j<=i; j+)AQATmat_cul.ij(i,j) = 0;for(k=0; k<n; k+)AQATmat_cul.ij(i,j) += Ai*n+k*Aj*n+k/Pk; /系數(shù)陣求逆if(mat_cul.inverse(AQAT,r) = false)return ;double *K = new double r;for(i=0; i<r; i+)Ki = 0.0;for(j=0; j<r; j+)Ki -= AQATmat_cul.ij(i,j)*Wj;/

37、計(jì)算Vdouble pvv = 0;for(i=0; i<n; i+)double vi =0.0;for(int j=0; j<r; j+)vi += Aj*n+i*Kj;vi /= Pi;Vi = vi;pvv+= vi*vi*Pi;delete AQAT;delete K;u = sqrt(pvv/r);void main()double V6;double A = 1,0,0,1,-1,0, 0,0,-1,-1,0,1, 0,1,0,0,1,-1;double W = 0.003,-0.011,0.003;double P = 2,2,2,1,1,1;double H =

38、0.023,1.114,1.142,0.079,0.099,1.21;double u;condition(6,3,A,W,P,V,u);cout<<"中誤差: "<<u<<endl;cout<<setiosflags(ios:fixed) << setprecision(4) ;int i;for(i=0; i<6; i+)cout<<Vi<<endl;for(i=0; i<6; i+)cout<<"改正后H"<<i<<&

39、quot;:"<<Hi+Vi<<endl;Hi = Hi+Vi;cout<<"A: "<<10+H3<<endl;cout<<"B: "<<10+H4<<endl;cout<<"D: "<<10+H5<<endl;3. 運(yùn)行結(jié)果中誤差: 0.004242640.00100.0010-0.0030-0.0040-0.00000.0040改正后H0:0.0240改正后H1:1.1150改正后H2:1

40、.1390改正后H3:0.0750改正后H4:0.0990改正后H5:1.2140A: 10.0750B: 10.0990D: 11.2140Press any key to continue4. 出現(xiàn)的問題和之前間接平差的問題類似,主要為輸出流控制與矩陣計(jì)算方面的問題。(6) 實(shí)習(xí)5(水準(zhǔn)網(wǎng)平差)1. 準(zhǔn)備利用前面的間接平差函數(shù),通過已知的數(shù)據(jù)求出平差計(jì)算所需要的n(觀測(cè)值數(shù))t(參數(shù)個(gè)數(shù))B(誤差方程系數(shù)矩陣,大小n*t)L(觀測(cè)值向量,大小n*1)P(觀測(cè)值權(quán)陣簡(jiǎn)化為對(duì)角數(shù)組)水準(zhǔn)網(wǎng)平差用類Clevel進(jìn)行封裝,類中主要包含計(jì)算所需的矩陣和數(shù)據(jù),以及進(jìn)行計(jì)算的函數(shù)。通過類的封裝在建立對(duì)象

41、時(shí)輸入水準(zhǔn)網(wǎng)數(shù)據(jù)所在文件名,并計(jì)算后輸出相應(yīng)的結(jié)果。類中的函數(shù)成員如下:1) 構(gòu)造函數(shù)Clevel(char *fileName) 輸入文件的名稱,并調(diào)用其它的計(jì)算函數(shù),輸出平差結(jié)果。2) void inputdata(char *fileName);/從文件中輸入讀入計(jì)算所需的數(shù)據(jù),存到相應(yīng)的數(shù)組和變量中。首先從文件中讀取觀測(cè)值n、總點(diǎn)數(shù)pNum、已知點(diǎn)數(shù)p_k、精度m。從中得到t = pNum-p_k。然后從文件中讀取起點(diǎn)號(hào)、終點(diǎn)號(hào)以及相應(yīng)的高程值、距離,通過n判斷循環(huán)次數(shù)。3) void calculataHBPL();/通過數(shù)據(jù)計(jì)算H、B、L、P。計(jì)算近似高程值。首先將H中已知點(diǎn)以后的

42、高程數(shù)據(jù)賦初始值-9999.9,以判斷是否已經(jīng)得到H近似值(沒賦近似值的高程值小于-9999)。然后判斷數(shù)據(jù)中的水準(zhǔn)路線,若已知高程值差的兩個(gè)高程點(diǎn)中一個(gè)為未知點(diǎn),一個(gè)為已知點(diǎn),則可得出未知點(diǎn)的近似高程值,直至所有高程值都已經(jīng)求出時(shí)跳出循環(huán)。計(jì)算系數(shù)矩陣B。先將矩陣中所有數(shù)據(jù)賦值0。分別判斷觀測(cè)水準(zhǔn)路線的高差點(diǎn),如果第一個(gè)高程點(diǎn)不是已知點(diǎn)和控制點(diǎn)則將系數(shù)矩陣B中對(duì)應(yīng)位置賦值-1,如果第二個(gè)高程點(diǎn)不是已知點(diǎn)和控制點(diǎn)則將系數(shù)矩陣B中對(duì)應(yīng)位置賦值1。計(jì)算觀測(cè)值向量L。觀測(cè)值向量中每一個(gè)元素 Li=hi-(Hk2-Hk1); 式中k1、k2為觀測(cè)值高程點(diǎn)對(duì)應(yīng)高程向量H中的點(diǎn)號(hào)。計(jì)算權(quán)陣P。權(quán)陣中每個(gè)元

43、素與距離成反比,通過Pi=m/Si;求出每個(gè)權(quán)陣。4) void adjust();函數(shù)體內(nèi)容與上面間接平差函數(shù)的內(nèi)容基本相同,通過上面求得的B、L、P求的平差后的X、V。由于函數(shù)里運(yùn)算的變量命名與之前間接平差相同,只是把從參數(shù)輸入數(shù)據(jù)改為直接調(diào)用類成員數(shù)據(jù)。5) void outputResult();通過間接平差計(jì)算出的X、V,輸出平差結(jié)果。改正后的觀測(cè)值hi = Hi+Vi;改正后的高程值i = Hi+Xi;并將中誤差,改正數(shù)等輸出。2. 代碼文件mat.cpp mat.h 同上。文件Clevel.h:#include <iostream>#include <fstre

44、am>#include <string>#include <iomanip>#include <math.h>#include "mat.h"using namespace std; class Clevelpublic:int n; /總觀測(cè)值數(shù)int p_k; /已知點(diǎn)數(shù)int t; /未知點(diǎn)數(shù)int pNum; /高程點(diǎn)總數(shù)double m; /單位權(quán)string *Pname; /點(diǎn)名地址數(shù)組int *startP; /起點(diǎn)號(hào)int *endP; /終點(diǎn)號(hào)double *h; /觀測(cè)值double *H; /高程值doubl

45、e *S; /距離長(zhǎng)度double *P; /權(quán)double *B;double *L;double *X;double *V;double u; /中誤差Clevel(char *fileName);void inputdata(char *fileName);int GetPNum(string name);void adjust();void outputResult();void calculataHBPL();mat mat_c;/矩陣計(jì)算類private:void calH();void calB();void calP();void calL();文件Clevel.cpp:#in

46、clude "Clevel.h"Clevel:Clevel(char* fileName)inputdata(fileName);calculataHBPL();adjust();outputResult();/*V = BX-L;V: n*1B: n*tX: t*1L: n*1P: n*1已知:B、L、P求:X、V、*/void Clevel:adjust()int i,j,k;double *BTPB = new double(t+1)*t/2;double *BTPB2 = new double(t+1)*t/2;/ 下三角求BTPB2 for(i=0; i<(

47、t+1)*t/2; i+)BTPB2i = 0;for(i=0; i<t; i+)for(j=0; j<=i; j+)for(k=0; k<n; k+)BTPB2i*(i+1)/2+j += Bk*t+i*Pk*Bk*t+j;/ BTPB2求逆mat_c.inverse(BTPB2,t);double *BTPL = new doublet*1;for(i=0; i<t; i+)BTPLi = 0;for(k=0; k<n; k+)BTPLi += Bk*t+i*Pk*Lk;for(i=0; i<t; i+)Xi = 0;for(j=0; j<t; j

48、+)Xi += BTPB2mat_c.ij(i,j)*BTPLj;/X = mat_c.multiply(t,t,1,BTPB2,BTPL); 下三角矩陣不能用一般乘法double *BX;BX = mat_c.multiply(n,t,1,B,X);mat_c.sub(n,1,BX,L,V);/ V = BX-L u = 0;for(i=0; i<n; i+)u += Vi*Pi*Vi;u = sqrt(u/(n-t);int Clevel:GetPNum(string name)/點(diǎn)名數(shù)字化int i;for(i=0; i<pNum; i+)if(Pnamei != "

49、;zz")if(name = Pnamei)return i;else Pnamei = name;return i;return -1;void Clevel:inputdata(char *fileName)/輸入原始數(shù)據(jù)fstream in(fileName);in>>n>>pNum>>p_k>>m;t = pNum-p_k;startP = new intn;/起點(diǎn)號(hào)endP = new intn;/終點(diǎn)號(hào)L = new doublen;/觀測(cè)值H = new doublepNum;/高程值S = new doublen;/距離

50、長(zhǎng)度P = new doublen*n;/權(quán) B = new doublet*n;h = new doublen;Pname = new stringpNum;X = new doublet;V = new doublen;int i;for(i=0;i<pNum;i+)Pnamei="zz"/Getstationnumber函數(shù)根據(jù)Pname是否為空確定Pnamei是否為點(diǎn)名string buffer;/臨時(shí)數(shù)組,保存從文件中讀到的點(diǎn)名/讀取已知高程數(shù)據(jù)for(i=0;i<p_k;i+)in>>buffer;int bb = GetPNum(buf

51、fer);in>>Hbb;/cout<<Heighty;/讀取觀測(cè)值數(shù)據(jù)for( i=0;i<n;i+)in>>buffer;/讀取起點(diǎn)名startPi = GetPNum(buffer);/獲取起點(diǎn)對(duì)應(yīng)的點(diǎn)號(hào)in>>buffer;/讀取終點(diǎn)名endPi = GetPNum(buffer);in>>hi>>Si;/讀取觀測(cè)值高差及對(duì)應(yīng)的距離in.close();/cout<<"1"/高程近似值計(jì)算void Clevel:calH()int i;for(i=p_k; i<pNum; i+)Hi=-9999.9;int Hcount=0;/計(jì)算出近似高程的點(diǎn)數(shù)while(1)for(i=0;i<n;i+)int k1=startPi;int k2=endPi;if(Hk1>-9999.0 && Hk2<-9999.0)Hk2=Hk1+hi;Hcount+;else if(Hk1<-9999.0 && Hk2>-9999.0)Hk1=Hk2-hi;Hcount+;if(Hcount = t)b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論