Global Index (short | long) | Local contents | Local Index (short | long)
goto_ws=iduiio(arg,arg2,arg3,onoff)
IDUIIO Handles estimation of parametric models in input-output form. Arguments: open Creates the model structure editor for this case orders Adjusts the information after that a change in the order popups has been made ordedit Adjusts the popups after a change in the chosen model structure has been made mname Puts a default model name in the corresponding box estimate Effectuates the actual estimation close Closes the dialog box
This function calls | This function is called by |
---|---|
function goto_ws=iduiio(arg,arg2,arg3,onoff) % L. Ljung 4-4-94 % Copyright (c) 1986-98 by The MathWorks, Inc. % $Revision: 3.8 $ $Date: 1997/12/03 23:16:12 $ set(0,'Showhiddenhandles','on'); global XIDio XIDhw XIDparest XIDmse XIDiter XIDlayout XIDss XIDsumb usd=get(XIDhw(3,1),'userdata'); nu=usd(1);ny=usd(2);nustr=usd(3:2+nu);nystr=usd(3+nu:ny+nu+2); if nargin<2,update=1;else update=0;end if strcmp(arg,'open') iduistat('Adjusting the Orders Editor ...') if nargin<4, ll1=iduiwok(20);onoff='off'; if ishandle(ll1),onoff=get(ll1,'vis');end end FigName=idlaytab('figname',21); [fl,fi]=figflag(FigName,1);oldpos=[50 200]; if fl nn=get(fi,'userdata');oldpos=get(fi,'pos'); if any(nn(1:2)~=[nu ny]) close(fi) elseif ~all(nn==usd) close(fi) end end if ~figflag(FigName,0) iduistat('Opening the Orders Editor ...') layout butw=0.75*mStdButtonWidth; PW = iduilay2(3*0.75+1.1);%4*butw+2*bb+5*ftb; pos = iduilay1(PW,2); if ny>1|nu>4,nmu=min(1,nu);else nmu=nu;end Lay2Pos = iduilay1(PW,2,nmu+4); figpos = [oldpos(1:2) PW pos(1,2)+pos(1,4)+Lay2Pos(1,2)+Lay2Pos(1,4)]; f = figure('tag','sitb21','NumberTitle','off','Name',FigName,... 'HandleVisibility','callback','vis','off',... 'Color',get(0,'DefaultUIControlBackgroundColor'),... 'Menubar','none','Integerhandle','off',... 'Position',figpos,... 'userdata',usd); XIDmse(2) = f; s1='iduipoin(1);';s2='iduipoin(1);iduistat(''Compiling ...'');'; s3='iduipoin(3);'; % ****************** % LEVEL 1 uicontrol(f,'pos',pos(1,:),'style','frame'); uicontrol(f,'pos',pos(2,:),'string','Close',... 'style','push',... 'callback','iduiio(''close'')'); uicontrol(f,'pos',pos(3,:),'string','Help','style','push',... 'callback',... 'iduihelp(''iduiarx.hlp'',''Help: The ARX structure'');'); % **************** % LEVEL 2 lev2 = pos(1,2)+pos(1,4); pos=iduilay1(PW,4*(nmu+3),nmu+3,lev2,[],[1.1 0.75 0.75 0.75]); % uicontrol(f,'pos',pos(1,:),'style','frame'); uicontrol(f,'Style','frame','Position', ... [pos(1,1:2) figpos(3)-2*mEdgeToFrame figpos(4)-pos(1,2)-mEdgeToFrame]) kbas=4*(nmu+1)+4; XIDss(1,6)=uicontrol(f,'pos',pos(kbas+3,:)+[0 0 2*butw 0],... 'vis','off','style','popup','string',... 'K=0 (Output Error)| Estimate K','userdata',[],'value',2); XIDio(1,6)=uicontrol(f,'pos',pos(kbas+3,:)); %nd XIDio(1,5)=uicontrol(f,'pos',pos(kbas+4,:)); %nc uicontrol(f,'pos',[pos(kbas+2,:)],... 'style','text','string','Noise input',... 'Horizontalalignment','left'); %***************** %LEVEL 3: ALL THE INPUTS kbas=4; XIDss(1,7)=uicontrol(f,'pos',pos(3+kbas,:)+[0 0 2*butw 0],... 'style','pop','vis','off','string',... ' X0 = 0|Estimate X0'); XIDss(2,7)=uicontrol(f,'pos',pos(2+kbas,:),... 'style','text','vis','off','string',... 'Initial state','Horizontalalignment','left'); if nu>0 XIDss(1,8)=uicontrol(f,'pos',pos(7+kbas,:)+[0 0 2*butw 0],... 'style','pop','vis','off','string',... ' D = 0|Estimate D'); XIDss(2,8)=uicontrol(f,'pos',pos(6+kbas,:),... 'style','text','vis','off','string',... 'Delay from u','Horizontalalignment','left'); for kk=1:nmu XIDio(kk,2)=uicontrol(f,'pos',pos(kbas+3+4*kk,:)); %nf XIDio(kk,1)=uicontrol(f,'pos',pos(kbas+4+4*kk,:)); %nb XIDio(kk,3)=uicontrol(f,'pos',pos(kbas+5+4*kk,:)); %nk if nu>4|ny>1 str='All Inputs'; else if kk==nustr(kk) str=['Input # ',int2str(kk)]; else str=['Input # ',int2str(kk),'(',int2str(nustr(kk)),')']; end end XIDio(kk,7)=uicontrol(f,'pos',pos(kbas+2+4*kk,:),'style',... 'text','string',str,'Horizontalalignment','left'); end %for kk= XIDio(nmu+1,1)=uicontrol(f,'pos',pos(kbas+3,:),'style','text',... 'string','Poles','Horizontalalignment','left'); XIDio(nmu+1,2)=uicontrol(f,'pos',pos(kbas+4,:),'style','text',... 'string','Zeros+1','Horizontalalignment','left'); XIDio(nmu+1,3)=uicontrol(f,'pos',pos(kbas+5,:),'style','text',... 'string','Delay','Horizontalalignment','left'); % if nu>4|ny>1,str='';else str='Inputs';end str = ''; XIDio(nmu+1,7)=uicontrol(f,'pos',pos(kbas+2,:),'style','text',... 'string',str,'Horizontalalignment','left'); end % if nu>0 % ******************* % LEVEL 4 XIDparest(12)=uicontrol(f,'pos',pos(2,:),... 'style','text','string','Common poles:',... 'Horizontalalignment','left'); % XIDio(1,4)=uicontrol(f,'pos',pos(3,:)+[0 0 2*butw 0]); %na XIDio(1,4)=uicontrol(f,'pos',pos(3,:)); %na % LEVEL 5 lev5 = pos(1,2)+pos(1,4); % Make the text uicontrol which holds the equation XIDparest(15)=uicontrol(f,'pos',[pos(2,1) lev5 PW-2*pos(2,1) pos(2,4)],... 'style','text','userdata',0); s4=[s1,'idparest(''orders'');',s3]; s5=[s1,'iduiio(''orders'');',s3]; set(XIDio([1:nmu],[1,3]),'style','popup',... 'callback',s4,'value',2); set(XIDio([1:nmu],[2]),'style','popup','string',... 'nf=0|nf=1|nf=2|nf=3|nf=4|nf=5|nf=6|nf=7|nf=8|nf=9|nf>9',... 'callback',s5); set(XIDio(1,4),'style','popup','callback',s4); set(XIDio(1,5),'style','popup','string',... 'nc=0|nc=1|nc=2|nc=3|nc=4|nc=5|nc=6|nc=7|nc=8|nc=9|nc>9',... 'callback',s5); set(XIDio(1,6),'style','popup','string',... 'nd=0|nd=1|nd=2|nd=3|nd=4|nd=5|nd=6|nd=7|nd=8|nd=9|nd>9',... 'callback',s5); set(get(f,'children'),'units','normal') if length(XIDlayout)>20,if XIDlayout(21,3) eval('set(f,''pos'',XIDlayout(21,1:4))','') end,end end Mtype=get(XIDparest(4),'value'); iduims('setpop',Mtype,nu,ny); set(XIDparest(15),'string',get(XIDparest(10),'string')); idparest('ordedit'); set(XIDmse(2),'vis',onoff) iduistat('') elseif strcmp(arg,'orders') if nu>4,nmu=min(1,nu);else nmu=nu;end na=get(XIDio(1,4),'value')-1; if na==10,na=get(XIDio(1,4),'UserData');if isempty(na),na=10;end,end nc=get(XIDio(1,5),'value')-1; if nc==10,nc=get(XIDio(1,5),'UserData');if isempty(nc),nc=10;end,end nd=get(XIDio(1,6),'value')-1; if nd==10,nd=get(XIDio(1,6),'UserData');if isempty(nd),nd=10;end,end for ku=1:nmu nb=get(XIDio(ku,1),'value')-1; if nb==10,nb=get(XIDio(ku,1),'UserData');if isempty(nb),nb=10;end,end nk=get(XIDio(ku,3),'value')-1; if nk==10,nk=get(XIDio(ku,3),'UserData');if isempty(nk),nk=10;end,end nf=get(XIDio(ku,2),'value')-1; if nf==10,nf=get(XIDio(ku,2),'UserData');if isempty(nf),nf=10;end,end nbv(ku)=nb;nkv(ku)=nk;nfv(ku)=nf; end if nu>4,nbv=nb*ones(1,nu);nkv=nk*ones(1,nu);nfv=nf*ones(1,nu);end if nu>1 nbstr='[';nfstr='[';nkstr='['; for ku=1:nu nbstr=[nbstr,int2str(nbv(ku))];if ku~=nmu,nbstr=[nbstr,' '];end nfstr=[nfstr,int2str(nfv(ku))];if ku~=nmu,nfstr=[nfstr,' '];end nkstr=[nkstr,int2str(nkv(ku))];if ku~=nmu,nkstr=[nkstr,' '];end end nbstr=[nbstr,']']; nkstr=[nkstr,']']; nfstr=[nfstr,']']; elseif nu==1 nbstr=int2str(nbv(1));nkstr=int2str(nkv(1));nfstr=int2str(nfv(1)); else nbstr=[];nkstr=[];nfstr=[]; end Mtype=get(XIDparest(4),'value'); str=' '; if any(Mtype==[1 2]) str=[str,int2str(na),' ']; end if any(Mtype==[1 2 3 4])&nu>0 str=[str,nbstr,' ']; end if any(Mtype==[2 4]) str=[str,int2str(nc),' ']; end if any(Mtype==[4]) str=[str,int2str(nd),' ']; end if any(Mtype==[3 4]) str=[str,nfstr,' ']; end if any(Mtype==[1 2 3 4])&nu>0 str=[str,nkstr]; end set(XIDparest(3),'string',str) iduiio('mname'); elseif strcmp(arg,'ordedit') stopp=0; Mtype=get(XIDparest(4),'value'); if Mtype==5, set(0,'Showhiddenhandles','off'); return end % LL% sl1=get(XIDparest(3),'string'); if any(sl1==':')&any(Mtype==[2 3 4]) errordlg('Multiple model estimation is not supported for this model structure.'); set(0,'Showhiddenhandles','off'); return end eval('nn=eval([''['',sl1,'']'']);','stopp=1;'); if stopp,iduiio('mname'); set(0,'Showhiddenhandles','off'); return end corleng=[2*nu+1 2*nu+2 3*nu 3*nu+2 0 length(nn)]; if length(nn)~=corleng(Mtype), errordlg('Incorrect number of orders specified.'); set(0,'Showhiddenhandles','off'); return end na=[];nb=[];nc=[];nd=[];nf=[];nk=[]; if Mtype==1,na=nn(1);nb=nn(2:nu+1);nk=nn(nu+2:2*nu+1); elseif Mtype==2, na=nn(1);nb=nn(2:nu+1);nc=nn(nu+2);nk=nn(nu+3:2*nu+2); elseif Mtype==3, nb=nn(1:nu);nf=nn(nu+1:2*nu);nk=nn(2*nu+1:3*nu); elseif Mtype==4, nb=nn(1:nu);nc=nn(nu+1);nd=nn(nu+2);... nf=nn(nu+3:2*nu+2);nk=nn(2*nu+3:3*nu+2); end if ~isempty(na),set(XIDio(1,4),'value',min(na+1,11),'UserData',na);end if ~isempty(nc),set(XIDio(1,5),'value',min(nc+1,11),'UserData',nc);end if ~isempty(nd),set(XIDio(1,6),'value',min(nd+1,11),'UserData',nd);end for ku=1:nu set(XIDio(ku,3),'value',min(nk(ku)+1,11),'UserData',nk(ku)); set(XIDio(ku,1),'value',min(nb(ku)+1,11),'UserData',nb(ku)); if ~isempty(nf), set(XIDio(ku,2),'value',min(nf(ku)+1,11),'UserData',nf(ku)); end end elseif strcmp(arg,'mname') goto_ws=0;na=[];nb=[];nc=[];nd=[];nf=[];nk=[]; modnam=deblank(get(XIDparest(3),'string')); Mtype=get(XIDparest(4),'value'); if any(modnam==':')&any(Mtype==[2 3 4]) errordlg('Multiple model estimation is not supported for this model structure.'); goto_ws=1; set(0,'Showhiddenhandles','off'); return end modnam=deblank(get(XIDparest(3),'string')); eval('nn=eval([''['',modnam,'']'']);',... 'goto_ws=1;'); if goto_ws==1 mname=modnam; else Mtype=get(XIDparest(4),'value'); if Mtype==1, if nu==0 ordstr=['na=nn(1);']; else ordstr=['na=nn(1);nb=nn(2);nk=nn(nu+2);'];end elseif Mtype==2 if nu==0 ordstr=['na=nn(1);nc=nn(2);']; else ordstr=['na=nn(1);nb=nn(2);nc=nn(nu+2);nk=nn(nu+3);'];end elseif Mtype==3 ordstr=['nb=nn(1);nf=nn(nu+1);nk=nn(2*nu+1);']; elseif Mtype==4 ordstr=['nb=nn(1);nc=nn(nu+1);nd=nn(nu+2);nf=nn(nu+3);nk=nn(2*nu+3);']; end eval(ordstr,'errordlg(''Incorrect number of orders specified.'');'); nastr=int2str(na);ncstr=int2str(nc);ndstr=int2str(nd); nkstr=int2str(nk);nfstr=int2str(nf);nbstr=int2str(nb); if Mtype==2 mname=['amx',nastr,nbstr,ncstr,nkstr]; elseif Mtype==3 mname=['oe',nbstr,nfstr,nkstr]; elseif Mtype==4 mname=['bj',nbstr,ncstr,ndstr,nfstr,nkstr]; elseif Mtype==1 mname=['arx',nastr,nbstr,nkstr]; end end set(XIDparest(7),'string',mname); elseif strcmp(arg,'estimate') % Covers I/O and 'By name' iduistat('Estimating model by iterative search ...') goto_ws=0; cmdstr=['if strcmp(get(XIDparest(2),''interruptible''),''On''),',... 'set(XIDiter(1),''pointer'',''arrow'');',... 'end,set(XIDiter(7),''userdata'',0);']; eval(cmdstr,'') %Resetting the Stop-button Mtype=get(XIDparest(4),'value'); if nargin>1,Mtype=6;end usepem=0; usd=get(XIDparest(2),'UserData'); slim=deblank(usd(1,:));lim=eval(slim); stol=deblank(usd(2,:));tol=eval(stol); smaxiter=deblank(usd(3,:));maxiter=eval(smaxiter); sindex=deblank(usd(4,:));index=eval(['[',sindex,']']); if ~isempty(index),usepem=1;end if nargin==1 modnam=deblank(get(XIDparest(3),'string')); if isempty(modnam) errordlg('You must supply model orders or a name in the Orders: edit box.'); set(0,'Showhiddenhandles','off'); return end eval('nn=eval([''['',modnam,'']'']);',... 'goto_ws=1;'); % Here we must distinguish the case when orders have been % given in the ws if goto_ws % sumb=findobj(get(0,'children'),'flat','tag','sitb30'); modtag=get(XIDparest(3),'userdata'); if isempty(modtag) modeln=findobj([XIDsumb(1);sumb(:)],... 'type','text','string',modnam); if ~isempty(modeln), modax=get(modeln(1),'parent'); else modax=[]; end else modax=findobj([XIDsumb(1);sumb(:)],... 'type','axes','tag',modtag); end if ~isempty(modax) modax=modax(1); modlin=findobj(modax,'tag','modelline'); if ~isempty(modlin) eval('nn=iduicalc(''unpack'',get(modlin,''UserData''),1);') goto_ws=0; end end % ~isempty(modeln) end % if goto_ws if goto_ws, set(0,'Showhiddenhandles','off'); return end else nn=arg2; end if any(Mtype==[2,3,4]) if any(nn<0) errordlg('No order or delay can be negative.'); set(0,'Showhiddenhandles','off'); return end na=[];nb=[];nc=[];nd=[];nf=[];nk=[]; if Mtype==2 ordstr=['na=nn(1);nb=nn(2:nu+1);nc=nn(nu+2);nk=nn(nu+3:2*nu+2);']; elseif Mtype==3 ordstr=['nb=nn(1:nu);nf=nn(nu+1:2*nu);nk=nn(2*nu+1:3*nu);']; elseif Mtype==4 ordstr=['nb=nn(1:nu);nc=nn(nu+1);nd=nn(nu+2);nf=nn(nu+3:2*nu+2);',... 'nk=nn(2*nu+3:3*nu+2);']; end stopp=0; eval(ordstr,'stopp=1;') if stopp, errordlg('Incorrect number of orders specified.'); set(0,'Showhiddenhandles','off'); return end if ~isempty(na),nastr=int2str(na);end if ~isempty(nc),ncstr=int2str(nc);end if ~isempty(nd),ndstr=int2str(nd);end for sku=1:nu if sku==1, if ~isempty(nb),nbstr=int2str(nb(sku));end if ~isempty(nk),nkstr=int2str(nk(sku));end if ~isempty(nf),nfstr=int2str(nf(sku));end else if ~isempty(nb) nbstr=[nbstr,' ',int2str(nb(sku))];end if ~isempty(nk) nkstr=[nkstr,' ',int2str(nk(sku))];end if ~isempty(nf) nfstr=[nfstr,' ',int2str(nf(sku))];end end end if nu>1, nbstr=[' nb = [',nbstr,']'];nkstr=[' nk = [',nkstr,']']; if ~isempty(nf),nfstr=[' nf = [',nfstr,']'];end if ~isempty(na),nastr=[' na = ',nastr];end if ~isempty(nc), ncstr=[' nc = ',ncstr];end if ~isempty(nd),ndstr=[' nd = ',ndstr];end end end %if any(Mtype ... corleng=[2*nu+1 2*nu+2 3*nu 3*nu+2 0 length(nn)]; if length(nn)~=corleng(Mtype), errordlg('Incorrect number of orders specified.'); set(0,'Showhiddenhandles','off'); return end model=get(XIDparest(7),'string'); [eDat,eDat_info,eDat_n]=iduigetd('e'); TSamp=eval(eDat_info(1,:)); if Mtype==2&~usepem %ARMAX if nu==0 ordstr=[int2str(na),int2str(nc)];ordstr2=ordstr; else ordstr=[int2str(na(1)),int2str(nb(1)),int2str(nc),... int2str(nk(1))]; ordstr2=[int2str(na),' ',int2str(nb(1)),' ',int2str(nc),... ' ',int2str(nk(1))]; end eval('LASTM=armax(eDat,[na nb nc nk],maxiter,tol,lim,[],TSamp);') if nu<2 mod_info=str2mat(eDat_info,[' ',model,' = armax(',eDat_n,',[',... ordstr2,'],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); else mod_info=str2mat(eDat_info,nastr,nbstr,ncstr,nkstr,... [' ',model,' = armax(',eDat_n,',[na nb nc nk],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); end elseif Mtype==3&~usepem %OE if sum(nb)==0 errordlg(['The OE model does not make sense',... ' if all NB-orders are zero.']); set(0,'Showhiddenhandles','off'); return end eval('LASTM=oe(eDat,[nb nf nk],maxiter,tol,lim,[],TSamp);') if nu<2, mod_info=str2mat(eDat_info,[' ',model,' = oe(',eDat_n,',[',... int2str(nb),' ',int2str(nf),' ',int2str(nk),'],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); else mod_info=str2mat(eDat_info,nbstr,nfstr,nkstr,... [' ',model,' = oe(',eDat_n,',[nb nf nk],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); end elseif Mtype==4&~usepem %BJ eval('LASTM=bj(eDat,[nb nc nd nf nk],maxiter,tol,lim,[],TSamp);') if nu<2, mod_info=str2mat(eDat_info,[' ',model,' = bj(',eDat_n,',[',... int2str(nb),' ',int2str(nc),' ',int2str(nd),... ' ',int2str(nf),' ',int2str(nk),'],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); else mod_info=str2mat(eDat_info,nbstr,ncstr,ndstr,nfstr,nkstr,... [' ',model,' = bj(',eDat_n,',[nb nc nd nf nk],',... smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); end elseif usepem % PEM if isempty(na),na=0;end if isempty(nc),nc=0;end if isempty(nd),nd=0;end if isempty(nf),nf=zeros(1,nu);end nn=[na nb nc nd nf nk]; eval('LASTM=pem(eDat,nn,index,maxiter,tol,lim,[],TSamp);') if nu<2 mod_info=str2mat(eDat_info,[' ',model,' = pem(',eDat_n,... ',[',int2str(nn(1)),... int2str(nn(2)),' ',int2str(nn(3)),' ',int2str(nn(4)),' ',... int2str(nn(5)),' ',int2str(nn(6)),'],',... sindex,',',smaxiter,',',stol,',',slim,',[]',... num2str(TSamp),')']); else mod_info=str2mat(eDat_info,nastr,nbstr,ncstr,ndstr,nfstr,... nkstr,[' ',model,' = pem(',eDat_n,... ',[na nb nc nd nf nk],',... sindex,',',smaxiter,',',stol,',',slim,',[]',... num2str(TSamp),')']); end if nargin==3,model=arg3;end elseif Mtype==6 % Model by name oldmod=nn;[nro,nco]=size(oldmod); if nro<3 | nco<7 errordlg(str2mat(['The entry in the Orders: edit field is ', ... 'not a model of ''theta''-format.'],'',['You may also have' ... ' chosen an unfortunate name, coinciding with an ',... 'internal variable name. If so, change the model',... ' name by double-clicking on its icon, and edit',... ' accordingly.'])); set(0,'Showhiddenhandles','off'); return end if oldmod(2,7)==50,oldmod=ss2th(oldmod);end %OPTIONER P PSOBS eval('LASTM=pem(eDat,oldmod,index,maxiter,tol,lim,[],TSamp);') model_old=deblank(get(XIDparest(3),'string')); if nargin>2 mod_info=arg3;firstrow=2; else mod_info=eDat_info;firstrow=1; end [rmi,cmi]=size(mod_info); mod_info=str2mat(mod_info(firstrow:rmi,:),... [model,' = pem(',eDat_n,',',model_old,',',... sindex,',',smaxiter,',',stol,',',slim,',[],',num2str(TSamp),')']); end % if Mtype mod_nam=model; mod_nam=mod_nam(find(mod_nam~=' ')); eval('iduiinsm(LASTM,str2mat('''',mod_info),mod_nam);') elseif strcmp(arg,'close') set(XIDmse(2),'Visible','off') set(XIDparest(15),'userdata',0); end set(0,'Showhiddenhandles','off');