www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@localpspline/finalcheck.m

    function [B,Wc,OK]= finalcheck(ps,B,DATA,Wc,OK)
%FINALCHECK
%
%  [B,Wc,OK] = FINALCHECK(ps,B,DATA,Wc,OK)

%  Copyright 2000-2005 The MathWorks, Inc. and Ford Global Technologies, Inc.


% post-optimisation processing
% this is necessary to ensure that a maximum (or min) exists.

% DATA must be adjusted for datum before this routine
ps= datum(ps,0);
Ns= size(DATA,3);

% need to go back to quatratic if min/max is not defined
p0= localpoly([1 1 1]);

dType= DatumType(ps);
for i=1:Ns
   if OK(i)
      ps= update(ps,B(:,i));
      d= DATA{i};
      Xs= d(:,1:end-1);
      Ys= d(:,end);
      yhat= eval(ps,Xs-datum(ps));
      Wc{i}= choltinv(covmodel(ps),yhat,Xs);
      
      Change= 0;
      switch dType
      case 1
         % Maximum Datum (reset knot to 0)
         % check it is a maximum
         [maxPS,tp]= max(ps);
         if isempty(tp) ; 
            % Make localpspline symmetric
            
            % fit quadratic polynom 
            % *** want to call polynom/leastsq not localmod/leastsq
            [p,OKp]= leastsq(p0,Xs,Ys,Wc{i});
            
            [maxPS,tp]= max(p);
            % there has to be a maximum here as this was an initial check
            % can changing weights change this?
            
            % convert polynom to localpspline
				if ~isempty(tp)
					c= double(p);
					psparams= [tp,maxPS,c(1) zeros(1,ps.order(1)-2) ...
							c(1) zeros(1,ps.order(2)-2)]';
				else
					psparams= NaN;
					OK(i)= false;
				end
				Change= 1;
            
            
         end
         
         
      case 2
         % Minimum Datum (reset knot to 0)
         % check it is a minimum
         [minPS,tp]= min(ps);
         if isempty(tp); 
            
            % fit quadratic polynom 
            [p,OKp]= leastsq(p0,Xs,Ys,Wc{i});
            [minPS,tp]= min(p);
				c=double(p);
				if ~isempty(tp)
					psparams= [tp,minPS,c(1) zeros(1,ps.order(1)-2) ...
						c(1) zeros(1,ps.order(2)-2)]';
				else
					psparams= NaN;
					OK(i)= false;
				end
            
            Change= 1;
            
         end
         
      end  % switch
      
      if Change 
         % need to update B,J,YHAT,res etc
         B(:,i)= psparams;
         if ~isempty(Wc{i}) && OK(i)
            ps= update(ps,psparams);
            yhat= EvalModel(ps,Xs);
            Wc{i}= choltinv(covmodel(ps),yhat,Xs);
         end
      end
   end
end  % for i