www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@conswitch/constraintDistance.m
function y = constraintDistance(con,X) %CONSTRAINTDISTANCE Evaluate constraint distance % % constraintDistance(M, X) evaluates con at the input poits X. % Copyright 2007-2014 The MathWorks, Inc. [~,ng] = size(con.OpPoints); doActiveFactors = ~isempty(con.ActiveFactors); % divide into local and operating points Xlocal = X(:,1:end-ng); Neval = size(X,1); OpPointIndices = findOpPoints(con,X); uniqueOpPoints = unique(OpPointIndices); if isscalar(uniqueOpPoints) && uniqueOpPoints~=0 if doActiveFactors xi = Xlocal(:,con.ActiveFactors{uniqueOpPoints}); else xi = Xlocal; end y = constraintDistance(con.ConList{uniqueOpPoints},xi); else % default value for output y = repmat(10,Neval,1); conModels = con.ConList; % remove zero index oppoints uniqueOpPoints(uniqueOpPoints==0)=[]; for i = 1:length(uniqueOpPoints); % find current operating point thisOpPoint = uniqueOpPoints(i); CurrentOp= thisOpPoint==OpPointIndices; if any(CurrentOp) if doActiveFactors xi = Xlocal(CurrentOp,con.ActiveFactors{thisOpPoint}); else xi = Xlocal(CurrentOp,:); end % select model and evaluate y(CurrentOp) = constraintDistance(conModels{thisOpPoint},xi); end end end function Index = findOpPoints(con,X) %FINDOPPOINTS find operating points for a point-by-point model % Index = findOpPoints(m,X) % Copyright 2009 The MathWorks, Inc. and Ford Global Technologies, Inc. OpPoints= con.OpPoints; [N,ng]= size(OpPoints); % tolerance for comparison tol = getAbsoluteTolerance(con); if ng<size(X,2) Xop = X(:,end-ng+1:end); else Xop = X; end Neval = size(X,1); % index for operating points Index = zeros(1,Neval); Done = false(1,Neval); for i = 1:N % find current operating point CurrentOp= true(1,Neval); for j=1:ng CurrentOp(CurrentOp)= abs( Xop(CurrentOp,j)-OpPoints(i,j)) < tol(j); end if any(CurrentOp) % select model Index(CurrentOp) = i; Done = Done | CurrentOp; if all(Done) break end end end