水准网间接平差程序设计C++Word格式文档下载.docx

上传人:b****6 文档编号:20688256 上传时间:2023-01-25 格式:DOCX 页数:14 大小:18.04KB
下载 相关 举报
水准网间接平差程序设计C++Word格式文档下载.docx_第1页
第1页 / 共14页
水准网间接平差程序设计C++Word格式文档下载.docx_第2页
第2页 / 共14页
水准网间接平差程序设计C++Word格式文档下载.docx_第3页
第3页 / 共14页
水准网间接平差程序设计C++Word格式文档下载.docx_第4页
第4页 / 共14页
水准网间接平差程序设计C++Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

水准网间接平差程序设计C++Word格式文档下载.docx

《水准网间接平差程序设计C++Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《水准网间接平差程序设计C++Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

水准网间接平差程序设计C++Word格式文档下载.docx

//观测值的权

double*ATPA,*ATPL;

//法方程系数矩阵与自由项

double*dX;

//高程改正数、平差值

double*V;

//残差

doublem_mu;

//单位权中误差

public:

SZWPC();

~SZWPC();

intij(inti,intj);

//对称矩阵下标计算函数

boolinverse(doublea[],intn);

//对称正定矩阵求逆(仅存下三角元素)(参考他人)

voidinputdata(char*datafile);

//输入原始数据函数

intdm_dh(char*name);

//点名转点号

voidca_H0();

//近似高程计算函数

voidca_ATPA();

//法方程组成函数

voidca_dX();

//高程平差值计算函数

voidprintresult(char*resultfile);

//精度估计与平差值输出函数

doubleca_V();

//残差计算函数

voidzxecpc(char*resultfile);

//最小二乘平差函数

};

//////////////////////////////////////////////////////////////////////

//构造函数

SZWPC:

:

SZWPC()

gcz_zs=0;

szd_zs=0;

yz_szd_zs=0;

}

//析构函数

~SZWPC()

if(gcz_zs>

0)

{

delete[]qsd_dh;

delete[]zd_dh;

delete[]gcz;

delete[]P;

delete[]V;

}

if(szd_zs>

delete[]szd_gc;

delete[]ATPA;

delete[]ATPL;

delete[]dX;

for(inti=0;

i<

szd_zs;

i++)

if(dm[i]!

=NULL)delete[](dm[i]);

delete[]dm;

//////////////////////////////////////////////////////////////////////////

//对称矩阵下标计算函数

intSZWPC:

ij(inti,intj)

return(i>

=j)?

i*(i+1)/2+j:

j*(j+1)/2+i;

//对称正定矩阵求逆(仅存下三角元素)(参考他人)

boolSZWPC:

inverse(doublea[],intn)

double*a0=newdouble[n];

for(intk=0;

k<

n;

k++)

doublea00=a[0];

if(a00+1.0==1.0)

{

delete[]a0;

returnfalse;

}

for(inti=1;

i<

doubleai0=a[i*(i+1)/2];

if(i<

=n-k-1)a0[i]=-ai0/a00;

elsea0[i]=ai0/a00;

for(intj=1;

j<

=i;

j++)

{

a[(i-1)*i/2+j-1]=a[i*(i+1)/2+j]+ai0*a0[j];

}

for(i=1;

a[(n-1)*n/2+i-1]=a0[i];

a[n*(n+1)/2-1]=1.0/a00;

delete[]a0;

returntrue;

///////////////////////////////////////////////////////////////////////原始数据输入函数

voidSZWPC:

inputdata(char*datafile)

ifstreaminfile(datafile,ios:

in);

if(!

infile)

cerr<

<

"

Openerror!

endl;

infile>

>

gcz_zs>

szd_zs>

yz_szd_zs;

intunPnumber=szd_zs-yz_szd_zs;

szd_gc=newdouble[szd_zs];

dX=newdouble[szd_zs];

ATPA=newdouble[szd_zs*(szd_zs+1)/2];

ATPL=newdouble[szd_zs];

qsd_dh=newint[gcz_zs];

zd_dh=newint[gcz_zs];

gcz=newdouble[gcz_zs];

V=newdouble[gcz_zs];

P=newdouble[gcz_zs];

dm=newchar*[szd_zs];

for(inti=0;

dm[i]=NULL;

//dm_dh函数根据dm[i]是否为NULL确定dm[i]是否为点名地址

charbuffer[128];

//临时数组,保存从文件中读到的点名

for(i=0;

=yz_szd_zs-1;

i++)//读取已知高程数据

infile>

buffer;

intc=dm_dh(buffer);

szd_gc[i];

for(i=0;

gcz_zs;

i++)//读取观测数据

//读取高程起点名

qsd_dh[i]=dm_dh(buffer);

//读取高程终点

zd_dh[i]=dm_dh(buffer);

gcz[i]>

P[i];

//读取高差值与路线长度

P[i]=1.0/P[i];

//线路长转化为观测值的权

infile.close();

////////////////////////////////////////////////////////////////////点名转点号,返回点名对应的点号

dm_dh(char*name)

i++)

if(dm[i]!

=NULL)

if(strcmp(name,dm[i])==0)returni;

//将待查点名与已经存入点名数组的点名比较,若存在返回点号

else

intlen=strlen(name);

//判断点名长度

dm[i]=newchar[len+1];

//为点名申请存储空间

strcpy(dm[i],name);

//待查点名是一个新的点名,将新点名的地址放到dm数组中

returni;

//返回点号

}

return-1;

//dm数组已经存满,且没有待查点名

////////////////////////////////////////////////////////////////////////////高程近似值计算

ca_H0()

for(inti=yz_szd_zs;

i++)szd_gc[i]=-10000.9;

//为计算机设置辨别未知高程点的标志

for(intj=1;

;

intk=0;

//计算出近似高程的点数

for(i=0;

intk1=qsd_dh[i];

intk2=zd_dh[i];

if(szd_gc[k1]>

-10000.0&

&

szd_gc[k2]<

-10000.0)//k1点高程或高程近似值已知,k2点高程或高程近似值未知

szd_gc[k2]=szd_gc[k1]+gcz[i];

//计算近似高程

k++;

else

if(szd_gc[k1]<

szd_gc[k2]>

-10000.0)//k2点高程或高程近似值已知,k1点高程或高程近似值未知

{

szd_gc[k1]=szd_gc[k2]-gcz[i];

k++;

}

if(k==(szd_zs-yz_szd_zs))break;

//所有的近似高程计算完成,退出

//组成法方程

ca_ATPA()

//intt=szd_zs;

szd_zs*(szd_zs+1)/2;

i++)ATPA[i]=0.0;

//赋初值

i++)ATPL[i]=0.0;

k<

k++)

inti=qsd_dh[k];

//获取点号

intj=zd_dh[k];

doublePk=P[k];

//获取权值

doublelk=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;

//高程平差值计算

ca_dX()

i++)ATPA[ij(i,i)]=1.0e30;

//处理已知点

inverse(ATPA,szd_zs))//矩阵求逆

法方程系数矩阵降秩!

//矩阵为奇异矩阵,无法求逆

exit(0);

//退出程序

i++)//计算高程改正数

doublexi=0.0;

for(intj=0;

j<

j++)

xi+=ATPA[ij(i,j)]*ATPL[j];

dX[i]=xi;

szd_gc[i]+=xi;

//计算高程平差值

//残差计算

doubleSZWPC:

ca_V()

doublepvv=0.0;

=gcz_zs-1;

intk1=qsd_dh[i];

intk2=zd_dh[i];

V[i]=szd_gc[k2]-szd_gc[k1]-gcz[i];

pvv+=V[i]*V[i]*P[i];

return(pvv);

//原始数据和平差值输出

printresult(char*resultfile)

doublepvv=ca_V();

//残差计算

ofstreamoutfile(resultfile,ios:

out);

//以输出方式打开文件,若文件不存在,创建文件

//输出原始观测数据

outfile<

endl<

观测总数:

gcz_zs<

"

总点数:

已知点数:

yz_szd_zs<

=====================已知高程====================="

//输出原始观测数据已知点点号、高程

outfile<

dm[i];

setiosflags(ios:

fixed);

setw(10)<

setprecision(4)<

szd_gc[i]<

=====================高差观测值====================="

//输出原始观测数据高程观测值与路线长

起始点名"

终点点名"

高差观测值(m)"

两点间距离(km)"

dm[qsd_dh[i]]<

setw(9)<

dm[zd_dh[i]];

setw(16)<

gcz[i];

1.0/P[i]<

m_mu=sqrt(pvv/(gcz_zs-(szd_zs-yz_szd_zs)));

//计算单位权中误差

=====================单位权中误差====================="

//输出单位权中误差

σ0="

m_mu<

=====================高程平差值及其精度====================="

//输出高程平差值及其精度

点名近似高程改正数高程平差值中误差"

setw

(2)<

doubledx=dX[i];

doubleqii=ATPA[ij(i,i)];

setw(12)<

szd_gc[i]-dx;

dx;

setw(11)<

sqrt(qii)*m_mu<

//输出观测值平差值及其精度

=====================观测值平差值及其精度====================="

起点终点观测高差v"

高差平差值观测权中误差"

doubleqii=ATPA[ij(k1,k1)];

doubleqjj=ATPA[ij(k2,k2)];

doubleqij=ATPA[ij(k1,k2)];

doubleml=sqrt(qii+qjj-2.0*qij)*m_mu;

outfile.width

(2);

dm[k1];

outfile.width(7);

dm[k2];

V[i];

gcz[i]+V[i];

ml<

outfile.close();

//水准网最小二乘平差

zxecpc(char*resultfile)

ca_H0();

//近似高程计算

ca_ATPA();

//组成法方程

ca_dX();

//高程平差值计算

///////////////////////////////////////////////////////////////////////

intmain()

char*datafile="

算例\\Data.txt"

//原始数据文件存储地址指针

char*resultfile="

算例\\Result.txt"

//平差结果输出地址指针

cout<

水准网经典间接平差"

原数据文件位置:

datafile<

平差结果文件位置:

resultfile<

SZWPCnew_net;

//定义新的对象

new_net.inputdata(datafile);

//输入原始数据

new_net.zxecpc(resultfile);

//最小二乘平差计算

new_net.printresult(resultfile);

//输出平差结果

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1