1、 a1=cos*cos-sin*sin*sin,a2=-cos*sin-sin*sin*cos,a3=-sin*cos b1=cos*sin,b2=cos*cos,b3=-sin c1=sin*cos+cos*sin*sin,c2=-sin*sin+cos*sin*cos,c3=cos*cos4、逐点计算控制点的像点坐标的近似值,共线方程为:x=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)/(a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs) y=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)/(a3*(X-Xs)+b3*(Y-Ys)+c3
2、*(Z-Zs) (x)=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)/(a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs)(y)=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)/(a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs)5、组成误差方程:Vx=a11*dXs+a12*dYs+a13*dZs+a14*d+a15*d+a16*d+(x)-x Vy=a21*dXs+a22*dYs+a23*dZs+a24*d+a25*d+a26*d+(y)-y系数求解(是共线方程分别外方位元素求导,是共线方程线性化的系数):变量代换A= a1*(
3、X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)B= a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)C= a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs)a11=(a1*f+a3*x)/C,a12=(b1*f+b3*x)/C,a13=(c1*f+c3*f)/C,a14=y*sin-(x*(x*cos-y*sin)/f+f*cos)cos,a15=-f*sin-(x*(x*sin+y*cos)/f),a16=y a21=(a2*f+a3*x)/C,a22=(b2*f+b3*x)/C,a23=(c2*f+c3*x)/C,a24=-xsin-(x*(x*cos-y*sin)/
4、f-f*sin)cos,a25=-f*cos-(y*(x*sin+y*cos)/f),a26 =-x 误差方程的常系数(是像点坐标观测值与计算的近似值的差值): lx=x-(x) ,ly=y-(y)6、组成法方程,解求外方位元素改正数X=(ATA)-1ATL(A为误差方程的系数矩阵,L为误差方程的常系数矩阵,通过步骤5求得,此处先求ATA再求矩阵的逆矩阵,解得的改正数加上相应的近似值得到外方位元素新的近似值)7、检查计算是否收敛:将求得的外方位元素改正数与规定的限差比较,大于限差继续迭代,小于限差则终止。四、各子函数详细设计的关键技术参数子函数(输入函数、Input,矩阵求积Matrixmul
5、tiply,计算函数Resection,矩阵转置Matrixtranspose,矩阵求逆Matrixinverse,输出函数Output)主要用了Matrixtranspose,矩阵的行变列,列变行,参数为要转置的矩阵,转置后的矩阵,要转置矩阵的行列数,Matrixinverse,求矩阵的代数余子式,参数有要求逆的矩阵和,逆矩阵的行数,Matrixmultiply,一矩阵的行乘以二矩阵的列,参数为一矩阵,二矩阵,所求矩阵,一的行,一的列,二的列五、像片外方位元素解算结六、实习体会从周一开始进行整个实习框架进行构建,编写了实习的思路既步骤;然后是梳理框架,要用到的子函数,子函数参数,怎么编写,有
6、不懂的东西网上参考资料;再是自己动手编程,发现编程要求很细腻,出不得一点差错,程序编写出来后,有很多的错误,要求逐一进行改正,修改;最后才得以运行。通过本次实习,我深刻理解了单片空间后方交会原理,进一步熟悉理解了C语言编程,认识到了时间的搭配的重要性和参考资料的必要性,当遇到难题是要迎难而上,达到突破,当完成是能感到一丝丝欣慰和成就感。附录:源代码#include stdio.hmath.hMatrixmultiply.cMatrixtranspose.cMatrixinverse.cvoid main() int i,j,k,f=0; double x0=0.00018, y0=0.0002
7、6,fk=0.15324; /内方位元素 double m=40000; /估算比例尺 double R33,XG61,AT68,ATA66,ATL61; double Xs=0.0, Ys=0.0, Zs=0.0,Q=0.0,W=0.0,K=0.0; double X,Y,Z,L81,A86; double B45=-0.08615,-0.06899,36589.41,25273.32,2195.17,-0.05340,0.08221,37631.08,31324.51,728.69,-0.01478,-0.07663,39100.97,24934.98,2386.80,0.01046,0.
8、06443,40426.54,30319.81,757.31; for(i=0;i=0.00000001|XG40=0.00000001|XG50=0.00000001); /当限差满足要求时要再一次进行旋转矩阵的求解 R00=cos(Q)*cos(K)-sin(Q)*sin(W)*sin(K); printf(迭代次数:%d,f); /屏幕输出误差方程系数阵、常数项、改正数nn误差方程系数矩阵A为:nn); for (i=0;6; for(j=0;jj+) printf(%13.5e ,Aij); printf(nn常数项L为:8;1;,Lij);n改正数XG为:,XGij);n相片的外方位
9、元素为: Xs=%13.7e, Ys=%13.7e, Zs=%13.7e nn,Xs,Ys,Zs); Q=%13.7e, W=%13.7e, K=%13.7e n,Q,W,K);n旋转矩阵R为:3;,Rij);/子函数 #include math.hstdio.h int Matrixinverse(a,n) int n; double a; int *is,*js,i,j,k,l,u,v; double d,p; is=malloc(n*sizeof(int); js=malloc(n*sizeof(int); for (k=0; k=n-1; k+) d=0.0; for (i=k; i
10、i+) for (j=k; jd) d=p; isk=i; jsk=j; if (d+1.0=1.0) free(is); free(js);err*not invn return(0); if (isk!=k) for (j=0; u=k*n+j; v=isk*n+j; p=au; au=av; av=p; if (jsk! for (i=0; u=i*n+k; v=i*n+jsk; p=au; l=k*n+k; al=1.0/al; for (j=0; if (j! u=k*n+j; au=au*al; for (i=0; if (i! for (j=0; if (j! u=i*n+j;
11、au=au-ai*n+k*ak*n+j; for (i=0; if (i! u=i*n+k; au=-au*al; for (k=n-1; k=0; k-) if (jsk! u=k*n+j; v=jsk*n+j; u=i*n+k; v=i*n+isk; free(is); return(1);void Matrixmultiply(a,b,c,m,n,k)int m,n,k;double a,b,c; int i,j,l,u;m; for (j=0;k; u=i*k+j; cu=0.0; for (l=0; ln; l+) cu+=ai*n+l*bl*k+j; return;void Matrixtranspose(a,b,m,n)int m,n;double a,b; int i,j,u; u=j*m+i;bu=0.0; bj*m+i=ai*n+j; return;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1