1、/ visual C+6.0 编译通过 / 参考资料 / 部分网络资料 / 宋力杰测量平差程序设计 /姚连壁基于 matlab 的控制网平差程序设计 / /#include#include#include #include#include using namespace std;/classclass SZWPCprivate:int gcz_zs; /高差总数int szd_zs; /总点数int yz_szd_zs; /已知点数double m_pvv; /pvvint *qsd_dh; /高差起点号int *zd_dh; /高差终点号char *dm; /点名地址数组double *gc
2、z; /观测值数组double *szd_gc; /高程值数组double *P; /观测值的权double *ATPA,*ATPL; /法方程系数矩阵与自由项double *dX; /高程改正数、平差值double *V; /残差double m_mu; /单位权中误差public:SZWPC();SZWPC();int ij(int i,int j);/对称矩阵下标计算函数bool inverse(double a,int n);/对称正定矩阵求逆( 仅存下三角元素)(参考他人)void inputdata(char *datafile);/输入原始数据函数int dm_dh(char *
3、name); /点名转点号void ca_H0(); /近似高程计算函数void ca_ATPA(); /法方程组成函数void ca_dX(); /高程平差值计算函数void printresult(char *resultfile); /精度估计与平差值输出函数double ca_V(); /残差计算函数void zxecpc(char *resultfile);/最小二乘平差函数;/ 构造函数SZWPC:SZWPC()gcz_zs=0;szd_zs=0;yz_szd_zs=0;/ 析构函数SZWPC:SZWPC()if(gcz_zs0)delete qsd_dh;delete zd_dh
4、;delete gcz;delete P;delete V;if(szd_zs0)delete szd_gc;delete ATPA;delete ATPL;delete dX;for(int i=0; i=j)? i*(i+1)/2+j :j*(j+1)/2+i;/ 对称正定矩阵求逆(仅存下三角元素)(参考他人)bool SZWPC:inverse(double a,int n)double *a0=new doublen;for(int k=0;kgcz_zsszd_zsyz_szd_zs;int unPnumber=szd_zs-yz_szd_zs;szd_gc=new double s
5、zd_zs;dX=new double szd_zs;ATPA=new double szd_zs*(szd_zs+1)/2;ATPL=new double szd_zs;qsd_dh=new int gcz_zs;zd_dh=new int gcz_zs;gcz=new double gcz_zs;V=new double gcz_zs;P=new double gcz_zs;dm=new char* szd_zs;for(int i=0;ibuffer;int c=dm_dh(buffer);infileszd_gci;for(i=0;ibuffer; /读取高程起点名qsd_dhi=dm
6、_dh(buffer);infilebuffer;/读取高程终点zd_dhi=dm_dh(buffer);infilegcziPi; /读取高差值与路线长度Pi=1.0/Pi;/线路长转化为观测值的权infile.close();/ 点名转点号,返回点名对应的点号int SZWPC:dm_dh(char *name)for(int i=0; i-10000.0 /计算近似高程k+;if(k=(szd_zs-yz_szd_zs)break;/所有的近似高程计算完成,退出/ 组成法方程void SZWPC:ca_ATPA()/int t=szd_zs;for(int i=0; iszd_zs*(s
7、zd_zs+1)/2; i+) ATPAi=0.0;/赋初值for(i=0; iszd_zs; i+) ATPLi=0.0;/赋初值for(int k=0; kgcz_zs; k+)int i=qsd_dhk;/获取点号int j=zd_dhk;/获取点号double Pk=Pk;/获取权值double lk=gczk-(szd_gcj-szd_gci);/获得第 k 个自由项ATPLi-=Pk*lk;/获得法方程自由项ATPLj+=Pk*lk;ATPAij(i,i)+=Pk;/获得法方程系数矩阵ATPAij(j,j)+=Pk;ATPAij(i,j)-=Pk;/ 高程平差值计算void SZW
8、PC:ca_dX()for(int i=0;iyz_szd_zs;i+) ATPAij(i,i)=1.0e30;/处理已知点if(!inverse(ATPA,szd_zs)/矩阵求逆cerr“法方程系数矩阵降秩 !“endl;/矩阵为奇异矩阵,无法求逆exit(0);/退出程序for(i=0; iszd_zs; i+)/计算高程改正数double xi=0.0;for(int j=0; jszd_zs; j+)xi+=ATPAij(i,j)*ATPLj;dXi=xi;szd_gci+=xi;/计算高程平差值/ 残差计算double SZWPC:ca_V()double pvv=0.0;for(
9、int i=0;i=gcz_zs-1;i+)int k1=qsd_dhi;int k2=zd_dhi;Vi=szd_gck2-szd_gck1-gczi;pvv+=Vi*Vi*Pi;return(pvv);/ 原始数据和平差值输出void SZWPC:printresult(char *resultfile)double pvv=ca_V(); / 残差计算ofstream outfile(resultfile,ios:out);/以输出方式打开文件,若文件不存在,创建文件/输出原始观测数据outfileendl“观测总数:“gcz_zs“ “总点数:“szd_zs;outfile“ “已知点
10、数:“yz_szd_zsendl;outfileendl“= 已知高程 =“endl;/输出原始观测数据已知点点号、高程for(int i=0;i=yz_szd_zs-1;i+)outfile“ “dmi;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)szd_gciendl;outfileendlendl“= 高差观测值=“endlendl;/输出原始观测数据高程观测值与路线长outfile“起始点名“ “终点点名“ “高差观测值(m)“ “两点间距离(km)“endl;for(i=0;i=gcz_zs-1;i+)out
11、file“ “dmqsd_dhisetw(9)dmzd_dhi;outfilesetiosflags(ios:fixed);outfilesetw(16)setprecision(4)gczi;outfilesetiosflags(ios:fixed);outfilesetw(16)setprecision(4)1.0/Piendl;m_mu=sqrt(pvv/(gcz_zs-(szd_zs-yz_szd_zs);/计算单位权中误差outfileendl“= 单位权中误差=“endl;/输出单位权中误差outfileendl“0=“m_muendl;outfileendl“= 高程平差值及其精
12、度 =“endlendl;/输出高程平差值及其精度outfile“点名 近似高程 改正数 高程平差值 中误差“endl;for( i=0; iszd_zs; i+)outfilesetw(2)dmi;double dx=dXi;double qii=ATPAij(i,i);outfilesetiosflags(ios:fixed);outfilesetw(12)setprecision(4)szd_gci-dx;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)dx;outfilesetiosflags(ios:fixed)
13、;outfilesetw(11)setprecision(4)szd_gci;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)sqrt(qii)*m_muendl;/输出观测值平差值及其精度outfileendlendl“= 观测值平差值及其精度 =“endlendl;outfile“起 点 终 点 观测高差 “ 高差平差值 观测权 中误差“endl;for(i=0;i=gcz_zs-1;i+)int k1=qsd_dhi;int k2=zd_dhi;double qii=ATPAij(k1,k1);double qjj=
14、 ATPAij(k2,k2) ;double qij=ATPAij(k1,k2);double ml=sqrt(qii+qjj-2.0*qij)*m_mu;outfile.width(2);outfiledmk1;outfile.width(7);outfiledmk2;outfilesetiosflags(ios:fixed);outfilesetw(12)setprecision(4)gczi;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)Vi;outfilesetiosflags(ios:fixed);outfil
15、esetw(10)setprecision(4)gczi+Vi;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)Pi;outfilesetiosflags(ios:fixed);outfilesetw(10)setprecision(4)mlendl;outfile.close();/ 水准网最小二乘平差void SZWPC:zxecpc(char *resultfile)ca_H0(); /近似高程计算ca_ATPA(); / 组成法方程ca_dX(); / 高程平差值计算/int main()char *datafil
16、e =“算例Data.txt“;/原始数据文件存储地址指针char *resultfile =“算例Result.txt“;/平差结果输出地址指针coutendlendl“水准网经典间接平差“endlendl;cout“原数据文件位置:“datafileendl;cout“平差结果文件位置:“resultfileendlendl;SZWPC new_net;/定义新的对象new_net.inputdata(datafile);/输入原始数据new_net.zxecpc(resultfile);/最小二乘平差计算new_net.printresult(resultfile);/输出平差结果return 0;