条件平差程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
条件平差程序
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define N_max 15
int n,m,r,p; //n:观测值的个数,m:待定点个数,r:多余观测值个数,p:已知高程的水准点个数
float Hd[6]={0};
void Choose()
{
int i;
printf("此程序能够解决闭合水准路线、附和水准路线、支水准路线的条件平差。\n");
printf("请问已知高程的水准点个数为:(不要太多喔,~ 。~):");
scanf("%d",&p);
for(i=1;i<=p;i++)
{
printf("已知点%c点的高程为:",64+i);
scanf("%f",&Hd[i]);
}
}
void Input(float Hgao[][3]) //输入各测点的高程差以及它们之间的距离
{
int i;
for(i=1;i<=n;i++)
{
printf("请输入h%d的数值:",i);
scanf(" %f",&Hgao[i][1]);
printf("请输入S%d的数值:",i);
scanf("%f",&Hgao[i][2]);
}
}
void Equation(int A[][N_max],char Equa[][50],int asd[][6],float Hgao[][3],float W[],int flag)//输入条件方程或者求某待定点的表达式
{
int i,j,k,ppt;
if(flag==1)
{
ppt=r;
printf("请输入%d个条件方程:\n",r);
printf("如:h1+h2+h3+Ha-Hb=0.请务必使等号右边等于0,输入的时候中间不要有空格!\n");
getchar();
for(i=1;i<=r;i++)
{
printf("方程%d\t",i);
gets(Equa[i]);
}
}
else
{
ppt=m;
printf("为求得待定点的高程,请分别给出每个待定点的一个与Ha或者Hb\n以及各个高程差h之间的关系式。\n");
printf("比如,Hc=Ha-h1+h2.你只需要输入Ha-h1+h2。中间不要有空格!\n"); for(i=1;i<=m;i++)
{
printf("待定点%d\t\t",i);
gets(Equa[i]);
}
}
for(i=1;i<=ppt;i++)
{
for(j=1;j<=n;j++)
{
for(k=0;Equa[i][k]!='\0';k++)
{
if(k==0)
{
if(Equa[i][1]==j+48){A[i][j]=1;break;}
}
else
{
if(Equa[i][k]=='+' && Equa[i][k+2]==j+48)
{A[i][j]=1;break;}
else if(Equa[i][k]=='-' && Equa[i][k+2]==j+48)
{A[i][j]=-1;break;}
}
}
}
}
for(i=1;i<=ppt;i++)
{
for(j=1;j<=p;j++)
{
for(k=0;Equa[i][k]!='\0';k++)
{
if(k==0)
{
if(Equa[i][1]==64+j || Equa[i][1]==96+j)
{asd[i][j]=1;break;}
}
else
{
if(Equa[i][k]=='+' && (Equa[i][k+2]==64+j || Equa[i][k+2]==96+j)) {asd[i][j]=1;break;}
else if(Equa[i][k]=='-' && (Equa[i][k+2]==64+j || Equa[i][k+2]==96+j)) {asd[i][j]=-1;break;}
}
}
}
}
if(flag==1)
{
for(i=1;i<=r;i++)
{
for(j=1;j<=n;j++)
{
W[i]+=Hgao[j][1]*A[i][j];
}
for(k=1;k<=p;k++)
{
W[i]+=asd[i][k]*Hd[k];
}
}
}
}
void InitialQ(float Q[][N_max],float Hgao[][3]) //初始化协因数阵
{
int i,j;