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