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

    function DS = OpPointDataset(m)
%OPPOINTDATASET  make operating point dataset
%
% MS = OpPointDataset(m)
% find modes for each operating point

%   Copyright 2009 The MathWorks, Inc. and Ford Global Technologies, Inc.


nOpVars = size(m.OpPoints,2)-1;
ModeName = m.symbols{end};
n = max(m.OpPoints(:,end));

% initial conditions for optimizations
[LB,UB] = modelranges(m);
[nf,opnames,opunits] = nfactors(m);

if isMultiModal(m)
    
    DefaultIC = mean(m.ranges);
    
    OpPoints = unique(m.OpPoints(:,1:nOpVars),'rows','first');
    
    
    if size(OpPoints,1)==size(m.OpPoints,1)
        OpPoints = m.OpPoints(:,1:nOpVars);
    end
    nOpPoints = size(OpPoints,1);

    IC = zeros(size(LB,1),nOpPoints);
    % multiple modes
    Mask = getInputMask(m);
    OpPoints = [OpPoints zeros(nOpPoints,n+1)];
    for i=1:nOpPoints
        % show which modes operate for each operating point
        ind = all( abs( bsxfun(@minus, m.OpPoints(:,1:nOpVars),OpPoints(i,1:nOpVars))) < 1e-8,2);
        OpPoints(i,1+nOpVars+m.OpPoints(ind,end)) = 1;
        % find smallest range for operating point
        Mi =  Mask(ind,:);
        ind=find(ind);
        for j=1:size(LB,1)
            if any(Mi(:,j))
                ActiveInd = ind(Mi(:,j));
                IC(j,i)= mean((LB(j,ActiveInd)+UB(j,ActiveInd))/2,2);
            else
                IC(j,i) = DefaultIC(j);
            end
        end
    end
    opnames = [opnames(:)'  cell(1,n)];
    opunits = [opunits(:)'  repmat({''},1,n)];
    for i=1:n
        opnames{nf+i} = sprintf('%s_%d',ModeName,i);
    end
    % find first valid mode for each operating point
    for i=1:size(OpPoints,1)
        f = find(OpPoints(i,nOpVars+2:end),1,'first');
        if ~isempty(f)
            OpPoints(i,nOpVars+1) = f;
        end
    end
else
    IC = (LB+UB)/2;
    OpPoints = m.OpPoints;
end

% IC = (LBunique+UBunique)'/2;
DS.data = [IC' OpPoints];

DS.names = opnames(:)';
DS.units = opunits(:)';