Julia para Otimização - Exemplo 5

« voltar para “Julia para Otimização”

Objetivo: construir gráficos.

Vamos plotar em uma só figura o histórico de $f$ e $|\nabla f|_\infty$ para o problema do Exemplo 1. Você precisará do pacote Plots.

Salve o arquivo gradiente.jl. É a mesma implementação do Exemplo 4.

Método 1 - Gerando gráficos pela linha de comandos do Julia

Carregando gradiente.jl (supondo que esteja no diretório do arquivo):

julia> include("gradiente.jl")

Todos os pacotes necessários já serão carregados. Construa a estrutura nlp como no Exemplo 1.

Executando o método a partir do ponto $x_0=(1,1)$ e guardando o histórico de $f$ e $|\nabla f|_\infty$ de cada iteração:

julia> x, f, gradnorm, iter, status = gradiente(nlp, x0=[1;1], hist=true);

Os vetores f e gradnorm contêm o histórico de $f$ e $|\nabla f|_\infty$. Você pode imprimi-los na tela se quiser.

Iniciando a figura com o gráfico de $f$:

julia> using Plots
julia> fig = plot(f, label="f");

Agregando o gráfico de $|\nabla f|_\infty$ e configurando títulos:

julia> fig = plot!(gradnorm, title="FO e gradiente", xlabel="iter", label="|∇f|");

Obs.: você pode agregar quantos plots quiser à mesma figura executando sucessivos plot!. Ao executar plot (sem exclamação) novamente, Julia limpará a figura.

Salvando a figura em vários formatos:

julia> savefig(fig, "figura.png");
julia> savefig(fig, "figura.pdf");
julia> savefig(fig, "figura.svg");

Observações:

  1. o formato PNG é tipo foto. Já PDF e SVG são formatos vetoriais. PDF pode ser incorporado em textos Latex sem deformação, e SVG pode ser editado utilizando programas como CorelDraw e Inkscape.
  2. este método é preferível quando rodamos vários testes automatizados e queremos salvar figuras ao longo do processo.
  3. em alguns computadores, a figura é mostrada em janela separada ao executar o comando plot sem ponto e vírgula no fim.

Método 2 - Saída através do navegador (notebooks)

É possível executar comandos Julia através do navegador de internet. Para tanto, você precisará instalar o pacote IJulia. A partir da linha de comandos do Julia, podemos entrar no Jupyter, uma espécie de ambiente gráfico que funciona pelo navegador:

julia> using IJulia
julia> notebook()

Isso abrirá uma página com o Jupyter, e você poderá navegar entre as pastas do seu computador.

Um notebook é um “caderno” de comandos em série. Salve o notebook grafico.ipynb, que contém todos os comandos para este exemplo.

Dentro do Jupyter, abra grafico.ipynb. Você pode executar os comandos em sequência clicando no botão “Run”, ou teclando Ctrl+Enter em cada linha. Ao executar uma linha, aparecerá “[*]”. Isso siginifca que o Julia está processando. Quando o Julia terminar o processamento da linha, aparecerá um número referente à ordem de execução.

Neste método, o gráfico será mostrado na tela do navegador.

Estude o notebook e mude-o como quiser. Você pode retirar o ; (ponto e vírgula) no final de cada linha para ver a saída do Julia (assim como no ambiente de comandos do Julia).

Configurando gráficos

O comando plot aceita personalização. Por exemplo, para mudar título e texto do eixo $x$:

julia> fig = plot(f, label="f", title="Função objetivo", xlabel="iter");

As opções são separadas por vírgula. Eis algumas delas:

Textos:

Eixos:

Fontes:

Linhas dos gráficos:

Outras configurações da legenda:

Imagem:

Há muitas outras opções de personalização. Por exemplo, é possível trabalhar plots aninhados (subplots) ou até mesmo fazer figuras animadas. Veja mais exemplos e configurações em

Outros comandos interessantes

É possível plotar pontos para funções discretas com o comando scatter. Também, o comando annotate imprimi textos nas coordenadas indicadas.

Como exemplo, o trecho a seguir

julia> using Plots, LaTeXStrings
julia> x = -1:0.1:1
julia> y(x) = x^2
julia> fig = plot(x, y, label=L"f(x)=x^2");
julia> fig = scatter!(x, y, label="", fill=(0,:orange,0.5));
julia> fig = annotate!(0, 0.6, L"\textrm{área}=\int_{-1}^1 x^2 \, dx");
julia> savefig(fig, "ex5.png");

produz a figura abaixo. Note que utilizamos o pacote LaTeXStrings, que traduz comandos Latex.

Exemplo 5