matlab 常见经典平差 程序
希望本人编写的经典平差可以对 matlab 初学者以及测绘专业的学生有用 By cowboy function void() sprintf('请选择平差类型') sprintf('1: 参数平差n2: 条件平差n3:具有条件的参数平差n4: 具有参数的条件平差n') a=input('请输入对应号码n'); switch (a) case 1 % 参数平差 V=AX-L sprintf('1:参数平差 V=AX-L') n=input('请输入 n='); t=input('请输入 t='); A=input('请输入系数矩阵 A='); L=input('请输入常数项矩阵 L='); P=diag(input('请输入权阵 P=') %P=input('请输入权阵 P='); N=A'*P*A; U=A'*P*L; sprintf('开始计算') X=inv(N)*(U); V=A*X-L; Qx=inv(N); u=sqrt(V'*P*V)/(n-t); fid=fopen('data.txt','wt'); %写入文件路径,文件输出 fprintf(fid,'=参数平差: V=AX-L =n'); fprintf(fid,'输出 n,tn') ; fprintf(fid,'%12.5f %12.5fn',n ,t) ;%n,t fprintf(fid,'输出矩阵 An') m,n=size(A); %A for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',A(i,j); else fprintf(fid,'%12.5ft',A(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Ln') ; m,n=size(L); %L for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',L(i,j); else fprintf(fid,'%12.5ft',L(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Pn') ; m,n=size(P); %P for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',P(i,j); else fprintf(fid,'%12.5ft',P(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Xn'); m,n=size(X); %X for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',X(i,j); else fprintf(fid,'%12.5ft',X(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Vn'); m,n=size(V); %V for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',V(i,j); else fprintf(fid,'%12.5ft',V(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Qxn'); m,n=size(Qx); %Qx for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',Qx(i,j); else fprintf(fid,'%12.5ft',Qx(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出单位权中误差 un'); m,n=size(u); %u for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',u(i,j); else fprintf(fid,'%12.5ft',u(i,j); end end end fprintf(fid,'n'); fclose(fid); case 2 % 条件平差 BV+W=0 sprintf('2:条件平差 BV+W=0') n=input('请输入 n='); t=input('请输入 t='); B=input('请输入系数矩阵 B='); W=input('请输入自由项向量 W='); P=input('请输入权阵 P='); sprintf('开始计算') K=-inv(B*inv(P)*B')*W; V=inv(P)*B'*K; u=sqrt(V'*P*V)/(n-t); Ql=inv(P)-inv(P)*B'*inv(B*inv(P)*B')*B*inv(P); fid=fopen('data.txt','wt'); %写入文件路径,文件输出 fprintf(fid,'=条件平差: BV+W=0 =n'); fprintf(fid,'输出 n,tn') ; fprintf(fid,'%12.5f %12.5fn',n ,t) ;%n,t fprintf(fid,'输出矩阵 Bn'); m,n=size(B); %B for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',B(i,j); else fprintf(fid,'%12.5ft',B(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Wn'); m,n=size(W); %W for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',W(i,j); else fprintf(fid,'%12.5ft',W(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Pn'); m,n=size(P); %P for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',P(i,j); else fprintf(fid,'%12.5ft',P(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Vn'); m,n=size(V); %V for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',V(i,j); else fprintf(fid,'%12.5ft',V(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Qxn'); m,n=size(Ql); %Ql for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',Ql(i,j); else fprintf(fid,'%12.5ft',Ql(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出单位权中误差 un'); m,n=size(u); %u for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',u(i,j); else fprintf(fid,'%12.5ft',u(i,j); end end end fprintf(fid,'n'); fclose(fid); case 3 % 具有条件的参数平差 % 参数平差 V=AX-L % 条件平差 BX+W=0 sprintf('3:具有条件的参数平差 V=AX-L;BX+W=0') n=input('请输入 n='); t=input('请输入 t='); r=input('请输入 r='); A=input('请输入误差方程系数矩阵 A='); L=input('请输入常数项矩阵 L='); B=input('请输入条件方程系数矩阵 B='); W=input('请输入自由项向量 W='); P=input('请输入权阵 P='); sprintf('开始计算') K=-(inv(B*inv(A'*P*A)*B')*(W+B*inv(A'*P*A)*A'*P*L) X=(inv(A'*P*A)*(B'*K+A'*P*L) N=(A'*P*A) M=B*inv(N)*B' Qx=inv(N)-inv(N)*B'*inv(M)*B*inv(N) u=sqrt(V'*P*V)/(n-t+r) fid=fopen('data.txt','wt'); %写入文件路径,文件输出 fprintf(fid,'= 具 有 条 件 的 参 数 平 差 : V=AX-L;BX+W=0 =n'); fprintf(fid,'输出 n,t,rn') ; fprintf(fid,'%12.5f %12.5f %12.5fn',n ,t,r); %n,t,r fprintf(fid,'输出矩阵 An'); m,n=size(A); %A for i=1:1:m for j=1:1:n if j=n fprintf(fid,'%12.5fn',A(i,j); else fprintf(fid,'%12.5ft',A(i,j); end end end fprintf(fid,'n'); fprintf(fid,'输出矩阵 Ln');