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(:)';