captulo 22 otimizao - ic. do captulo neste captulo, otimizao refere-se ao processo de determinar os...

Download Captulo 22 Otimizao - ic.  do captulo Neste captulo, otimizao refere-se ao processo de determinar os pontos onde uma funo assume determinado valor, ou assume valores extremos

Post on 16-May-2018

214 views

Category:

Documents

1 download

Embed Size (px)

TRANSCRIPT

  • Captulo 22Otimizao

    Introducao ao MATLAB p.1/18

  • Resumo do captulo

    Neste captulo, otimizao refere-se ao processo dedeterminar os pontos onde uma funo assumedeterminado valor, ou assume valores extremos.

    Abordaremos aqui funes disponveis no MATLAB bsico,mas h uma grande variedade de funes disponveis naoptimization toolbox. Veja Help > MATLAB >Mathematics > Function Functions > MinimizingFunctions and Finding Zeros.

    Seja f(x) uma funo. Dado y, determinar x tal quey = f(x) pode ser complicado, principalmente quando nosabemos calcular f1(x). Nestes casos precisamosestimar o valor de x por um procedimento iterativo,chamado de zero finding (porque buscamos o zero dafuno h(x) = y f(x)).

    Abordaremos somente o caso unidimensional; dimensesmaiores requerem o uso de toolboxes.

    Introducao ao MATLAB p.2/18

  • A funo fzero

    O mximo de uma funo f(x) dado pelo mnimo def(x). Porisso, podemos nos ater aos mtodos paradeterminao de valores extremos mnimos; isto comalgoritmos de minimizao.

    No MATLAB podemos usar a funo fzero para encontrar ozero de uma funo unidimensional.

    O algoritmo usado uma combinao do mtodo dabisseo e da interpolao quadrtica inversa.

    Introducao ao MATLAB p.3/18

  • Exemplo

    Vamos exemplificar o uso da funo fzero para minimizar aa funo humps:

    >> x = linspace(-.5,1.5);>> y = humps(x);>> plot(x,y)>> grid on>> title(Humps Function)

    O arquivo humps.m calcula a funo:

    humps(x) =1

    (x 0.3)2 + 0.01+

    1

    (x 0.9)2 + 0.04 6,

    cujos zeros esto prximos de x = 0.2 e x = 1.3.

    Introducao ao MATLAB p.4/18

  • Usando a funo fzero

    >> format long % para exibir mais dgitos>> x = fzero(humps, 1.3) % calculando o zero proximo a 1.3x =

    1.29954968258482

    >> disp(humps(x)) % verificando o valor de humps(x)0

    >> [x, value] = fzero(humps,-0.2) % calculando o zero proximo% a -0.2 e ja verificando o valor de humps(x)x =

    -0.13161801809961value =

    8.881784197001252e-16

    A funo fzero fornece apenas um zero, aquele que maisprximo da aproximao inicial. Assim, se houver mais deum zero preciso fazer uma chamada a fzero para cadaum deles, com diferentes aproximaes iniciais.

    Introducao ao MATLAB p.5/18

  • Observaes a respeito de fzero

    A primeira ao da funo fzero procurar por umamudana de sinal na funo em cada lado da aproximaoinicial. Quando encontra, formado um intervalo onde afuno efetuar a busca pelo zero. Note que se a funo contnua esta troca de sinal indica que houve cruzamentocom o eixo X. O valor retornado o mais prximo do pontode cruzamento.Podemos chamar a funo fzero com um intervalo, masdevemos garantir que os extremos do intervalo possuemsinais diferentes:

    >> [x,valor] = fzero(humps,[-2 0])x =-0.13161801809961

    value =0

    >> [x,valor] = fzero(humps,[0 1.2])??? Error using ==> fzeroThe function values at the interval endpoints must differ in sign

    Introducao ao MATLAB p.6/18

  • A funo a ser pesquisada

    A funo para a qual queremos encontrar um ou mais zerospode ser fornecida como:

    string que identifica o arquivo .m que a contm (comono exemplo anterior);function handle;

    >> disp(fzero(@humps,[-2 0]))-0.13161801809961

    expresso em string.

    >> humpsstr =1./((x-.3).2+.01)+1./((x-.9).2+.04)-6;>> disp(fzero(humpsstr,[-2 0]))-0.13161801809961

    function in line;

    >> hinline = inline(humpsstr);>> disp(fzero(hinline,[-2 0]))-0.13161801809961

    Introducao ao MATLAB p.7/18

  • A funo a ser pesquisada

    As quatro formas anteriores de definio da funo seaplicam a todas as funes de otimizao que discutiremos;

    Todas estas formas so equivalentes em termos deresultados;

    Estas formas no so equivalentes em termos develocidade de execuo:

    Mais rpido: escrever o arquivo M e usar uma functionhandle apontando para este arquivo;Intermedirio: usar o arquivo M diretamente;Mais lento: usar a funo in line ou expresso emstring.

    No caso de uma expresso em string o dado convertido em uma funo in line antes da execuo.Logo, os dois casos tornam-se equivalentes, em umdeles a converso para funo in line feita pelafuno fzero, no outro pelo usurio.

    Introducao ao MATLAB p.8/18

  • Parmetros para fzero

    A funo fzero, bem como todas as funes de otimizao,possuem diversos parmetros definveis.

    As funes optimset e optimget so usadas paraestabelecer e recuperar parmetros para todas as funesde otimizao. Isto porque todas estas funes, mesmo asda optimization toobox, compartilham o mesmo formato decontrole de parmetros.

    No caso da funo fzero so usados dois parmetros:Display e TolX. O primeiro controla a quantidade dedetalhes fornecidos durante a execuo e o segundoestabelece uma limite de tolerncia para a resposta final.Vamos ver alguns exemplos de uso.

    Introducao ao MATLAB p.9/18

  • Exemplos de uso de parmetros

    >> options = optimset(Display,iter); % retorno de optimset e uma estrutura>> [x,value] = fzero(@humps, [-2 0], options)Func-count x f(x) Procedure

    1 -2 -5.69298 initial2 0 5.17647 initial3 -0.952481 -5.07853 interpolation4 -0.480789 -3.87242 interpolation5 -0.240394 -1.94304 bisection6 -0.120197 0.28528 bisection7 -0.135585 -0.0944316 interpolation8 -0.131759 -0.00338409 interpolation9 -0.131618 1.63632e-06 interpolation

    10 -0.131618 -7.14819e-10 interpolation11 -0.131618 0 interpolation

    Zero found in the interval: [-2, 0].x = -0.13161801809961value = 0>> options = optimset(Display,none);>> [x,value] = fzero(@humps, [-2 0], options)x = -0.13161801809961value = 0

    Introducao ao MATLAB p.10/18

  • Exemplos de uso de parmetros

    >> options = optimset(Display,final,TolX,0.1);>> [x,value] = fzero(@humps, [-2 0], options)Zero found in the interval: [-2, 0].x =-0.24039447250762

    value =-1.94303825972565

    >> options = optimset(Display,iter,TolX,0.1);>> [x,value] = fzero(@humps, [-2 0], options)Func-count x f(x) Procedure

    1 -2 -5.69298 initial2 0 5.17647 initial3 -0.952481 -5.07853 interpolation4 -0.480789 -3.87242 interpolation5 -0.240394 -1.94304 bisection

    Zero found in the interval: [-2, 0].x =-0.24039447250762

    value =-1.94303825972565

    options uma estrutura.

    Introducao ao MATLAB p.11/18

  • Minimizao

    Usamos minimizao quando queremos determinar osmximos e os mnimos de uma funo.

    Matematicamente, isto feito analiticamente,determinado-se os pontos onde a derivada da funo zero (veja o grfico da funo humps).

    Em muitos casos no possvel, ou no vivel,determinar os pontos em que a derivada nula. Nestescasos precisamos recorrer a mtodos numricos paradeterminar os extremos da funo.

    O MATLAB fornece, na sua parte bsica, duas funes paradeterminao de mnimos de funes:

    fminbnd: minimizao em uma dimenso;fminsearch: minimizao em dimenso n.

    Para determinao do mximo, fazemos a busca pelomnimo de f(x). O valor retornado o negativo do valorreal.

    Introducao ao MATLAB p.12/18

  • Minimizao em uma dimenso

    Usamos a funo fminbnd para encontrar o mnimo defunes unidimensionais. Esta utiliza uma combinao debusca por sees ureas e interpolao parablica.

    Vamos exemplificar o uso da funo fminbnd usando afuno humps. Note que h um mximo prximo de 0.3 eum mnimo prximo de 0.6.

    >> [xmin, valor] = fminbnd(humps,0.5,0.8)xmin = valor =

    0.63700821196362 11.25275412587769>> [xmin, valor] = fminbnd(-humps(x),0.2, 0.4)xmin = valor =

    0.30036413790024 -96.50140724387050

    No ltimo exemplo -humps(x) uma expresso queidentifica o que deve ser minimizado. Poderamos tambmmodificar o arquivo .m.

    Podemos modificar e recuperar as opes com optimset eoptimget. Para detalhes veja help on line. Introducao ao MATLAB p.13/18

  • Minimizao em dimenso n

    feita pela funo fminsearch, que tenta encontrar omnimo de uma funo escalar f(x) de argumento vetorialx.

    A funo fminsearch implementa o algoritmo de buscasimplex, de Nelder-Mead que modifica os componentes dex para atingir o mnimo de f(x).

    para funes suaves: no to eficiente;

    No requer informaes sobre o gradiente (clculo podeser caro).

    Tende a ser mais robusto para funes que no sosuaves.

    Introducao ao MATLAB p.14/18

  • Minimizao em dimenso n

    Nosso exemplo ilustrativo ser a funo de Rosenbrock,tambm conhecida como funo banana:

    f(x) = 100(x2 x2

    1)2 + (1 x1)

    2

    Veja o grfico desta funo:

    Arquivo: mm2202.m

    x = [-1.5:0.125:1.5];y = [-.6:0.125:2.8];[X,Y] = meshgrid(x,y) ;Z = 100.*(Y-X.*X).2 + (1-X).2;mesh(X,Y,Z)hidden offxlabel(x(1)), ylabel(x(2))title(Figure 22.2: Banana Function)hold onplot3(1,1,1,k.,markersize,20)hold off%(mm2202.m plot)

    O mnimo desta funo ocorre prximo de x = [1; 1].

    Introducao ao MATLAB p.15/18

  • Usando fminsearch

    Vetorizando a entrada: x(1) x1 e x(2) x2. Isto podeser feito com a seguinte funo M: (banana.m)

    function f=banana(x)% Funcao banana de Rosenbrockf=100*(x(2)-x(1)2)2 + (1-x(1))2;

    Vamos agora usar a funo fminsearch:

    >> format long>> [xmin, fxmin,conv,saida] = fminsearch(banana,[-1.9,2])xmin =

    1.00001666889480 1.00003447386277fxmin = conv =

    4.068551535063419e-10 1saida =

    iterations: 114funcCount: 210algorithm: Nelder-Mead simplex direct search

    Introducao ao MATLAB p.16/18

  • Funo fminsearch - adicionais

    Os quatro parmetros de sada do exemplo anterior so:xmin: o ponto de mnimo;fxmin: o valor da funo no ponto encontrado;conv: indica o sucesso da busca;sada: estrutura com as estatsticas do algoritmo.

    A funo fminsear

Recommended

View more >