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;