C语言间接平差程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
教材《误差理论与测量平差基础》第二版武汉大学出版社
P108页的例7-1的运行结果:
源程序:
#define N 5 /*N是观测值个数*/
#define T 3 /*T是必要观测数*/
#include
#include
float Nbb[T][T],Nb[T][T],W[T][1],x[T][1];
main()
{
float D(float a[T][N],float b[N][N],float c[N][T]);
float K(float a[T][N],float b[N][N],float c[N][1]);
float G(float a[T][T]);
float F(float ca[T-1][T-1]);
float DM(float a[1][N],float b[N][N] ,float c[N][1]);
int i,j,m,n;
float B[N][T],BT[T][N],V[N][1],VT[1][N],P[N][N],C[N][1],Bx[N][1],f,g,h,x1; printf("请输入V的系数B[N][T]:\n");
for(i=0;i for(j=0;j scanf("%8f",&B[i][j]); printf("请输入观测值的权阵P[N][N]:\n"); for(i=0;i for(j=0;j scanf("%8f",&P[i][j]); printf("请输入常数C[N][1]:\n"); for(i=0;i for(j=0;j<1;j++) scanf("%8f",&C[i][j]); for(i=0;i for(j=0;j BT[j][i]=B[i][j]; g=D(BT, P, B); h=K(BT, P, C); f=G(Nbb); for(i=0;i for(j=0;j<1;j++) { x[i][j]=Nb[i][0]*W[0][j]; for(m=1;m x[i][j]+=(Nb[i][m]*W[m][j]); } for(i=0;i x[i][0]=x[i][0]/f; for(i=0;i for(j=0;j<1;j++) { Bx[i][j]=B[i][0]*x[0][j]; for(m=1;m Bx[i][j]+=(B[i][m]*x[m][j]); } for(i=0;i V[i][0]=(Bx[i][0]-C[i][0]); for(i=0;i for(j=0;j<1;j++) VT[j][i]=V[i][j]; x1=DM(VT,P,V); x1=x1/(N-T); printf("参数x[T][1]=\n"); for(i=0;i printf("%15f",x[i][0]); printf("\n"); printf("改正数V[N][1]=\n"); for(i=0;i printf("%15f",V[i][0]); printf("\n单位权中误差x1=%15f",sqrt(x1)); printf("\n协因数阵Qxx[T][T]:\n"); for(i=0;i { for(j=0;j printf("%15f",Nb[i][j]/f); printf("\n"); } } float G(float a[T][T]) { int i,j,m,n; float c[T-1][T-1],y=0; for(i=0;i for(j=0;j { for(m=0;m for(n=0;n { if(m c[m][n]=a[m][n]; if(m>i&&n c[m-1][n]=a[m][n]; if(mj) c[m][n-1]=a[m][n]; if(m>i&&n>j) c[m-1][n-1]=a[m][n]; } if((i+j)%2==0) Nb[j][i]=F(c); else Nb[j][i]=(-1)*F(c); } for(m=0;m y+=(a[0][m]*Nb[m][0]); return (y); } float F(float ca[T-1][T-1]) { int i,j,m,n,s,t,k=1; float f=1,c,x,sn; for (i=0,j=0;i if (ca[i][j]==0) {