水准网平差程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//重要说明:原始数据文件中,未知点的高程可以随意输入,也可以不输入空缺, 程序自动把待定点高程赋值为 0
} for(i=ne;i<nz;i++) {
fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%s%lf",&dh,ch1,&gc); dm[i]=ch1;H[i]=0; } for(i=0;i<nn;i++) { fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%d%lf%lf",
H[n1[i]-1]=H[n2[i]-1]-h[i]; } } for(j=0;j<nz;j++) //如果有任意一个点的高程不为零,说明高程近似值计算没有 完毕,则 j0=1。 { if(H[j]==0) j0=1; } if(j0==0) break; //说明所有点的近似高程计算完毕,退出最外层的 for(;;)循环。 if(n0>nn && j0==1) { AfxMessageBox("近似高程无法计算,原始数据编排错误,程序自动终 止!"); break; }}} //形成误差方程式系数矩阵 B for(i=0;i<nn;i++) { if(n1[i]>ne) B[i][n1[i]-ne-1]=-1; if(n2[i]>ne) B[i][n2[i]-ne-1]=+1; //定权 P[i]=1/S[i]; l[i]=H[n1[i]-1]+h[i]-H[n2[i]-1]; } for(i=0;i<nw;i++) { for(j=0;j<nw;j++) { Nbb[i][j]=0.0; for(k=0;k<nn;k++) { Nbb[i][j]+=B[k][i]*B[k][j]*P[k];}}} for(i=0;i<nw;i++) { W[i]=0.0; for(k=0;k<nn;k++) {
js=(int *)malloc(n*sizeof(int));
for(k=0;k<=n-1;k++)
{
d=0.0;
for(i=k;i<=n-1;i++)
for(j=k;j<=n-1;j++)
int i,j,k; FILE *fp; fp=fopen("out.txt","w"); VPV =0.0; for(i=0;i<nn;i++) {
V[i]=0.0; for(k=0;k<nw;k++) {
V[i]+=B[i][k]*X[k]; } V[i]+=-l[i]; VPV+=V[i]*V[i]*P[i]; ph[i]=h[i]+V[i]; } //计算验后单位权中误差 SIG0=sqrt(VPV/(nn-nw)); //计算未知参数-平差高程的自协方差 for(i=0;i<nw;i++) { DX[i]=SIG0*SIG0*Nbb[i][i]; } double **QLL,**SIGL; QLL = new double * [nn]; SIGL= new double * [nn]; for(i=0;i<nn;i++) { QLL[i] = new double [nn]; SIGL[i]= new double [nn]; } //计算观测值的平差值的中误差 QLL=B*inv(Nbb)*BT DLL=SIG0*SIG0*QLL for(i=0;i<nn;i++) {
fprintf(fp," %3d %3d %8.4lf %8.4lf %8.1lf %8.4lf %8.1lf\n", n1[i],n2[i],h[i],S[i],V[i]*1000,ph[i],SIGL[i][i]*1000);
}
fprintf(fp,"\n\n 点号
已知点名
已知高程(m)\n");
int i; int MAXLINE =512; char buff[513],ch1[15]; CStdioFile fp; if( !fp.Open(filename,CFile::modeRead|CFile::typeText,NULL)) {
AfxGetApp()->m_pMainWnd->MessageBox( "数据文件不存在或数据文件错!", "进程. . . . . .!!!",MB_OK|MB_ICONSTOP);
for(j=0;j<nn;j++) {
QLL[i][j] =0.0; SIGL[i][j]=0.0; for(k=0;k<nw;k++) {
for(int m=0;m<nw;m++) {
QLL[i][j]+=Nbb[k][m]*B[i][k]*B[j][m]; }} SIGL[i][j]=SIG0*sqrt(QLL[i][j]); }} /* double BN[50][20]; for(i=0;i<nn;i++) { for(j=0;j<nw;j++) { BN[i][j]=0.0; for(k=0;k<nw;k++) { BN[i][j]+=B[i][k]*Nbb[k][j];}}} for(i=0;i<nn;i++) { for(j=0;j<nn;j++) { QLL[i][j]=0.0; SIGL[i][j]=0.0; for(k=0;k<nw;k++) { QLL[i][j]+=BN[i][k]*B[j][k]; } SIGL[i][j]=SIG0*sqrt(QLL[i][j]);}} */ fprintf(fp," ********水准网间接平差结果**********\n\n"); fprintf(fp,"控制网信息: 总点数=%3d 未知点数=%3d 测段数=%3d\n", nz,nw,nn); fprintf(fp,"\n\n 验后单位权中误差=%6.2lf(mm)\n\n",SIG0*1000); fprintf(fp,"\n 起点号 终点号 观测高差(m) 路线长(km) 改正数(mm) 平差高差(m) 中误差(mm)\n"); for(i=0;i<nn;i++) {
B[i] = new double [nw]; for(i=0;i<nn;i++) {
P[i]=0.0; l[i]=0.0; for(j=0;j<nw;j++)
B[i][j]=0.0; } //计算待定点的近似高程 int n0=0; //计算次数 int j0; //高程计算是否完毕?j0=0,计算完毕;j0=1,未计算完毕 for(;;) {
W[i]+=B[k][i]*P[k]*l[k];}} invGJ(Nbb,nw); for(i=0;i<nw;i++) {
X[i]=0.0; for(k=0;k<nw;k++) {
X[i]+=Nbb[i][k]*W[k];}}} //精度评定与成果输出 void CGckzwpc::jdpd() {
delete []SIGL;
for(i=0;i<nw;i++)
{
delete []Nbb[i];
}
delete []Nbb;
fclose(fp);
}
int CGckzwpc::invGJ(double **a,int n)
{
int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int *)malloc(n*sizeof(int));
for(i=0;i<ne;i++)
{
fprintf(fp," %3d %20s %10.4lf \n",i+1,dm[i],H[i]);
}
fprintf(fp,"\n\n 点号
待定点名
平差高程(m)
(mm)\n\n");
for(i=0;i<nw;i++)
{
fprintf(fp," %3d %20s
%10.4lf
实验 任务
用 C\C++编写水准网间接平差程序,并调试通过,用实测数据实算分析,并评定 精度。
实验 要求
实验 总结
1. 个人独立编写程序,原始数据存放于文本文件或数据库文件中。 2. 程序应具有通用性,即任意网形都可以平差。 3. 用实测的数据进行计算分析。 4. 评定待定点的高程精度。 本次实验的收获、体会、经验、问题和教训:
辽宁工程技术大学上机实验报告
成绩
实验名称
பைடு நூலகம்
水准网间接平差程序设计
院系
测绘与地理 科学学院
专业
测绘工程
班级
09-1 班
姓名
贺永成
学号 0904070207 日期 2011.12.26
实验 目的
简述本次实验目的: 掌握用间接平差法对任意网行的水准网进行平差的算法设计以及程序编制。并采 用读文件处理数据的方法,设计水准网处理类。
_exit(1); return FALSE; } fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%d%d",&nz,&nw,&nn); ne=nz-nw; int dh; double gc; for(i=0;i<ne;i++) { fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%s%lf",&dh,ch1,&gc); dm[i]=ch1;H[i]=gc;
&n1[i],&n2[i],&h[i],&S[i]); } fp.Close(); return TRUE; } void CGckzwpc::pc() { int i,j,k; Nbb = new double * [nw]; for(i=0;i<nw;i++)
Nbb[i] = new double [nw]; B = new double * [nn]; for(i=0;i<nn;i++)
教师 评语
// Gckzwpc.cpp: implementation of the CGckzwpc class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Survey.h" #include "Gckzwpc.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGckzwpc::CGckzwpc() { } CGckzwpc::~CGckzwpc() { } bool CGckzwpc::ReadData(CString filename) {
虽然我听懂了老师课上讲解此实验的思路和方法,并且亲自编写了一番, 对于一个人来说,这样复杂的程序,并不是很简单,遇到了种种问题和困难,所 以此实验没有圆满完成,但从中我学到了不少知识,非常清楚掌握了 MFC 框架。 就我而言,我们首先要明白本次项目的内容,并针对内容进行数据的处理,在输 入的过程中要一一核对,一些代码的错输,使我们输出出错,导致我们不能计算 算出数据。以后编程中需日要多加注意,还有得明白和记住 C 语言区分大小写,我 们得明确知道关键词中的字母的大小写,以防出错还找不找地方。
n0++; j0=0; {
for(i=0;i<nn;i++) //循环高差 {
if(H[n1[i]-1]>0 && H[n2[i]-1]>0) continue; if(H[n1[i]-1]>0 && H[n2[i]-1]==0) {
H[n2[i]-1]=H[n1[i]-1]+h[i]; } if(H[n1[i]-1]==0 && H[n2[i]-1]>0) {
%5.1lf\n",
i+ne+1,dm[i+ne],X[i]+H[ne+i],sqrt(DX[i])*1000);
}
for(i=0;i<nn;i++)
{
delete [] B[i];
delete [] QLL[i];
delete [] SIGL[i];
}
delete []B;
delete []QLL;