www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@localpoly/finalcheck.m
function [B,Wc,OK]= finalcheck(poly,B,DATA,Wc,OK); % POLYNOM/FINALCHECK % Copyright 2000-2004 The MathWorks, Inc. and Ford Global Technologies, Inc. % post-optimisation processing % this is necessary to ensure that a maximum (or min) exists. Ns= size(DATA,3); dType= DatumType(poly); if isempty(Wc) Wc= cell(1,Ns); end np= size(B,1); for i=1:Ns if OK(i) d= DATA{i}; Xs= d(:,1:end-1); Ys= d(:,end); poly= setstatus(poly,1:np-2,3); % make sure datum is at zero poly= update(poly,B(:,i),0); Change= 0; tp=0; switch dType case 1 % max tp datum DatumHat=NaN; [dum,tp]= max(poly); DatumOk= ~(isempty(tp) | ~isreal(tp) | length(tp)>1); % no maximum | complex maxima | more than one maxima redorder=0; while ~DatumOk & order(poly)>2 % reduce order % poly= update(poly,ones(order(poly),1),0); redorder= redorder+1; poly= setstatus(poly,redorder,2); [poly,ok]= leastsq(poly,Xs,Ys,Wc{i}); [dum,tp]= max(poly); DatumOk= ~(isempty(tp) | ~isreal(tp) | length(tp)>1); Change= 1; end if ~DatumOk; OK(i)= false; end case 2 % min tp [dum,tp]= min(poly); DatumOk= ~(isempty(tp) | ~isreal(tp) | length(tp)>1); % no maximum | complex maxima | more than one maxima redorder=0; while ~DatumOk & order(poly)>2 % reduce order redorder= redorder+1; poly= setstatus(poly,redorder,2); [poly,ok]= leastsq(poly,Xs,Ys,Wc{i}); [dum,tp]= min(poly); DatumOk= ~(isempty(tp) | ~isreal(tp) | length(tp)>1); Change= 1; end if ~DatumOk; OK(i)= false; end end end if Change p= double(poly); % p= [zeros(size(B,1)-length(p),1); p]; B(:,i)= p; if ~isempty(Wc{i}) poly= update(poly,p); yhat= EvalModel(poly,Xs); Wc{i}= choltinv(covmodel(poly),yhat,Xs); end end end