测绘程序设计Word格式文档下载.docx
《测绘程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《测绘程序设计Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
利用之前以编写过的基本程序,以及平差的公式与算法,根据例题编写程序计算条件平差与间接平差(二者具有一定相似度)。
(六)水准网平差
首先利用已知的例题以及水准网计算公式和算法编写特殊可解的水准网平差,再在其基础上编写一般形式具有广泛应用的普通程序。
在将以上基本任务都完成之后还可以进一步编写GPS向量网等。
三、实习过程
(一)角弧之间的相互转化
1.编程思路:
首先在头文件中要注明#include<
cmath>
保证程序中的数学运算合理,然后建立一个角度是否合理判断的函数,在其中将角度的度、分、秒分别用三个 double型变量a、b、c表示,将输入或计算出的角度改正成合理的形式(分和秒都小于60大于0),如将30°
66´
27"
化成31°
6´
以及角度的正负。
然后在主函数中选择进行角度转化为弧度或弧度转化为角度,再输入数值时,为了使接下来的运算能够计算正确,如果输入复制现将负值提出flag=(a<
0.0)?
-1.0:
1.0,其中a为角度中的度数,在程序所有计算都运行完毕后在加上其负值-1,角弧转化最根本的是利用公式θ=L×
180÷
π,其中θ为角度,L为弧度。
在角度化弧度中表示为L=(a+b/60.0+c/3600.0)/180.0*s*4*atan
(1),在弧度化角度中表示为m=L*180/(4*atan
(1)),其中m为将度分秒化为度的形式,在利用取整’/’将m化为度分秒的形式。
2.计算结果:
文件可在计算机外部储存,且能长期保存可读取,也可重新刷写,对文件进行操作可随时进行数据更换。
在角弧相互转化程序的基础上进行更编,在原本输入角度和弧度地方使用文件操作,首先在头文件处要标明#include<
fstream>
,使我们对程序进行文件操作时的行为合法,在进行打开文件处写上ifstreaminfile("
jiao.txt"
),括号中要打开的文件名称和格式为txt,并且用if(!
infile)判断文件是否成功打开了,成功打开后,并且在程序结束时要关闭读入的文件infile.close(),解除该磁盘文件与文件流的关系,就不能再通过文件流对文件进行输入或输出。
在输出计算结果到文件中时写为ofstreamoutfile;
outfile.open("
jiao_out.txt"
);
括号中的为文件输出后所在的文件文件名及其格式,结果所在的文件可以在程序运行前就建好空白文件,也可不建立,在程序运行后会自动生成一个如括号里写的文件。
其他程序具体操作不进行任何改变,但将输入数值改换为文件的输入输出后,其结果可以更好的保存,输入数据时更方便,而程序更具有一般性。
(三)概率计算
1.编程思路
根据已知的probability.cpp程序对照实际例题改编程序,进行文件输入输出操作和函数的调用练习,将已知数据输入到程序中求得结果。
2.计算结果:
(四)矩阵运算
1.矩阵的表示方法
在程序中矩阵要依靠创建动态数组来表示,创建动态数组是为了储存未知阶数m×
n的二维矩阵,定义动态数组包含两个步骤:
第一步,定义与数组元素类型相同的指针变量;
第二步,申请内存并将内存地址赋给指针变量。
用动态数组来表示矩阵的方法有很多例如将二维数组作为一维数组储存本次程序编译就采用了这种方法将矩阵表示为:
double*P=newdouble[n];
此时P指针指向一个元素个数为n的一维数组。
地址new的作用是动态分配内存,在程序运行过程中申请分配用于存放初值列表类型数据的空间,并进行初始化。
在所有运算进行完毕之后,要用delete将动态分配建立的对象删除,从而释放空间。
除了这种方法之外,还可以直接定义二维数组,或调用函数创建来表示矩阵。
2.矩阵的运算
(1)矩阵加法与减法
矩阵的加法与减法相似,比较简单。
首先还是要进行文件操作,读入两个矩阵的数值,因为其基本要求是两矩阵的行数与列数对应相等,所以在此程序中首先需要对两个矩阵进行判断,表示为if(p!
=n*m||k!
=n*m),若是行列数不相等,则输出错误信息表示不能进行运算。
若是能够进行运算,则只需要两矩阵对应元素进行一一加减,即*(a+i*hang+j)+*(b+i*hang+j),得到的结果输出即可。
在结束运算后关闭文件输入操作,若是单独作为一个函数,无需文件操作,则只需要返回指针。
(2)矩阵乘法
矩阵的乘法比起矩阵的加减法要稍稍有一点难度,因为其基本要求是第一个矩阵的行数和第二个矩阵的列数相同,所以对n×
m阶矩阵A和p×
q阶矩阵B来说,在进行编程时首先要进行判断的是第一个矩阵的列数m是否与第二个矩阵的行数p是否相等,若不相等,输出错误信息,提示不能进行运算;
若是符合条件,首先要定义一个新的动态数组C其长度为n×
q(n,q要分别与第一个矩阵的行数和第二个矩阵的列数相同),并将数组C的每一个元素都赋予一个初始值0。
数组C的第i行第j列的元素值等于数组A的第i行元素与数组B的第j列元素对应相乘后累加。
因此*(C+i*m+j)+=(*(A+i*m+k))*(*(B+k*q+j));
这里运用了多次for循环来实现运算。
(3)矩阵的转置
矩阵的转置表达较为简单,进行文件操作,读入两个矩阵的数值,定义一个与已知矩阵相同长度的数组,使得*(a+i*hang+j)=*(b+j*hang+i),然后将转置后的数组输出即可。
若是单独作为一个函数,无需文件操作,则只需要返回指针。
(4)矩阵求逆
矩阵求逆在几种矩阵运算当中是最难的一种。
由于在平差计算中,一般是对权值进行求逆,权阵的特点是对称矩阵,因而对于特殊的对称正定矩阵,在求逆函数中矩阵的存储是仅存下三角矩阵元素。
对称正定矩阵求逆
设A为一个n×
n阶对称正定矩阵,求A的逆矩阵Aˉ¹
。
矩阵求逆分一般分三步进行:
第一步求约化系数,第二步求下三角阵的逆阵,第三步求原矩阵的逆阵。
每一步计算均采用原位替换求解法,即将矩阵中不同位置的元素表达为相应位置的位置函数值,每一步计算是用新的位置函数值替换相应位置的原有位置函数值,最终将原矩阵中各位置的元素替换为其逆矩阵中相应位置的元素。
计算公式如下:
a’n-1,n-1=1/a0,0
a’n-1,j-1=-a0,j/a0,0(j=1,2,...,n-k-1)
a’n-1,n-1=a0,j/a0,0(j=n-k,n-k+1,...,n-1)
a’i-1,n-1=ai,j-a0,ia0,j/a0,0(i=1,2,..,n-1;
j=1,2,...,n-k-1)
j=n-k,n-k-1,...,n-1)
k=0,1,2,...,n-1,表示循环变换次数。
1.计算结果:
1.间接平差
公式及算法:
间接平差与条件平差有一定的相似度间接平差法(参数平差法)是通过选定t个与观测值有一定关系的独立未知量作为参数,将每个观测值都分别表达成这t个参数的函数,建立函数模型,按最小二乘原理,用求自由极值的方法解出参数的最或然值,从而求得个观测值的平差值。
间接平差的函数模型为:
L=F(X);
参数的平差值X=X0+x;
随机模型:
D=σ02Q=σ02P-1
误差方程:
V=Bx-L;
法方程:
BTPBx-BTPL=0;
法方程解:
x=(BTPB)-1BTPL;
单位权中误差:
μ=±
;
参数平差值的协因数阵Qxx=(BTPB)-1;
x=(BTPB)-1BTPL
B是一个t×
n的矩阵;
P是一个n×
n的对称矩阵;
L、x、V都是一个n×
1的矩阵;
编程思路:
间接平差的程序编译与条件平差有相似之处,尤其是主函数之前的之前的基础调用函数矩阵的乘法multipy,矩阵转置函数transpose,和矩阵求逆是完全相同的。
在主函数中,依旧是先进行文件操作读入存在txt文档中的B,P,L的数据,然后进行调用multipy及transpose函数由B、P、L计算计算BᵀPB和BTPL;
数组B的长度为t*n,数组P的长度为n,数组L的长度也n,所以从文本中直接读入的三个矩阵还不能直接进行运算,为了进行运算我们要将P变化一下,所以我们将定义一个长度为n*n的动态数组P’,使得*(P’+i*n+i)=*(P+i),这样,便可以调用矩阵运算的函数计算出BTPB和BTPL,然后调用矩阵求逆函数求BTPB的逆矩阵(BTPB)-1;
由Qxx求得参数x,计算参数的平差值X,残差V;
单位权中误差μ。
最后求得某参数平差值Xj的中误差σXj=μ。
其中开根号用sqrt函数求得。
计算结果:
2.条件平差
条件平差法是在满足r个条件方程要求下,根据最小二乘原理VᵀPV=min,按照求函数的条件极值的方法,求出观测量的改正数V,进而求出观测的最或然值(平差值),条件方程个数等于多余观测数r=n-t,n为观测值总数,t为必要观测数。
条件平差中设条件方程式为BV+W=0;
V为n维观测值改正数向量;
(n为观测值总数);
B为r×
n阶系数矩阵;
(r为条件方程个数);
W为r维条件方程自由向量;
有最小二乘法可得联系数法方程为BPˉ¹
BᵀK+W=0;
P为观测值的权矩阵并设观测值独立,P为对角矩阵,数组长度为n;
K为联系数向量,K=-(BPˉ¹
Bᵀ)W;
BPBTK+W=0;
随机模型:
改正数向量V=Pˉ¹
BᵀK;
单位权中误差公式μ=±
观测值平差值的权逆阵QL=Pˉ¹
-Pˉ¹
Bᵀ(BPˉ¹
Bᵀ)ˉ¹
BPˉ¹
首先,在程序头文件处广泛定义一个N在下面程序中都为一个其确定的值3,因为在计算过程中需要计算大量的矩阵乘法,所以先定义一个矩阵乘法的函数multipy,将矩阵用一维动态数组表示出来,a3[i*r+x]+=a1[i*q+j]*a2[j*r+x]表示相乘后的矩阵元素,在定义矩阵转置函数transpose,利用for循环将矩阵元素逐一转置表示为a1[i*m+j]=a[j*n+i];
矩阵求逆的程序是查找资料找到的一段固定代码。
在主函数中