gusucode.com > matlab程序语言实现的水准网平差程序,使用于测绘人员 > code1/maltab程序语言实现的水准网平差程序,使用于测绘人员/malab水准网平差/adjlevel.m

    function[] = adjlevel(ofile)
%adjlevel: adjustent for leveling network
%INPUT:
%  ofile: output file name
%OUTPUT: None
%
%AUTHOR: Hua WANG
%DATE: 20/05/2009

%structures
pt = struct('id',{},'hgt',{},'flag',{});
edge = struct('sptid',{},'eptid',{},'diffhgt',{},'dist',{});

load pt
load edge

%design matrix
nobs = length(edge);    %observations number
npar = sum([pt.flag]);  %parameters number
npt=length(pt);         %total points number
B=zeros(nobs,npt);
l=zeros(nobs,1);
P=zeros(nobs,1);
for i=1:nobs
  is=find(strcmp([pt.id],edge(i).sptid)==1);
  ie=find(strcmp([pt.id],edge(i).eptid)==1);
  B(i,is)=-pt(is).flag;
  B(i,ie)= pt(ie).flag;
  l(i)=edge(i).diffhgt-(pt(ie).hgt-pt(is).hgt);
end
%remove known points from design matrix
B(:,find([pt.flag]==0))=[];

%weight matrix
P=1./[edge.dist];

%least-squares
[x,stdx,mse] = lscov(B,l,P);
v=B*x-l;

a=find([pt.flag]==1);
for i=1:npar
  pt(a(i)).hgt=x(i);
end

%write output file
fid=fopen(ofile,'w');
if(fid==-1)
  error('Can not open output file!');
end

fprintf(fid,'sigma0: %5.4f \n',sqrt(mse));
fprintf(fid,'\n id  height(m) stdx(m)\n');
sigma=zeros(npt,1);
sigma(a)=stdx;
for i=1:npt
  fprintf(fid,'%s %8.4f %8.4f\n',char(pt(i).id),pt(i).hgt,sigma(i));
end

fprintf(fid,'\nstart end  dh(m)    v(m)   dh_hat(m)\n');
for i=1:nobs
  fprintf(fid,'%4s %4s %8.4f %8.4f %8.4f\n',char(edge(i).sptid),char(edge(i).eptid),edge(i).diffhgt,v(i),edge(i).diffhgt+v(i));
end
  
fclose(fid);
return