logo资料库

平差课程设计.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
//////////////////////////////////////////////////// // //////////////////////////////////////////////////// visual C++6.0 编译通过 // 参考资料 部分网络资料 /////////////////////////////////////////////////// // // // // // 宋力杰《测量平差程序设计》 // //姚连壁《基于 matlab 的控制网平差程序设计》 // /////////////////////////////////////////////////// #include #include #include #include #include using namespace std; //////////////////////////////////////////////////////////////////////////class class SZWPC { private: //高差总数 //总点数 //已知点数 //[pvv] //高差起点号 //高差终点号 //点名地址数组 int gcz_zs; int szd_zs; int yz_szd_zs; double m_pvv; int *qsd_dh; int *zd_dh; char double double double double double double double m_mu; //观测值数组 **dm; *gcz; *szd_gc; *P; *ATPA,*ATPL; //法方程系数矩阵与自由项 *dX; *V; //高程改正数、平差值 //残差 //高程值数组 //观测值的权 //单位权中误差 public: SZWPC(); ~SZWPC(); int ij(int i,int j);//对称矩阵下标计算函数 bool inverse(double a[],int n);//对称正定矩阵求逆(仅存下三角元素)(参考他人)
inputdata(char *datafile);//输入原始数据函数 dm_dh(char *name); //点名转点号 ca_H0(); ca_ATPA(); ca_dX(); printresult(char *resultfile); //法方程组成函数 //高程平差值计算函数 //近似高程计算函数 void int void void void void double ca_V(); void //精度估计与平差值输出函数 //残差计算函数 zxecpc(char *resultfile);//最小二乘平差函数 }; ////////////////////////////////////////////////////////////////////// // 构造函数 SZWPC::SZWPC() { gcz_zs=0; szd_zs=0; yz_szd_zs=0; } ////////////////////////////////////////////////////////////////////// // 析构函数 SZWPC::~SZWPC() { if(gcz_zs>0) { delete []qsd_dh; delete []zd_dh; delete []gcz; delete []P; delete []V; } if(szd_zs>0) { 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 double[n]; for(int k=0;k
delete []a0; return true; } /////////////////////////////////////////////////////////////////////// 原始数据输入函数 void SZWPC::inputdata(char *datafile) { ifstream infile(datafile,ios::in); if(! infile) { cerr<<" Open error!"<>gcz_zs>>szd_zs>>yz_szd_zs; int unPnumber=szd_zs-yz_szd_zs; szd_gc=new double [szd_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;i>buffer; int c=dm_dh(buffer); infile>>szd_gc[i]; } for(i=0;i>buffer; //读取高程起点名
qsd_dh[i]=dm_dh(buffer); infile>>buffer;//读取高程终点 zd_dh[i]=dm_dh(buffer); infile>>gcz[i]>>P[i]; //读取高差值与路线长度 P[i]=1.0/P[i];//线路长转化为观测值的权 } infile.close(); } //////////////////////////////////////////////////////////////////// 应的点号 int { SZWPC::dm_dh(char *name) 点名转点号,返回点名对 for(int i=0; i
{ for(int i=yz_szd_zs;i-10000.0 && szd_gc[k2]<-10000.0)//k1 点高程或高程近似值已知, //高差起点号 //高差终点号 k2 点高程或高程近似值未知 szd_gc[k2]=szd_gc[k1]+gcz[i];//计算近似高程 k++; { } else if(szd_gc[k1]<-10000.0 && szd_gc[k2]>-10000.0)//k2 点高程或高程近似值已 知,k1 点高程或高程近似值未知 { } szd_gc[k1]=szd_gc[k2]-gcz[i];//计算近似高程 k++; } if(k==(szd_zs-yz_szd_zs))break;//所有的近似高程计算完成,退出 } } ////////////////////////////////////////////////////////////////////////// // 组成法方程 void SZWPC::ca_ATPA() { //int t=szd_zs; for(int i=0; i
double lk=gcz[k]-(szd_gc[j]-szd_gc[i]);//获得第 k 个自由项 ATPL[i]-=Pk*lk;//获得法方程自由项 ATPL[j]+=Pk*lk; ATPA[ij(i,i)]+=Pk;//获得法方程系数矩阵 ATPA[ij(j,j)]+=Pk; ATPA[ij(i,j)]-=Pk; } } 高程平差值计算 ////////////////////////////////////////////////////////////////////////// // void SZWPC::ca_dX() { for(int i=0;i
} return(pvv); } ////////////////////////////////////////////////////////////////////////// // 原始数据和平差值输出 void SZWPC::printresult(char *resultfile) { // 残差计算 double pvv=ca_V(); ofstream outfile(resultfile,ios::out);//以输出方式打开文件,若文件不存在,创建文件 //输出原始观测数据 outfile<
分享到:
收藏