⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmodlred.m

📁 机器人控制仿真程序一书的所有源代码
💻 M
字号:
function qmodlred(flag)
% QMODLRED Set up model reduction interface. (Utility Function)
%          QMODLRED performs a model reduction on the present controller.

% Author: Craig Borghesani
% 10/8/93
% Changes: Yossi Chait (from log-log freq weight to lin-lin)
% 10/28/94
% Copyright (c) 1995-98 by The MathWorks, Inc.
%       $Revision: 1.5 $

if flag,
 f2=gcf;
 f=get(f2,'userdata');
else
 qclswin(0);
 f=gcf;
end
bthan=get(f,'userdata');
infmat=get(bthan(16),'userdata');
T=get(bthan(13),'userdata');
hint_bar = get(bthan(36),'userdata');
set(infmat(8,1),'enable','off');
proc_str=[];
if infmat(25,2)>1, proc_str=[' (',int2str(infmat(25,2)),')']; end
scrn=[640,480,640,480];

red = [1,0,0];
blue = [0,0,1];
cyan = [0,1,1];
dec = [];

fig_color=[0.5,0.5,0.5];
if flag==0 & (~length(T)),
 cont=get(bthan(3),'userdata');
 lomat=get(bthan(1),'userdata');
 set(bthan(27),'userdata',lomat);
 set(bthan(28),'userdata',cont);
 T=get(bthan(13),'userdata');
 [r,c]=size(cont);
 if r > 3+length(T),
  cntdisp(f,cont,2);
 else
  errordlg('No further reduction possible.','Message','on');
 end
elseif any(flag==[1,6]),
   set(bthan([1,8,29]),'enable','off');
   t=get(bthan(24),'userdata');
   cont=get(bthan(3),'userdata');
   T=get(bthan(13),'userdata');
   contmd=[]; go_for_it=1;
   for tv=1:length(t),
      vv_sty=get(t(tv),'style');
      vv_val=get(t(tv),'value');
      vv_vec(tv)=vv_val;
      if strcmp(vv_sty,'checkbox'),
         if vv_val,
            dec=[dec vv_val];
         end
      end
   end
   if length(dec) > 1,
      if any(cont(dec,4)==0.7),
         loc=find(vv_vec==2);
         val=str2num(get(t(loc+1),'string'));
         if length(val) & abs(val)<=abs(cont(2,1)),
            if cont(2,1)>0,
               contmd=[contmd;val,NaN,NaN,0.7];
               cont(2,1)=cont(2,1)-val;
            else
               contmd=[contmd;-val,NaN,NaN,0.7];
               cont(2,1)=cont(2,1)+val;
            end
         else
            errordlg('Improper input.  Check values','Message','on');
            go_for_it=0;
         end
         dec(find(dec==2))=[];
      end
      if any(cont(dec,4)==0.6),
         loc=find(vv_vec==3);
         val=str2num(get(t(loc+1),'string'));
         if length(val) & abs(val)<=abs(cont(3,1)),
            if cont(3,1)>0,
               contmd=[contmd;val,NaN,NaN,0.6];
               cont(3,1)=cont(3,1)-val;
            else
               contmd=[contmd;-val,NaN,NaN,0.6];
               cont(3,1)=cont(3,1)+val;
            end
         else
            errordlg('Improper input.  Check values','Message','on');
            go_for_it=0;
         end
         dec(find(dec==3))=[];
      end
      if any(cont(dec,4)==0.5),
         loc=find(vv_vec==2);
         val1=str2num(get(t(loc+1),'string'));
         val2=str2num(get(t(loc+3),'string'));
         if length([val1,val2])==2 & abs(val1)<=abs(cont(2,1)) ...
                             & abs(val2)<=abs(cont(2,2)),
            contmd=[contmd;val1,val2,NaN,0.6];
            cont(2,:)=cont(2,:)-[val1,val2];
         else
            errordlg('Improper input.  Check values','Message','on');
            go_for_it=0;
         end
         dec(find(dec==2))=[];
      end
      contmd=[contmd;cont(dec,:)];
      cont(dec,:)=[];
      contmd=[1,NaN,NaN,0;contmd];
      contmd=cntcvrt(contmd,T);
      dcgain=cntdcgn(contmd,T);
      contmd(1,1)=dcgain;
      [z,p,k]=cnt2zpk(contmd,T);
      [do_it,repeat] = chkzp(z,p,T);
      wfunc=[];
      if flag==6 & go_for_it & do_it,
         wfunc_han = get(bthan(26),'userdata');
         objects = get(wfunc_han(3),'userdata');
         obj_len = length(objects);
         if obj_len,
            ct = 1;
            y_scale = get(wfunc_han(11),'userdata');
            for k = 2:2:obj_len,
               if strcmp(get(objects(k),'vis'),'on'),
                  ydata = get(objects(k),'ydata');
                  ydata = ydata / max(ydata);
                  w = get(objects(k),'xdata');
                  a0 = ydata(1);
                  a1 = (ydata(2) - ydata(1))/(w(2)-w(1));
                  clr = get(objects(k),'userdata');
                  wtype = all(clr==blue)+all(clr==cyan)*2+all(clr==red)*3;
                  wfunc(ct,:) = [a0,a1,w(1),w(2),wtype];
                  ct = ct + 1;
               end
            end
            wfunc = [wfunc;0.001,0,0,inf,3];
         end
      end
      if go_for_it & do_it,
         if repeat,
            [sysb,hsv]=qfwbal(z,p,k,wfunc,'z');
         else
            [r,p,k]=qzp2rp(z,p,k);
            [sysb,hsv]=qfwbal(r,p,k,wfunc,'r');
         end
         if ~sysb,
            errordlg('Weight function needs more points','Message');
            return;
         end
         set(infmat(15,1),'vis','off');
         set(bthan(29),'userdata',sysb);
         set(bthan(30),'userdata',cont);
         set(hint_bar,'string','Plotting Hankel Singular Values');
         proc_num = int2str(infmat(25,2));
         win_tag = findobj('tag',['qft4',proc_num]);
         if ~length(win_tag),
            grey = [0.5,0.5,0.5];
            infmat(15,2) = colordef('new','none');
            set(infmat(15,2),'name',['Hankel Singular Values',proc_str],'numbertitle','off',...
                 'units','norm','pos',[20,20,360,250]./scrn,'vis','off','menubar','none',...
                 'userdata',f,'tag',['qft4',proc_num]);
            mod_scrn=[360,250,360,250];
            f2 = infmat(15,2);
            pos=get(gca,'pos');
            xticks = 0:length(hsv)+1;
            h(1)=gca;
            set(h(1),'pos',[pos+[0,0.1,0,-0.2]],'xtick',xticks,'yscale','log',...
            'ygrid','on','xgrid','on','box','on','nextplot','add',...
            'xlim',[0,length(hsv)+1],...
            'ylim',[10 .^[floor(log10(min(hsv))),ceil(log10(max(hsv)))]],...
            'color','k');
            h(2)=line('ydata',hsv,'xdata',[1:length(hsv)],'color','y','userdata',hsv);
            h(3)=line('ydata',hsv,'xdata',[1:length(hsv)],'color','r',...
                     'marker','x','userdata',[pos+[0,0.1,0,-0.2]],...
                     'linestyle','none');
            h(4)=uicontrol(f2,'style','text','units','norm','pos',[50,220,100,20]./mod_scrn,...
                   'string','Desired order:','back',grey);
            h(5)=uicontrol(f2,'style','edit','units','norm','pos',[150,220,50,20]./mod_scrn,...
                   'background',[1,1,1],'horiz','right');
            uicontrol(f2,'style','frame','units','norm','pos',[18,3,323,26]./mod_scrn,...
              'backgroundcolor',[0,0.5020,0]);
            h(6)=uicontrol(f2,'style','push','units','norm','pos',[21,6,60,20]./mod_scrn,...
                   'string','Apply','callback','qmodlred(2)');
            h(7)=uicontrol(f2,'style','push','units','norm','pos',[84,6,60,20]./mod_scrn,...
                   'string','Cancel','callback','qmodlred(5)');
            h(8)=uicontrol(f2,'style','push','units','norm','pos',[152,6,60,20]./mod_scrn,...
                   'string','Weight','callback','qwatecad(0)');
            h(9)=uicontrol(f2,'style','push','units','norm','pos',[215,6,60,20]./mod_scrn,...
                   'string','Select','callback','qmodlred(4)');
            h(10)=uicontrol(f2,'style','push','units','norm','pos',[278,6,60,20]./mod_scrn,...
                   'string','Done','callback','qmodlred(3)');
            set(bthan(25),'userdata',h);
            h2 = uimenu('label','Line','enable','off');
            h2_sub(1)=uimenu(h2,'label','Add Line',...
            'callback',...
            'set(gcf,''pointer'',''crosshair'',''windowbuttonupfcn'',''qaddobj(0)'',''windowbuttondownfcn'','''',''windowbuttonmotionfcn'','''')');

            h2_sub(2)=uimenu(h2,'label','Add Point',...
                     'callback',...
               'set(gcf,''pointer'',''crosshair'',''windowbuttonupfcn'',''qedtobj(0)'',''windowbuttondownfcn'','''',''windowbuttonmotionfcn'','''')');

            h2_sub(3)=uimenu(h2,'label','Move',...
               'callback',...
               'qbtnkill;set(gcf,''pointer'',''fleur'',''windowbuttondownfcn'',''set(gca,''''userdata'''',get(gca,''''currentpoint''''));set(gcf,''''windowbuttonmotionfcn'''',''''qmoveobj'''')'')');
            h2_sub(4)=uimenu(h2,'label','Delete','callback','qdelobj(0)');
            h2_sub(5)=uimenu(h2,'label','Break','callback','qdelobj(1)');
            h2_sub(6)=uimenu(h2,'label','Connect','callback','qdelobj(2)');
            h2_sub(7)=uimenu(h2,'label','Type');
            uimenu(h2_sub(7),'label','Input','callback','qdelobj(6)');
            uimenu(h2_sub(7),'label','Output','callback','qdelobj(7)');
            uimenu(h2_sub(7),'label','Both','callback','qdelobj(8)');
            h2_sub(8)=uimenu(h2,'label','Select');
            uimenu(h2_sub(8),'label','All','callback','qdelobj(5)');
            uimenu(h2_sub(8),'label','None','callback','qdelobj(4)');
            set(h2_sub(2:8),'enable','off');
            o=uimenu('label','Options','enable','off');
            o_sub(1)=uimenu(o,'label','Full','callback','qzoomaxs(3)');
            o_sub(2)=uimenu(o,'label','Zoom','callback','qzoomaxs(0)');
            o_sub(3)=uimenu(o,'label','Clear','callback','qdelobj(3)');
            o_sub(4)=uimenu(o,'label','Open...','callback','qputobj(0)',...
                      'separator','on');
            o_sub(5)=uimenu(o,'label','Save...','callback','qputobj(1)');
            han = [infmat(15,2),h(1),h2,h2_sub,o,o_sub];
            set(bthan(26),'userdata',han);
            set(infmat(15,2),'vis','on');
            set(bthan(16),'userdata',infmat);
         else
            set(f2,'pointer','arrow','windowbuttondownfcn','',...
           'windowbuttonupfcn','','windowbuttonmotionfcn','',...
           'name',['Hankel Singular Values',proc_str]);
            h = get(bthan(25),'userdata');
            h2 = get(bthan(26),'userdata');
            set(h2([3,12]),'enable','off');
            set(get(h2(3),'userdata'),'color',[0,0,0]);
            pos=get(h(3),'userdata');
            xticks = 0:length(hsv)+1;
            set(h(1),'pos',pos,'xtick',xticks,'xlim',[0,length(hsv)+1],...
             'ylim',[10 .^[floor(log10(min(hsv))),ceil(log10(max(hsv)))]],'yscale','log','xscale','linear');
            set(h(2),'ydata',hsv,'xdata',1:length(hsv));
            set(h(3),'ydata',hsv,'xdata',1:length(hsv),'vis','on');
            set(h(5),'string','');
            set(h([4,5,8,9,10]),'vis','on');
            set(h(6),'callback','qmodlred(2)');
            set(h(7),'callback','qmodlred(5)');
            figure(infmat(15,2));
         end
      end
   elseif length(dec)==1,
      errordlg('No further reduction possible.','Message','on');
   else
      errordlg('You must select something','Message','on');
   end

elseif flag==2, % Reduce
 T=get(bthan(13),'userdata');
 lomat=get(bthan(1),'userdata');
 cont=get(bthan(3),'userdata');
 delay=infmat(10,1);
 q=1; s=0;
 if infmat(9,1)==2, q=[1;1]; s=1; end
 loc=qcntbode(cont,lomat(1,:),T).*exp(-i*lomat(1,:)*delay);
 sysb=get(bthan(29),'userdata');
 [sr,sc] = size(sysb);
 cont=get(bthan(30),'userdata');
 mis_han = get(bthan(25),'userdata');
 val=str2num(get(mis_han(5),'string'));
 if val>0 & val<=(sc-2) & (~rem(val,1)),
  set(hint_bar,'string','Performing model order reduction');
  ar = sysb(1:val,1:val);
  br = sysb(1:val,sc-1);
  cr = sysb(sr-1,1:val);
  dr = sysb(sr-1,sc-1);
  [z,p]=ss2zp(ar,br,cr,dr);
  contmd=zp2cnt(z,p,cont,T);
  locmd=qcntbode(contmd,lomat(1,:),T).*exp(-i*lomat(1,:)*delay);
  lomat(2:2+s,:)=lomat(2:2+s,:).*(locmd(q,:)./loc(q,:));
  set(bthan(20),'userdata',lomat);
  set(bthan(19),'userdata',contmd);
  if infmat(9,1)==1, qnicplt(f);
  elseif infmat(9,1)==2, qmagplt(f);
  elseif infmat(9,1)==3, mgphplot(f);
  end
  cont=contmd;
  cntdisp(f,cont,5);
  figure(infmat(15,2));
 else
  errordlg('Improper input.  Check values.','Message','on');
 end
elseif flag==3, % Done
 contmd=get(bthan(19),'userdata');
 lomatnv=get(bthan(20),'userdata');
 if length(lomatnv),
  set(bthan(1),'userdata',lomatnv);
  set(bthan(3),'userdata',contmd);
  set(bthan([19:20,30]),'userdata',[]);
  v=get(bthan(10),'userdata');
  v2=get(bthan(21),'userdata');
  if infmat(9,1)==1,
   vo2=get(bthan(22),'userdata');
   vo=get(bthan(17),'userdata');
   set([v,vo],'vis','off');
   set(bthan(22),'userdata',vo);
   set(bthan(17),'userdata',vo2);
  else
   set(v,'vis','off');
  end
  set(v2,'linestyle','-');
  set(v,'linestyle','--');
  set(bthan(10),'userdata',v2);
  set(bthan(21),'userdata',v);
  set(infmat(8,1),'enable','on');
 end
 han2 = get(bthan(26),'userdata');
 w_func = get(han2(3),'userdata');
 delete(w_func);
 set(han2(3),'userdata',[]);
 set(bthan([1,8,29]),'enable','on');
 qclswin(1);
elseif flag==4, % Select
 set(bthan([1,8,29]),'enable','on');
 cont=get(bthan(3),'userdata');
 set(infmat(15,2),'vis','off');
 v2=get(bthan(21),'userdata');
 vo2=get(bthan(22),'userdata');
 set([v2,vo2],'vis','off');
 set(bthan([19:20,30]),'userdata',[]);
 cntdisp(f,cont,9);
elseif flag==5, % Cancel
 set(bthan([1,8,29]),'enable','on');
 v2=get(bthan(21),'userdata');
 vo2=get(bthan(22),'userdata');
 if infmat(9,1)==1,
  set([v2(:);vo2(:)],'vis','off');
 else
  set(v2,'vis','off');
 end
 set(bthan([19:20,30]),'userdata',[]);
 han2 = get(bthan(26),'userdata');
 w_func = get(han2(3),'userdata');
 delete(w_func);
 set(han2(3),'userdata',[]);
 qclswin(1);
elseif flag == 7, % Cancel from controller display window
 set(bthan([1,8,29]),'enable','on');
 set(f2,'vis','off');
else
 errordlg('Currently not avaliable for Discrete','Message','on');
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -