1、 //////////////////////////////////////////////////// // visual C++6.0 编译通过 // //////////////////////////////////////////////////// /////////////////////////////////////////////////// // 参考资料 // // 部分网络资料 // // 宋力杰《测量平差程序设计》
2、 //
//姚连壁《基于matlab的控制网平差程序设计》 //
///////////////////////////////////////////////////
#include
3、ass SZWPC { private: int gcz_zs; //高差总数 int szd_zs; //总点数 int yz_szd_zs; //已知点数 double m_pvv; //[pvv] int *qsd_dh; //高差起点号 int *zd_dh; //高差终点号 char **dm; //点名地址数组 double *gcz; //观测值数组 double *szd_gc; //高程值数组 double *P; //观测值的
4、权 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);//输入原始数据函数
5、 int dm_dh(char *name); //点名转点号 void ca_H0(); //近似高程计算函数 void ca_ATPA(); //法方程组成函数 void ca_dX(); //高程平差值计算函数 void printresult(char *resultfile); //精度估计与平差值输出函数 double ca_V(); //残差计算函数 void zxecpc(char *resultfile);//最小二乘平差函数 }; /////////////////
6、///////////////////////////////////////////////////// // 构造函数 SZWPC::SZWPC() { gcz_zs=0; szd_zs=0; yz_szd_zs=0; } ////////////////////////////////////////////////////////////////////// // 析构函数 SZWPC::~SZWPC() { if(gcz_zs>0) { delete []qsd_dh; delete []zd_dh; delet
7、e []gcz;
delete []P;
delete []V;
}
if(szd_zs>0)
{
delete []szd_gc;
delete []ATPA;
delete []ATPL;
delete []dX;
for(int i=0; i 8、///////
// 对称矩阵下标计算函数
int SZWPC::ij(int i,int j)
{
return (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 9、k 10、j]+ai0*a0[j];
}
}
for(i=1;i 11、le,ios::in);
if(! infile)
{
cerr<<" Open error!"< 12、ew 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 13、据
{
infile>>buffer;
int c=dm_dh(buffer);
infile>>szd_gc[i];
}
for(i=0;i 14、测值的权
}
infile.close();
}
//////////////////////////////////////////////////////////////////// 点名转点号,返回点名对应的点号
int SZWPC::dm_dh(char *name)
{
for(int i=0; i 15、
}
else
{
int len = strlen(name);//判断点名长度
dm[i] = new char[len+1];//为点名申请存储空间
strcpy(dm[i], name);//待查点名是一个新的点名,将新点名的地址放到dm数组中
return i;//返回点号
}
}
return -1; //dm数组已经存满,且没有待查点名
}
///////////////////////////////////////////////////////////////////// 16、///////高程近似值计算
void SZWPC::ca_H0()
{
for(int i=yz_szd_zs;i 17、0.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;//所 18、有的近似高程计算完成,退出
}
}
//////////////////////////////////////////////////////////////////////////
// 组成法方程
void SZWPC::ca_ATPA()
{
//int t=szd_zs;
for(int i=0; i 19、k 20、Pk;
}
}
//////////////////////////////////////////////////////////////////////////
// 高程平差值计算
void SZWPC::ca_dX()
{
for(int i=0;i 21、or(i=0; i 22、0;
for(int i=0;i<=gcz_zs-1;i++)
{
int k1=qsd_dh[i];
int k2=zd_dh[i];
V[i]=szd_gc[k2]-szd_gc[k1]-gcz[i];
pvv+=V[i]*V[i]*P[i];
}
return(pvv);
}
//////////////////////////////////////////////////////////////////////////
// 原始数据和平差值输出
void SZWPC::printresult(char *resultfile) 23、
{
double pvv=ca_V(); // 残差计算
ofstream outfile(resultfile,ios::out);//以输出方式打开文件,若文件不存在,创建文件
//输出原始观测数据
outfile< 24、点号、高程
for(int i=0;i<=yz_szd_zs-1;i++)
{
outfile<<" "< 25、<<"终点点名"<<" "<<"高差观测值(m)"<<" "<<"两点间距离(km)"< 26、on(4)<<1.0/P[i]< 27、ndl;//输出高程平差值及其精度
outfile<<"点名 近似高程 改正数 高程平差值 中误差"< 28、s::fixed);
outfile< 29、 观测值平差值及其精度 ====================="< 30、le ml=sqrt(qii+qjj-2.0*qij)*m_mu;
outfile.width(2);
outfile< 31、tiosflags(ios::fixed);
outfile< 32、//////////////////////////////////////////////////
// 水准网最小二乘平差
void SZWPC::zxecpc(char *resultfile)
{
ca_H0(); //近似高程计算
ca_ATPA(); // 组成法方程
ca_dX(); // 高程平差值计算
}
///////////////////////////////////////////////////////////////////////
int main()
{
char *datafile ="算例\\Data.t 33、xt";//原始数据文件存储地址指针
char *resultfile ="算例\\Result.txt";//平差结果输出地址指针
cout<