当前位置:文档之家› 条件平差程序

条件平差程序

条件平差程序#include <stdio.h>#include <math.h>#include <conio.h>#define N_max 15int 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;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j){Q[i][j]=Hgao[i][2];}}}}void Calculate(float Q[][N_max],float Hgao[][3],float Naa[][10],int A[][N_max]) //计算Naa {int i,j,k;float bs[10][N_max]={0};for(i=1;i<=r;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++){bs[i][j]=bs[i][j]+A[i][k]*Q[k][j];}}}for(i=1;i<=r;i++){for(j=1;j<=r;j++){for(k=1;k<=n;k++){Naa[i][j]+=bs[i][k]*A[j][k];}}}}void Realv(int A[][N_max],float Q[][N_max],float k123[],float v[]) //计算改正数方程{int i,j,k;float bs[10][N_max]={0};for(i=1;i<=n;i++){for(j=1;j<=r;j++){for(k=1;k<=n;k++){bs[i][j]+=Q[i][k]*A[j][k];}}}for(i=1;i<=n;i++){for(j=1;j<=r;j++){v[i]+=bs[i][j]*k123[j];}}}void getresult(float a[][10],float k123[]) //计算k{int i,j,k,wo;float app,temp;for(i=1;i<r;i++){wo=i;for(j=i+1;j<=r;j++){if(fabs(a[j][i]) > fabs(a[wo][i]))wo=j;}if(wo!=i){for(k=i;k<=r+1;k++){temp=a[i][k];a[i][k]=a[wo][k];a[wo][k]=temp;}}for(j=i+1;j<=r;j++){app=a[j][i]/a[i][i];for(k=i;k<=r+1;k++){a[j][k]-=app*a[i][k];}}}k123[r]=a[r][r+1]/a[r][r];for(i=r-1;i>=1;i--){for(j=i+1;j<=r;j++){a[i][r+1]-=a[i][j]*k123[j];}k123[i]=a[i][r+1]/a[i][i];}}void Solution(float Naa[][10],float W[],float k[],int A[][N_max],float Q[][N_max],float v[]) {int i;if(r==1){k[1]=(-1)*W[1]/Naa[1][1];Realv(A,Q,k,v);}else{for(i=1;i<=r;i++){Naa[i][r+1]=(-1)*W[i];}getresult( Naa, k);Realv(A,Q,k,v);}}void Answer(float Hgao[][3],float v[],float W[],float Point[],int flag) //输出答案{int i,j,k,Asd[N_max][6]={0};int a123[10][N_max]={0};char che[N_max][50];printf("改正数方程的解为:\n");for(i=1;i<=n;i++){printf(" v[%d] ",i);}putchar('\n');for(i=1;i<=n;i++){printf("%f ",v[i]);}putchar('\n');printf("平差后各高差值:\n");for(i=1;i<=n;i++){printf(" h[%d] ",i);}putchar('\n');for(i=1;i<=n;i++){printf("%f ",Hgao[i][1]+v[i]);}putchar('\n');Equation( a123, che, Asd, Hgao, W, flag);printf("\n平差后各待定点的高程如下:\n待定点\t ");for(i=1;i<=m;i++)printf("%d\t ",i);printf("\n ");for(i=1;i<=m;i++){for(j=1;j<=n;j++){if(a123[i][j]!=0){Point[i]+=(Hgao[j][1]+v[j])*a123[i][j];}for(k=1;k<=p;k++){Point[i]+=Asd[i][k]*Hd[k];}printf("%f\t ",Point[i]);}}void main(){int t,flag=1;float k[10],v[N_max]={0},Point[N_max]={0};int A[10][N_max]={0},asd[N_max][6]={0};float Hgao[N_max][3],W[10]={0};float Q[N_max][N_max]={0},Naa[10][10]={0}; char Equa[N_max][50];printf("\t\t");putchar(16);putchar(16);printf(" 欢迎使用"); putchar(17);putchar(17);putchar('\n');Choose();printf("请输入观测值个数n:"); scanf("%d",&n);printf("请输入必要观测值个数t:"); scanf("%d",&t);r=n-t;printf("请输入待定点的个数m:"); scanf("%d",&m);Input(Hgao);InitialQ(Q,Hgao);Equation( A, Equa, asd, Hgao, W, flag);flag=0;Calculate(Q,Hgao,Naa,A);Solution( Naa, W, k, A, Q, v);Answer( Hgao, v, W, Point, flag);printf("\n\n程序已结束。

相关主题