www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@des_respsurf/optimisedialog.m
function [d,ok] = optimisedialog(d) %OPTIMISEDIALOG Optimise design and show a blocking dialog % % [D,OK]=OPTIMISEDIALOG(D) start an optimisation on D and puts up a dialog % to show progress and give the user a chance to cancel and finish early. % Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc. [d,ok]=i_createfig(d); function [dout,ok]= i_createfig(d) fig = xregfigure('Resize','off',... 'Name','Optimizing Design',... 'Renderer','painters', ... 'Visible', 'off', ... 'WindowStyle', 'modal'); xregcenterfigure(fig, [350 280]); PR=xregGui.PointerRepository; PR.SetPointer(fig,'backbusy'); ptr=xregGui.RunTimePointer; ptr.LinkToObject(fig); optim=getoptimiser(d); switch lower(optim) case 'd-optimal' infostr='Optimizing design to attain maximum D-optimal value.'; valstr='Current D-optimal value:'; case 'v-optimal' infostr='Optimizing design to attain minimum V-optimal value.'; valstr='Current V-optimal value:'; case 'a-optimal' infostr='Optimizing design to attain minimum A-optimal value.'; valstr='Current A-optimal value:'; end ud.infotxt=uicontrol('Parent',fig,... 'Style','text',... 'HorizontalAlignment','left',... 'String',infostr); ud.axes=axes('Parent',fig,... 'Units','pixels',... 'Box','on',... 'FontSize',9); ud.startpoint=line('Parent',ud.axes,... 'LineStyle','none',... 'Marker','o',... 'MarkerSize',8,... 'MarkerFaceColor',[0 0 1],... 'MarkerEdgeColor','none',... 'XData',0,... 'YData',0); ud.historyline=line('Parent',ud.axes,... 'LineStyle','-',... 'Marker','none',... 'Color',[0 0 1],... 'XData',0,... 'YData',0); psival=uicontrol('Style','text',... 'Parent',fig,... 'String',valstr,... 'HorizontalAlignment','left'); iternumber=uicontrol('Style','text',... 'Parent',fig,... 'String','Number of iterations performed:',... 'HorizontalAlignment','left'); qnumber=uicontrol('Style','text',... 'Parent',fig,... 'String','Number of iterations without improvement:',... 'HorizontalAlignment','left'); ud.psival=uicontrol('Style','text',... 'Parent',fig,... 'HorizontalAlignment','left'); ud.iternumber=uicontrol('Style','text',... 'Parent',fig,... 'HorizontalAlignment','left'); ud.qnumber=uicontrol('Style','text',... 'Parent',fig,... 'HorizontalAlignment','left'); cancelbtn= uicontrol('Parent',fig,... 'Style','pushbutton',... 'String','Cancel',... 'Callback',{@i_cancel,ptr}); stopbtn= uicontrol('Parent',fig,... 'Style','pushbutton',... 'String','Accept',... 'Callback',{@i_stop,ptr}); set(fig,'CloseRequestFcn',{@i_cancel,ptr}); ud.next=1; ud.iters=[]; ud.psis=[]; ud.design=d; ud.ok=1; ud.qmax=0; ud.itermax=0; ptr.info=ud; ax=xreglayerlayout(fig,'packstatus','off',... 'elements',{ud.axes},... 'border',[40 30 40 30]); lyt=xreggridbaglayout(fig,'dimension',[5 3],... 'rowsizes',[15 -1 15 15 15],... 'colsizes',[205 80 -1],... 'gapx',5,'gapy',5,... 'mergeblock',{[1 1],[1 3]},... 'mergeblock',{[2 2],[1 3]},... 'elements',{ud.infotxt,ax,psival,iternumber,qnumber,[],[],ud.psival,ud.iternumber,ud.qnumber}); lyt=xreggridbaglayout(fig,'dimension',[2 3],... 'rowsizes',[-1 25],... 'colsizes',[-1 65 65],... 'gapx',7,'gapy',10,... 'border',[10 10 10 15],... 'mergeblock',{[1 1],[1 3]},... 'elements',{lyt,[],[],stopbtn,[],cancelbtn}); fig.LayoutManager=lyt; set(lyt,'packstatus','on'); i_setvalues(ptr); set(fig,'Visible','on'); try dout=optimise(d,1,{@i_initoptim,ptr},{@i_updateoptim,ptr},{@i_termoptim,ptr}); catch ME delete(fig); error(message('mbc:des_respsurf:UnexpectedError')); end ud=ptr.info; if ~ud.ok dout=d; end ok=ud.ok; delete(fig); function i_setvalues(ptr) ud=ptr.info; d=ud.design; optim=getoptimiser(d); switch lower(optim) case 'd-optimal' [psi, d]=dcalc(d); if isempty(psi) psi=0; end case 'v-optimal' [psi, d]=vcalc(d); if isempty(psi) psi=5; end case 'a-optimal' [psi, d]=acalc(d); if isempty(psi) psi=5; end end ylim = mbcmakelimits(psi, 'loose'); [delt,q,maxiter]=getstop(d); ud.qmax=q; ud.itermax=maxiter; set(ud.axes,'YLim',ylim,'XLim',[0 maxiter]); set(ud.startpoint,'XData',0,'YData',psi); set(ud.historyline,'XData',NaN,'YData',NaN); set(ud.iternumber,'String','0'); str=sprintf('%8.6f',psi); set(ud.psival,'String',str(str~=' ')); set(ud.qnumber,'String',sprintf('0/%d',q)); ptr.info=ud; function i_initoptim(des,evt,ptr) ud=ptr.info; % clear/create persistent history of data ud.psis=zeros(1,ud.itermax+1); ud.psis(1)=get(ud.startpoint,'YData'); ud.iters=zeros(1,ud.itermax+1); ptr.info=ud; function next=i_updateoptim(des,evt,ptr) ud=ptr.info; n=sum(ud.iters~=0)+2; ud.psis(n)=evt.newpsi; ud.iters(n)=evt.iteration; ptr.info=ud; set(ud.axes,'YLim', mbcmakelimits(ud.psis, 'loose')); set(ud.historyline,'XData',ud.iters(1:n),'YData',ud.psis(1:n),'Color',[0 0 1]); str=sprintf('%8.6f',evt.newpsi); set(ud.psival,'String',str(str~=' ')); set(ud.iternumber,'String',sprintf('%d',evt.iteration)); set(ud.qnumber,'String',sprintf('%d/%d',evt.q,ud.qmax)); drawnow; next=ud.next; function i_termoptim(des,evt,ptr) ud=ptr.info; n=sum(ud.iters~=0)+1; set(ud.historyline,'XData',ud.iters(1:n),'YData',ud.psis(1:n)); set(ud.infotxt,'String','Terminating optimization...'); function i_cancel(src,evt,ptr) % stop optimisation and set a cancel flag ud=ptr.info; ud.next=0; ud.ok=0; ptr.info=ud; function i_stop(src,evt,ptr) % stop optimisation and set an ok flag ud=ptr.info; ud.next=0; ud.ok=1; ptr.info=ud;