Introdução à linguagem de programação Julia
Prof. Angelo Aliano Filho
UTFPR Universidade Tecnológica Federal do Paraná
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisSumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisInstalação e introdução
Porque usarmos linguagem Julia?
A computação cientíca tem tradicionalmente exigido o mais alto desempenho possível.
A linguagem de programação Julia é uma linguagem dinâmica exível, apropriada para computação cientíca e numérica, com um desempenho comparável às linguagens tradicionais.
Julia apresenta tipagem opcional, despacho múltiplo, e bom desempenho, alcançado usando inferência de tipo e compilação just-in-time (JIT)
Julia proporciona facilidade e expressividade para programação numérica de alto nível, da mesma forma que linguagens como R, MATLAB, e Python, mas também suporta programação geral.
Instalação e introdução
Porque usarmos linguagem Julia?
As justicativas mais signicativas são: Open source
Não há necessidade de vetorizar o código para o desempenho; o código desvetorizado é rápido.
O core da linguagem impõe muito pouco; a base Julia e a
biblioteca padrão são escritas na própria Julia, incluindo operações primitivas como a aritmética inteira.
Chamar diretamente as funções C (não são necessários invólucros ou APIs especiais).
Bom desempenho, aproximando-se das linguagens estaticamente compiladas como a C.
Instalação e introdução
Sucesso da linguagem Julia atualmente
Mais de 3.500 pacotes registrados Mais de 35 milhões de downloads 78% de crescimento anual
É útil lembrar também de uma comunidade para discutir e tirar dúvidas: só acessar: discourse.julialang.org após realizar um pequeno cadastro
Instalação e introdução
Tabela:Crescimento da linguagem Julia - alguma métricas
Total cumulativo Total cumulativo Crescimento desde 2018 desde 2019
Total de download 1,8 milhão 3,2 milhões +78%
Total de pacotes 1.688 2.462 +46%
Número de novos artigos com citação 93 253 +172% Fórum (questões) 8.620 16.363 +90% Número de novos iniciantes 9,626 19,472 +102% Citações do artigo: 613 1.048 +71% A fresh Approach to numerical Computing (2017)
Instalação e introdução
2012 2013 2014 2015 2016 2017 2018 2019 0 1 2 3 ·104 # do wnl oadsInstalação e introdução
C Julia Python MATLAB R
0 10 20 1 1.11 1.22 2.11 23 sp eed up em relação a C
Instalação e introdução
Instalação do Julia Professional
Método 1: diretamente do site:
Acesse https://juliacomputing.com/products/juliapro Escolher o sistema operacional. O acesso dará a versão mais atual da linguagem (v1.5.0-1).
Fazer um cadastro com e-mail da UTFPR
Instalação e introdução
Instalação e introdução
Instalação e introdução
Instalação do Julia Professional
Método 2: acesso a versões mais antigas e instalação em dois passos: Acessar https://julialang.org/downloads/oldreleases/ Escolher a versão e baixar o executável.
Em minha página pessoal há também (versão 1.0.4): acesse http://paginapessoal.utfpr.edu.br/angeloaliano em seguida na pasta Linguagem de programação Julia.
Instalação e introdução
Instalação e introdução
Instalação e introdução
Instalação e introdução
Instalação do Julia Professional
Método 2: acesso a versões mais antigas e instalação em dois passos: Acessar https://atom.io/
Faça o download do editor ATOM Em seguida, rode o executável baixado
Precisamos, agora, congurar o ATOM para a linguagem Julia e escrever os códigos para compilação
Instalação e introdução
Instalação do Julia Professional
Conguração do ambiente ATOM: Abra o ATOM.
Vá em settings install para instalar os pacotes para o ATOM Na caixinha install Packages digite uber-juno e dê um enter para instalar o pacote uber-juno clicando em install. Este pacote serve para congurar o ATOM para a linguagem Julia
Instalação e introdução
Instalação e introdução
Instalação e introdução
Instalação do Julia Professional
Conguração do ambiente ATOM:
Depois disso, vá em settings packages julia-client Clique em settings
Insira o caminho de onde está intalado o executável ...\JuliaPro-1.0.4.1\Julia-1.0.4\bin\julia.exe
Instalação e introdução
Instalação e introdução
Primeiros passos
A forma mais fácil de aprender e experimentar com Julia é iniciar uma sessão interativa REPL na linha de comando.
Alternativamente, você pode criar um arquivo e salvá-lo no formato .jl e compilar cada linha selecionando-a e dando ctrl+enter ou pressionar o pequeno triângulo.
Instalação e introdução
Instalação e introdução
Operações matemáticas
Primeiros passosPara sair da sessão interactiva, digite ctrl+d ou digite exit() Se uma expressão é introduzida numa sessão interativa com um ponto-e-vírgula, o seu valor não é mostrado. Caso contrário é. A variável aans está ligada ao valor da última expressão avaliada, quer seja mostrada ou não
Para avaliar expressões escritas num arquivo fonte.jl, escreva include("file.jl").
Para limpar o prompt de comando, só digitar ctrl+l Todo comentário é inserido ao colocarmos #
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisOperações matemáticas
Tabela:Alguns operadores matemáticos
Expressão Nome Descrição
x+y Soma binária Executa adição
x-y Subtração binária Executa subtração
x*y Multiplicação binária Executa multiplicação
x\y Divisão Executa divisão
x/y Divisão inversa Executa divisão inversa
x^y Potenciação Executa a potenciação
Operações matemáticas
Efetuando cálculos aritméticos básicos
É recomendável que cada explicação seja acompanhada em tempo real. Você pode criar um \arquivo1.jl para fazer os testes aritméticos a seguir.
Números em formato racional são expressos com o comando //. Por exemplo: 2//3 + 7//13 resulta em 47//39.
Sem as barras duplas a conta é feita em ponto utuante, ie, 2/3 + 7/13 resulta em 1.205.
Notação inxa: +(3,4,7) resulta em 14 que o mesmo que 3+4+7 Operação de potência são feita ao usarmos ^. Exemplo: 2^5 resulta em 32
Operações matemáticas
Efetuando cálculos aritméticos básicos
Priorização das operações: 1 + 3*2 resulta em 7 ao passo que (1+3)*2 resulta em 8.
Podemos denir/declarar variáveis: exemplo a=2;b=3 quando compilado (ctrl+enter) resulta armazena o resultado. Quando compilamos a+b o resultado é 5.
Cuidado: no aquivo .jl compilar linha por linha para evitar erro not defined
Operações matemáticas
Efetuando cálculos aritméticos básicos
Algumas constantes pré-denidas: pi,e,im exp(2) é a o mesmo que e2.
Tentamos executar: F=10
d=5
\theta=30*pi/180 \tau=F*d*cos(\theta)
a="o valor de \tau é $\tau"
Operações matemáticas
Efetuando cálculos aritméticos vetorizados
Basta inserir um . antes do operador.
Por exemplo, [1,2,3]^3 não é denida, ao passo que [1,2,3].^3 efetua o cubo elemento a elemento, produzindo [1,8,27]
Do mesmo modo, se quisermos as raízes quadradas de cada componente do vetor [1,2,3] damos o comando sqrt.([1,2,3])
Operações matemáticas
Tabela:Alguns operadores e testes matemáticos
Operador Nome
== Igualdade
!= Diferente
<,<= Menor, Menor igual
>,>= Maior, Maior igual
isequal(x,y) Testa se x e \verb|y| são iguais isfinite(x) Testa se x é nito
isinf(x) Testa se x é innito
Operações matemáticas
Tabela:Algumas funções matemáticas
Operador Descrição Operador Descrição
round(x) Arredonda hypot(x,y) Calcula a hipotenusa round(x),digits=n Arredonda com n casas exp(x) Exponencial natural floor(x) Arredonda para baixo log(x) Logaritmo natural ceil(x) Arredonda para cima log(b,x) Logaritmo de base b abs(x) Calcula o módulo sin,cos,tan,... Funções trigonométricas sign(x) Determina o sinal sind,cosd,tand,... Funções trigonométricas sqrt(x) Raiz quadrada com argumento em radiano cbrt(x) Raiz cúbica Demais funções Rode o pacote SpecialFunctions.jl
Toda aritmética com números complexos é feita bastando considerar i =√−1 com o comando im
Operações matemáticas em formato simbólico
Em formato simbólico poderemos efetuar algumas operações matemáticas; só instalar o pacote SymEngine e depois using SymEngine
Denimos das variáveis simbólicas do seguinte modo: a,b = symbols("x y") ou @vars x y
Por exemplo, denimos a expressão simbólica y = x2+y2
y2+1 do
seguinte modo:
z = (x^2+y^2)/(y^2+1);
Se quisermos encontrar, por exemplo, as derivadas parciais de ordem 2 desta função entramos com o comando diff:
dzdx = diff(z,x,2) dzdy = diff(z,y,2)
Operações matemáticas em formato simbólico
Para quem usa o LATEX, instalar e rodar o pacote Latexify é útil.
Após obtermos dzdx e dzdy, podemos transformar o resultado em código LATEX: Cod_Lat = latexify(dfdy) para termos: −8 · y2 (1 + y2)2 − 2 · x2+ y2 (1 + y2)2 + 8 · x2+ y2 · y2 (1 + y2)3 + 2 · 1 + y 2−1
(eu não z nada, apenas comandos Julia!) Podemos também expandir expressões: z = expand((x+2y)^4)
Operações matemáticas em formato simbólico
Podemos fazer substituição de expressões simbólicas em outras. Veja o exemplo: z = x*y^3 A = expand(A(y=> 1-2x)) resulta em x - 6*x^2 + 12*x^3 - 8*x^4 Outro exemplo: f(x) = cos(x)*sin(x) g(x) = diff(f(x),x,3) subs(g(x),x,pi) resulta em -4 Substituições múltiplas: subs(x^2+(y-2)^2, a=>2, b=>3) resulta em 5.
Operações matemáticas em formato simbólico
Podemos trabalhar com matrizes. Veja o exemplo: A = [symbols("a_$i$j") for i in 1:3, j in 1:4]
que, se convertida em LATEX(latexify(A)) se transforma em:
a11 a12 a13 a14 a21 a22 a23 a24 a31 a32 a33 a34 (1)
Podemos ainda fazer operações com esta matriz: B = A*[1;2;3;4]
resultando em
3-element Array{Basic,1}:
a_11 + 2*a_12 + 3*a_13 + 4*a_14 a_21 + 2*a_22 + 3*a_23 + 4*a_24 a_31 + 2*a_32 + 3*a_33 + 4*a_34
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisVetores e matrizes
Uma matriz é uma coleção ordenada de elementos. É
frequentemente indicada com parênteses retos e os elementos separados por vírgula.
Em Júlia, as matrizes são utilizadas para listas, vetores, tabelas, e matrizes.
Uma matriz unidimensional atua como um vector ou lista. Uma matriz 2-D pode ser usada como uma tabela ou matriz. E matrizes 3-D ou mais são pensadas de forma semelhante como matrizes multi-dimensionais.
Vetores e matrizes
Criando arrays
Aqui uma maneira de criar um array simples de uma dimensão: a = [1, 2, 3, 4, 5]
Outro exemplo:
s = ["Este", "é", "um", "array", "de", "strings"] ou ainda um array de funções:
Vetores e matrizes
Criando arraysCriando arrays com tipos especícos: a = int64[1,2,3,4]
Arrays vazios: b = Float64[]
Compare os comandos: [1,2,3,4,5]; [1 2 3 4 5]
no primeiro caso o array tem dimensão 1, na segunda dimensão 2 (1 linha e 5 colunas)
Vetores e matrizes
Criando arraysCriando matrizes: basta separar cada linha por ;. Exemplo: A = [1 2 3; 4 5 6]
resulta numa matriz 2 × 3.
Arrays aleatórios: por exemplo, se queremos uma matriz 5 × 3 aleatória, podemos usar:
A = rand(5,3)
Podemos criar arrays usando intervalos: a=1:0.1:10 cria um array com primeiro elemento igual a 0, de 0.1 em 0.1 até chegar em 10. O mesmo seria produzido usando o comando collect(1:0.1:10) Podemos dar um incremento negativo: collect(10:-0.2:1)
Vetores e matrizes
Criando arraysOutra função útil é range(). Por exemplo:
range(1,length=12,stop=100) cria um vetor de 12 componentes igualmente espaçadas, iniciando em 1 e terminando em 100. Basta inserir
collect(range(1, length=12, stop=100)) Podemos calcular 10n para n em um array usando:
exp10.(range(2.0, stop=3.0, length=5))
Note que, no comando collect você não precisa usar um looping para coletar todos os valores do array.
Vetores e matrizes
Criando arraysUtilizando geradores para criar matrizes:
Por exemplo, se quisermos um array [1,4,9,16,25] basta usar o comando
[n^2 for n in 1:5]
E podemos usar dois iteradores. Por exemplo: [r*c for r in 1:5, c in 1:5] produz: 5x5 Array{Int64,2}: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25
Vetores e matrizes
Criando arrays
Podemos acrescentar um if na instrução. Por exemplo, [i^2 for i=1:10 if i <= 5]' produz [1 4 9 16 25] porque transpomos o array com o apóstrofe '.
Podemos criar uma matriz 2 × 3 de zeros introduzindo zeros(2,3). Se quisermos que ela seja inteira, basta utilizar zeros(Int64,2,3) Matriz de 1's pode ser criada de maneira similar: ones(2,3)
Vetores e matrizes
Criando arraysO comando rand(m,n) cria uma matriz m × n cuja entrada é um número aleatório entre 0 e 1.
Já rand(1:10,m,n) cria uma matriz m × n cuja entrada é um número inteiro de 1 a 10.
Para distribuição normal, utilize randn(m,n) com média 0 e desvio padrão 1.
Comando fill é útil para replicar valores. Experimente fill(42,9,3)
Podemos também criar arrays de arrays: veja em a=Array[[1, 2], [3,4]]
Vetores e matrizes
Todas as funções disponíveis para trabalhar em matrizes podem ser utilizadas (se as dimensões o permitirem) como matrizes. Uma forma rápida de escrever uma matriz é separar os elementos usando espaços (para fazer linhas) e usar ponto-e-vírgula para separar as linhas.
Acessando elementos de arrays
[[1, 2, 3] [4, 5, 6]] produz uma matriz 3 × 2
[[1, 2, 3], [4, 5, 6]] produz uma matriz um array de array Para separar os elementos de uma mesma linha podemos omitir as vírgulas juntamente com [ ]
Assim, [[1 2 3];[4 5 6]] e [1 2 3;4 5 6] geram o mesmo objeto
Vetores e matrizes
Acessando elementos de arrays
Para acessar aos elementos de uma matriz, seguir o nome da matriz pelo número do elemento entre parênteses retos.
Experimente a=[10,20,30,40] e a[3] resulta em 30
O primeiro elemento da lista é o índice 1; o último é conseguido com a[end] para dar 40
Podemos fornecer um conjunto de índices, entre parênteses: a[1,3,4] produz 10,30,40
Pode-se selecionar os elementos com true e false: a[[true,false,true]] gera 10,30
Vetores e matrizes
Acessando elementos de arrays
Se a=[1 2 3;4 5 6;7 8 9] e queremos a segunda coluna, basta digitar a[:,2]. Se queremos a terceira linha, use a[3,:]
Gere o vetor: r = rand(0:10, 10). Para achar o maior ou o menor elemento desta lista, basta usar maximum(r) ou minimum(r) Para determinar o índice onde ocorre o máximo, basta usar o comando findmax que ele retorna o máximo (primeiro argumento) e o índice que ele aparece (segundo argumento)
Vetores e matrizes
Encontrando elementos em arrays
Se quisermos saber se um dado elemento está numa lista, use a função in(). Exemplo, se a=1:10, então 3 \in a resulta em true Há um conjunto de funções do tipo nd: findall(),
findfirst() e findlast(), que são usadas para obter indices de arrays. Vamos exemplicar.
Seja a = [2,3,5,7,11,13,17,19,23,29].
Primeira ocorrência de um número: findfirst(isequal(13),a) resulta em 6
Vetores e matrizes
Encontrando elementos em arrays
findall() retorna uma array de indices onde a função retorna true quando aplicada. Exemplo: findall(isinteger,a) retorna 1,...,10 ou ainda findall(a.<= 13) resulta em 1,...,6 Agora, findlast(a .<=13) retorna 6;
Outro exemplo: se b=[0 1 0 0 1], então findlast(b .== 1) resulta em 5
Vetores e matrizes
Outras funções
Precisamos rodar o pacote Pkg.add(Statistics) e em seguida using Statistics. Suponha a=[1,4,7,-1,3,7]
sum(a) retorna 21 prod(a) retorna -588 mean(a) retorna 3.5 std(a) retorna 3.209 middle(a) retorna 3
Vetores e matrizes
Outras funçõesPacote combinatório: Pkg.add(Combinatorics) e em seguida using Combinatorics.
Então collect(permutations(a)) resulta num array de arrays com todas as permutações deste conjunto (as 720!)
collect(combinations(a,3)) retorna todas as combinações dos elementos de a, tomados 3 a 3.
length() retorna o comprimento de um vetor. size() retorna a dimensão de uma matriz.
Vetores e matrizes
Modicando o conteúdo de arrays
Seja a=collect(1:10). Para adicionar itens no nal de um array, utilize push!(a,20).
Para adicionar um item na frente, use pushfirst!(a,0) Para inserir um elemento num array em um certo indice, use splice!(). Suponha a=[1,2,3,5]. Usamos splice!(a,4,23) resultará em a=[1,2,3,23]
Suponha a=[1,2,3,5], então splice!(a,3:4,3:5) resulta em a=[1,2,3,4,5]
A mesma função pode ser usada para remover elementos de uma lista. Suponha a=collect(1:10). Então splice(a,5) resulta na mesma lista sem o 5
Vetores e matrizes
Operações aritméticas com matrizes
Considere A=reshape(1:16,4,4) e B=ones(4,4) e o pacote LinearAlgebra
Para calcular A + B basta usar A+B Para calcular AB basta usar A*B
Para calcular AB elemento a elemento, basta usar A.*B Para calcular a inversa de A (se ela existir), use inv(A) Para somar 1 em todas as entradas, basta utilizar A .+ 1
Vetores e matrizes
Operações aritméticas com matrizes
Se quisermos saber quais elementos de A são menores que 6, basta utilizar A .< 6.
Podemos multiplicar matriz por vetor se as dimensões são compatíveis. Se A=reshape(1:12,3,4) e v=collect(1:4) então A*v é bem denida.
O produto interno de dois vetores é usado com o comando dot() ou digitando \cdot e teclando tab em seguida.
Vetores e matrizes
Operações aritméticas com matrizes
Se quisermos saber quais são os autovalores de A basta compilar eigvals(A)
Se quisermos saber quais são os autovetores de A basta compilar eigvecs(A)
Para determinar a fatoração LU de A basta entrar com (L,U,P) = factorize(A), onde P é a matriz de permutação. Se A for simétrica, podemos fazer a fatoração de Cholesky de A com o comando R = cholesky(A)
Vetores e matrizes
Concatenando matrizesUsaremos as funções hcat() (adiciona na horizontal) e vcat() (adiciona na vertical) para juntar matrizes se suas dimensões permitirem. Considere A = reshape(1:12, 3, 4) e
B = reshape(100:100:1200, 3, 4) hcat(A, B) adiciona B na frente de A hcat(A, B) adiciona B abaixo de A vec(A) transforma A em um vetor
Seja: a = Array[[1, 2], [3, 4], [5, 6]]. Então hcat(a...) converte o array de arrays em uma matriz.
Vetores e matrizes
Extendendo arraysMuitas vezes deseja-se criar uma matriz e depois acrescentar-lhe mais elementos. Embora possa fazer isto com vcat() e hcat(), esteja ciente de que ambas as operações criam novas matrizes temporárias e copiam elementos, por isso nem sempre produzem o código mais rápido.
Uma maneira melhor é usar o push()! Esta é uma operação eciente que alarga a matriz.
Considere o código: a = [] for i = 1:80 push!(a, i) end cria [1,2,...,80]
Vetores e matrizes
Extendendo arraysPara converter o array produzido em uma matriz, basta utilizar reshape(a,10,:) para ter uma matriz de 10 linha e tantas colunas que forem necessárias.
push!() não permite trabalhar com elementos bidimensionais, apenas unidimensionais
det(A) calcula o determinante de A rank(A) determina o posto de A
Vetores e matrizes
Usando funções em matrizes
Considere A=reshape(1:9,3,3).
sum(A) calcula a soma de todos os elementos de A. sum(A, dims=(1)) soma cada coluna.
sum(A, dims=(2)) soma cada linha.
mean(A) calcula a média dos elementos de A (podemos considerar a dimensão também)
Vetores e matrizes
Usando funções em matrizes
Sejam A = rand(-1:2:1, 3, 3) e B = rand(-2:4:2, 3, 3). min.(A,B) retorna uma nova matriz cuja componente é menor elemento correspondente entre A e B
norm(x,p) determina a norma p do vetor x norm(A,p) determina a norma p da matriz A p = ∞ também funciona!
Vetores e matrizes
Sorting arraysJulia tem uma função sort() exível que devolve uma cópia ordenada de um array, e uma versão de sort!() que muda o array para que seja ordenado. Seja rp=randperm(10) (precisa rodar o pacote Random)
\sort(rp) ordena o vetor em ordem crescente
\sort(rp,rev=true) ordena o vetor em ordem decrescente Se A=reshape(rand(1:20, 20), 4, 5) então:
I sort(A, dims=(1)) ordena cada coluna I sort(A, dims=(2)) ordena cada linha
Vetores e matrizes
Sorting arraysA função sortperm() é semelhante à sort(), mas não devolve uma cópia ordenada da colecção. Em vez disso, devolve uma lista de índices que poderiam ser aplicados à coleção para produzir uma versão ordenada.
Seja r = rand(100:110, 10), então sortperm(r) devolve os indices do vetor r que resultam na ordenação crescente
Efeito pode ser conseguido com uma ordenação decrescente usando sortperm(r,rev=true)
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisPlotando grácos
Para plotar grácos, precisamos instalar o pacote Plots e inserir using Plots; plotly();. Mais detalhes, consultar em
https://docs.juliaplots.org/latest/generated/plotly/. Podemos plotar uma lista de
valores do seguinte modo: seja a=rand(1:10,10) então plot(a) fornece uma poligonal Criando outro vetor, digamos b=rand(1:10,10) e dando plot!(b), inserimos na mesma imagem anterior a nova
poligonal
Podemos, assim que a gura for gerada, dar o comando savefig("nome_da_figura") e salvá-la.
Plotando grácos
Suponha a=rand(1:10,10) e b=rand(1:10,10). Se quisermos plotar as coordenadas (ai, bi), i = 1, · · · , 10(semligá-las) basta utilizar o comando scatter(a,b) Se quisermos plotar (i, ai) e
(j, bj)separadamente, usamos
Plotando grácos
Podemos plotar funções na variável x. Seja
f (x) = −7.65 sin(x) + 9.87 sin(2x + 206), 1 ≤ x ≤ 335 é plotada com comando plot(f,1:365) antes denindo que f(x)=-7.65 \sin(x) + 9.87sin(2x + 206)
e podemos inserir mais funções na mesma tela lembrando de usar o comando plot!() para a nova função
Plotando grácos
CustomizaçãoConsidere x=1:10 e y=rand(10,2) Agora dê o comando
\verb!plot(x,y,title="two lines",label=["Line 1" "Line 2"],lw=3)! Como output, obtemos:
Plotando grácos
CustomizaçãoSe quisermos mudar o nome do eixo x por exemplo, basta acrescentar
xlabel!(Meu eixo x) Se quisermos trocar a cor das linhas, basta acrescentar color=["yellow" "red"] Se quisermos alterar as marcas, acrescente
Plotando grácos
Podemos combinar várias parcelas como sub-quadrantes utilizando layouts.
Customização
Suponhamos que temos 4 séries com dez pontos cada e queremos esboça-las uma abaixo da outra.
Podemos fazer isto dando o comando
y = rand(10, 4)
Plotando grácos
Podemos combinar várias parcelas como sub-quadrantes utilizando layouts.
Customização
Suponhamos que temos 4 séries com dez pontos cada e queremos esboça-las uma abaixo da outra.
Podemos fazer isto dando o comando
y = rand(10, 4)
Plotando grácos
Podemos misturar grácos de diferentes tipos. Veja: p1 = plot(x, y) #4 linhas
p2 = scatter(x, y) #Faça só os pontos p3 = plot(x, y, xlabel = "Este tem label",
lw = 3, title = "Subtitulo")
p4 = histogram(x, y[:,1]) #4 histogramas
Plotando grácos
CustomizaçãoPodemos preencher áreas abaixo de funções. Veja o código abaixo: plot(0:0.01:pi, sin.(0:0.01:pi), fillrange = 0.0, fillalpha = 0.5, fillcolor = :blue )
Plotando grácos
Podemos fazer histogramas: x = randn(1000)
p = histogram(x,color="blue") savefig("hist")
Um gráco de barras é feito de forma similar, trocando histogram por bar
Plotando grácos
Podemos fazer grácos em coordenadas polares. Veja:
Customização
Insira os comandos
theta = 0:2*pi/1000:2*pi+2*pi/1000 r=(cos.(4*theta))
Plotando grácos
Podemos fazer grácos em 3D, como curvas vetoriais. Veja:
Customização Insira os comandos t=0:pi/200:7*pi x=cos.(t) y=sin.(t) plot3d(x,y,t,lw=2,leg=false)
Plotando grácos
Podemos fazer grácos em 3D, como superfícies. Veja:
Customização Insira os comandos x=-1:0.01:1 y=-1:0.01:1 h(x,y)=x^2-y^2; surface(x,y,h)
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisFunctions
Em Júlia, uma função é um objeto que mapeia uma conjunto argumento para valores de retorno.
As funções Júlia não são funções puramente matemáticas, porque podem ser alteradas e ser afetadas pelo estado global do programa. A sintaxe básica para denir funções em Júlia é:
function nomefuncao(args) expressao-1 expressao-2 expressao-3 ... expressao-n end
Esta função aceita os argumentos args e executa cada comando expressao-i
Functions
Um exemplo de function é: function f(x,y)
x + y end
f (generic function with 1 method)
Esta função aceita dois argumentos x e y e retorna o valor da última expressão avaliada, que é x + y.
Functions
Existe uma segunda sintaxe, mais concisa, para denir uma função em Júlia.
A sintaxe tradicional da declaração da função demonstrada acima é equivalente à seguinte forma compacta de atribuição:
f(x,y) = x + y
f (generic function with 1 method)
A forma de atribuição, o corpo da função deve ser uma única expressão, embora possa ser uma expressão com vários argumentos A função é chamada usando parêntesis: f(2,3) resulta em 5
Functions
Passagem de Argumentos
O valor devolvido por uma função é o valor da última expressão avaliada
A palavra-chave return faz com que uma função retorne imediatamente o objeto desejado
Exemplo:
function g(x,y)
return (x*y,x + y) end
Functions
Outro exemplo Considere function hypot(x,y) x = abs(x) y = abs(y) if x > y r = y/x return x*sqrt(1+r*r) end if y == 0 return zero(x) end r = x/y return y*sqrt(1+r*r) endFunctions
Função dentro de uma função
using Plots plotly() function Grafico_polar(theta,r,a,b) plot(theta,r, proj=:polar) end theta = a:0.001:b; r = cos.(5*theta) Grafico_polar(theta,r,0,2*pi)
Functions
Número variável de argumentos
É possível denir funções com argumentos opcionais, para que a função possa utilizar padrões sensíveis se não forem fornecidos valores especícos. É fornecido um símbolo e um valor por denição na lista de argumentos:
function xyzpos(x, y, z=0) println("$x, $y, $z") end
Functions
Número variável de argumentos
Quando chamamos esta função, se não fornecermos o terceiro argumento, a variável z é denida em 0 e usa os demais valores normalmente:
xyzpos(1,2) 1, 2, 0
xyzpos(1,2,3) 1, 2, 3
Functions
Variáveis locais e funções
Veja a função:
function teste(a,b,c) subtotal = a + b + c end
Inserindo teste(1,2,3) obtemos 6
Porém, ao chamar subtotal aparece o erro
Functions
Função mapSe já tiver uma função e uma matriz, pode chamar a função para cada elemento da matriz utilizando o map. Isto chama a função para cada elemento, recolhe os resultados, e devolve-os num array. Este processo é chamado de mapeamento.
a=1:10; map(sin, a)
resulta no seno de 1 a 10 alocados em um vetor
Claro que nesse caso teríamos o mesmo resultado com sin.(1:10). Mas o tempo computacional não seria igual:
@time map(sin, 1:10000);
0.045417 seconds (152.71 k allocations: 7.737 MiB) @time sin.(1:10000);
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisControle de uxo
Estrutura ifSe estiver habituado a outras linguagens, não se preocupe com o espaço branco, identação, recuo, parênteses, ponto e vírgula, ou qualquer coisa do gênero, mas lembre-se de terminar a construção condicional com o end.
nome = "Julia" if nome == "Julia"
println("Eu gosto de Julia") elseif nome == "Python"
println("Eu gosto de Pyton.") println("Mas eu prefiro Julia.") else
println("Eu não sei o que gosto.") end
Controle de uxo
Função if-else
Podemos usar a função ifelse. Ela pode ser usada da seguinte maneira:
s = ifelse(false, "Alô", "Tchau") * "palavra" resulta em Tchau palavra
Controle de uxo
Estrutura forTrabalhar através de uma lista ou um conjunto de valores ou desde um valor inicial até um valor nal são todos exemplos de iteração, e a construção nal de for-end.
Aqui está a sintaxe padrão para uma simples iteração através de um range de valores:
for i in 0:10:100 println(i) end
Controle de uxo
Estrutura for
for cor in ["vermelho", "verde", "azul"] # um array print(cor, " ")
end
Controle de uxo
Estrutura for
Pode iterar através de uma matriz 2D, passando por cada coluna, de cima para baixo. Vejamos um exemplo:
a = reshape(1:100, (10, 10)); for n in a
print(n, " ") end
Controle de uxo
Estrutura forIterando em um array e atualizando-a. Veja o exemplo: c = [1]; for i in c push!(c, i) @show c sleep(1) end
Controle de uxo
Estrutura for
A variável que passa por cada item - variável do laço - existe apenas dentro do laço, e desaparece assim que o laço termina.
for i in 1:10 @show i end
julia> i
Controle de uxo
Estrutura forSe quiser lembrar o valor da variável do laço fora dele (por exemplo, se tiver de sair do laço e precisar de saber o valor alcançado), utilize a palavra-chave global para determiná-la
for i in 1:10 global quaolonge if i % 4 == 0 quaolonge = i end end julia> quaolonge 8
Controle de uxo
Estrutura forDe modo semelhante, se declarar uma nova variável dentro de um laço, ela não existirá uma vez que o laço termine. Neste exemplo, k é criada dentro: for i in 1:5 k = i^2 println("$(i) squared is $(k)") end julia> k
ERROR: UndefVarError: k not defined
Se quiser saber o valor de k, basta inserir a palavra global antes da denição da mesma
Controle de uxo
Estrutura for
O código a seguir não funciona: contador = 0
for i in 1:10
contador = contador + i end
ERROR: UndefVarError: contador not defined porque counter não foi denida como global
Controle de uxo
Estrutura forJá o código a seguir roda perfeitamente: contador = 0 for i in 1:10 global contador contador = contador + i end julia> contador 55
Controle de uxo
Estrutura forEste comportamento é porque estamos trabalhando no terminal. É geralmente melhor, na prática, colocar o seu código dentro de funções, onde não precisa de marcar variáveis fora do laço como globais: function f() contador = 0 for i in 1:10 contador = contador + i end return contador end julia> contador=f() 55
Controle de uxo
Vejamos os comandos em uma só linha de comando: [(i, sqrt(i)) for i in 1:10]
(1, 1.0) (2, 1.4142135623730951) (3, 1.7320508075688772) (4, 2.0) (5, 2.23606797749979) [(r,c) for r in 1:5, c in 1:2] (1, 1) (1, 2) (2, 1) (2, 2) (3, 1) (3, 2) (4, 1) (4, 2) (5, 1) (5, 2) [x for x in 1:100 if x % 7 == 0] 7 14 21 28 35 42 49 m = rand(0:9, 3, 3); [i for i in enumerate(m)] 3x3 Array{Tuple{Int64,Int64},2}: (1, 6) (4, 5) (7, 3) (2, 4) (5, 0) (8, 7) (3, 1) (6, 7) (9, 4)
Controle de uxo
Estrutura forPor vezes deseja-se trabalhar em dois ou mais conjuntos ao mesmo tempo, tomando primeiro elemento de cada conjunto, depois o segundo, e assim por diante. Isto é possível utilizando a função zip(), bem conhecida: for i in zip(0:5, 100:105, 200:205) println(i) end (0,100,200) (1,101,201) (2,102,202) (3,103,203) (4,104,204) (5,105,205)
Controle de uxo
Estrutura forAs dimensões não precisam coincidir! for i in zip(0:15, 100:105, 200:205) println(i) end (0,100,200) (1,101,201) (2,102,202) (3,103,203) (4,104,204) (5,105,205)
Controle de uxo
Estrutura for
Outro exemplo últil:
for i = zip(3:2:7, ["blue" "red" "yellow"]) theta = 0:0.001:2*pi;
r = cos.(i[1].*theta)
display(plot!(theta,r,color=i[2])) end
Controle de uxo
Estrutura forLoopings aninhados podem ser compactados: for x in 1:6 for y in 1:6 if y % 3 == 0 @show (x, y) end end end
Controle de uxo
Estrutura for ...é equivalente a: for x in 1:6, y in 1:6 if y % 3 == 0 @show (x, y) end endControle de uxo
Estrutura whilePara repetir algumas expressões enquanto uma condição é verdadeira, use o while...end: x = 0; while x < 4 println(x) global x = x + 1 end
Controle de uxo
Estrutura whilePara repetir algumas expressões enquanto uma condição é verdadeira, use o while...end: function f() x = 0; while x < 4 println(x) x = x + 1 end return x end
Não precisamos denir x como global porque inserimos while dentro de uma function
Controle de uxo
Estrutura while
Exemplo: verique quantos termos precisamos adicionar para que
k
X
n=1
(−1)n+1 4 2n − 1 aproxime π com uma precisão de 5 casas decimais.
Controle de uxo
Estrutura whileFazemos o looping dentro de uma function imprimindo o erro, o número de iterações e o valor aproximado da série.
function f() S, k, e = 0, 0, 1 while e > 0.000005 k = k + 1 S = S + ((-1)^(k+1))*4/(2*k-1) e = abs(((-1)^(k+1))*4/(2*k-1)) end return (e,k,S) end
Sumário
1 Instalação e introdução 2 Operações matemáticas 3 Vetores e matrizes 4 Plotando grácos 5 Functions 6 Estruturas de repetição 7 Pacotes especiaisPacotes especiais resolução de EDOs
O pacote para resolução de EDOs tem documentação que pode ser acessada em https://diffeq.sciml.ai/stable/.
Para utilizá-lo, basta rodar Pkg.add("DifferentialEquations") e using DifferentialEquations
Neste exemplo, resolveremos a equação escalar:
du
dt = f (u, p, t), u(0) = u0 com t ∈ [0, 1] e f(u, p, t) = αu.
Pacotes especiais resolução de EDOs
Primeiro, denimos o problema, como a equação, condições iniciais e o range: using DifferentialEquations f(u,p,t) = 1.01*u u0 = 1/2 ts = (0.0,1.0) prob = ODEProblem(f,u0,ts)
dene automaticamente o solver mais eciente de acordo com as opções de tolerância, número de iterações máximo, etc
Pacotes especiais resolução de EDOs
Depois, controlamos o solver através do comando
sol = solve(prob, Tsit5(), reltol=1e-8, abstol=1e-8) Demais opções são acessadas em https://diffeq.sciml.ai/ stable/basics/common_solver_opts/#solver_options Poderemos escolher o solver para a resolução acessando
https://diffeq.sciml.ai/stable/tutorials/ode_example/ #Example-1-:-Solving-Scalar-Equations
Por exemplo, se quiséssemos o método de 5a ordem de Tsitouras
era só entrar com
Pacotes especiais resolução de EDOs
Lidando com a solução encontrada:
Podemos acessar o quinto elemento da solução dando o comando sol[5] ou obter o oitavo termo de t através de sol.t[8]
De modo geral, as componentes de t e u são acessadas por [sol.t sol.u]
Elementos da solução sol intermediários são calculados por interpolação, por exemplo sol(0.456) = 0.7924
Pacotes especiais resolução de EDOs
Plotagem dos grácos das soluções: Basta inserir
sing Plots plotly()
plot(sol,linewidth=5,title="Solução da EDO",
xaxis="Tempo (t)",yaxis="u(t)",label="Minha curva!") E se você conhece a solução exata:
plot!(sol.t, t->0.5*exp(1.01t),lw=3,ls=:dash, label="Solução verdadeira!")
Pacotes especiais resolução de EDOs
O código completo para resolver este problema, onde u0= 1/2, é dado
a seguir. using DifferentialEquations f(u,p,t) = 1.01*u u0 = 1/2 ts = (0.0,1.0) prob = ODEProblem(f,u0,ts)
sol = solve(prob, Tsit5(), reltol=1e-8, abstol=1e-8) using Plots
plotly()
plot(sol,linewidth=5,title="Solução da EDO",
xaxis="Tempo (t)",yaxis="u(t)",label="Minha curva!") plot!(sol.t, t->0.5*exp(1.01t),lw=3,ls=:dash,
Pacotes especiais resolução de sistema de EDOs
O problema da mistura ([5]) é denido por: dQ1 dt = 3 2 − 1 10Q1+ 3 40Q2 dQ2 dt = 3 + 1 10Q1− 1 5Q2 , Q1(0) = 25; Q2(0) = 15.
Pacotes especiais resolução de sistema de EDOs
Denimos uma função para escrever o modelo, como a seguir: function Mistura!(dQ,Q,p,t)
dQ[1] = p[1] + p[2]*Q[1] + p[3]*Q[2] dQ[2] = p[4] + p[5]*Q[1] + p[6]*Q[2] end
Denimos os dados iniciais e os parâmetros do modelo: Q0 =[25;15];
ts = (0,40);
p=[1.5;-0.2;3/40;3;0.1;-0.2]
sist = ODEProblem(Mistura!,Q0,ts,p) @time sol = solve(sist)
Finalmente, mandamos plotar as soluções determinadas: plot(sol,linewidth=5,label=["Q_1" "Q_2"])
Pacotes especiais resolução de sistema de EDOs
Pacotes especiais resolução de sistema de EDOs
O problema da mistura ([5]) é denido por: dθ dt = ω(t) dω dt = − 3 2 g l sin θ(t) + 3 ml2M (t) , θ(0) = 0.01; ω(0) = 0. e M(t) = 0.1 sin t.
Pacotes especiais resolução de sistema de EDOs
function pendulo!(du,u,p,t) du[1] = u[2] du[2] = -3*p[3]/(2*p[1])*sin(u[1]) + 3/(p[2]*p[1]^2)*M(t) end p=[1;1;9.81] theta0 = 0.01 omega0 = 0.0 u0 = [theta0, omega0] ts = (0.0,10.0) M(t) = 0.7cos(t) prob = ODEProblem(pendulo!,u0,ts,p) sol = solve(prob) plot(sol,linewidth=2,xaxis="t",label=["theta [rad]" "omega [rad/s]"],color=["red" "green"],layout=(2,1))Pacotes especiais resolução de sistema de EDOs
Pacotes especiais resolução de sistema de EDOs
O modelo SIR ([5]) é denido por: dS dt = −βSI dω dt = βSI − γI dω dt = γI , S(0) = S0; I(0) = I0; R(0) = 0.
Pacotes especiais resolução de sistema de EDOs
O modelo é implementado da seguinte forma:
function SIR!(du,u,p,t) beta, gama = p
du[1] = -beta*u[1]*u[2]
du[2] = beta*u[1]*u[2] - gamma*u[2] du[3] = gamma*u[2] end p = [0.85;0.15] u0 = [0.9;0.1;0.0] tspan = (0.0,50.0) prob = ODEProblem(SIR!,u0,tspan,p) sol = solve(prob) plot(sol,linewidth=2,xaxis="t",layout=(3,1), color=["red" "green" "blue"],
Pacotes especiais resolução de sistema de EDOs
Pacotes especiais ajuste de curvas
Documentação que pode ser acessada em
https://julianlsolvers.github.io/LsqFit.jl/latest/tutorial/. É a implementação do algoritmo Levenberg-Marquardt.
Rodar Pkg.add("LsqFit") e using LsqFit
Vamos testar um exemplo de ajuste de pontos por uma reta do tipo yi = β1+ β2xi+ εi, com β1 e β2 a serem determinados
Geramos os seguintes dados: tdata = collect(0:1:20)
Pacotes especiais ajuste de curvas
Em seguida descrevemos nosso modelo usando uma function: model(x,beta) = beta[1] .+ beta[2].*x;
p0 = [0.5, 0.5]
p0 é o parâmetro inicial para o algoritmo determinar os parâmetros.
Seguidamente, damos o comando para a determinação do ajuste: fit = curve_fit(model, tdata, ydata, p0)
param = fit.param
Pronto! os parâmetros foram determinados. Denindo f(x) = f(x) = param[1] + param[2]*x podemos plotar os grácos da função ajustada e dos pontos do experimento: plot(f,0:20,lw=2,)
Pacotes especiais ajuste de curvas
Pacotes especiais ajuste de curvas
O código completo está apresentado a seguir:
using LsqFit using Plots plotly()
tdata = collect(0:1:20)
ydata = 2*tdata .+ 1 .+ 0.8*randn(length(tdata)) model(x,beta) = beta[1] .+ beta[2].*x;
p0 = [0.5, 0.5]
fit = curve_fit(model, tdata, ydata, p0) param = fit.param
yfit = model(tdata, param) a = round.(param[1],digits=2) b = round.(param[2],digits=2) plot(tdata,yfit,lw=2,label="Dados")
scatter!(tdata,ydata,legend = :outertopright, label=["$a + $b*x" "dados"])
Pacotes especiais ajuste de curvas
Podemos fazer um ajuste por meio dos quadrados mínimos linear por meio de uma função quadrática:
f (x) = β1+ β2x + β3x2.
Sejam os dados:
xdata = collect(0:0.1:10); n=length(xdata)
ydata = 1 .- 2*xdata .+ xdata.^2 .+ 0.5*rand(-5:5,n) scatter(xdata,ydata)
Apresentamos o modelo:
model(x,beta) = beta[1] .+ beta[2].*x .+ beta[3].*x.^2; p0 = [0.5, 0.5, 0.5]
Finalmente determinamos os pontos ajustados: fit = curve_fit(model, xdata, ydata, p0) param = fit.param
Pacotes especiais ajuste de curvas
Pacotes especiais ajuste de curvas
Agora suponhamos que queremos ajustar um conjunto de pontos ao modelo não-linear: f (x) = β1 x β2 β3−1 exp − x β2 β3! .
Criamos o conjunto de dados:
xdata = [ 15.2; 19.9; 2.2; 11.8; 12.1; 18.1; 11.8; 13.4; 11.5; 0.5; 18.0; 10.2; 10.6; 13.8; 4.6; 3.8; 15.1; 15.1; 11.7; 4.2 ] ydata = [ 0.73; 0.19; 1.54; 2.08; 0.84; 0.42; 1.77; 0.86; 1.95; 0.27;
Pacotes especiais ajuste de curvas
Em seguida, criamos uma função para escrever o modelo:
model(x,beta) = beta[1] * ((x/beta[2]).^(beta[3]-1)) .* (exp.( - (x/beta[2]).^beta[3] ))
Para determinar β, chamamos a função
fit = curve_fit(model, xdata, ydata, [3.0, 8.0, 3.0]) beta = fit.param
para termos os valores ajustados, a saber: beta_fit = fit.param
Pacotes especiais ajuste de curvas
Pacotes especiais integração numérica
Se quisermos calcular uma integral denida do tipo A =
Z b
a
f (x) dx,
usando aproximações por somas de Riemann, basta utilizar: A ≈
n
X
k=1
f (x∗i)∆x.
Isso pode ser feito fornecendo os seguintes comandos, supondo f (x) = e−x2, a = 0, b = 10 e n = 100000.
Pacotes especiais integração numérica
O código para isto é apresentado a seguir: a, b, n = 0, 10, 100000;
deltax = (b-a)/n;
x_estrela = a .+ (0:n) * delta f(x) = exp(-x^2)
f_em_x = map(f, x_estrela)
@time Int_approx = sum(f_em_x)*deltax que fornece R10
0 e −x2
Pacotes especiais integração numérica
Ou simplesmente, instalando o pacote QuadGK e depois using QuadGK, cujo manual é disponível em
https://juliamath.github.io/QuadGK.jl/latest/ e que implementa a quadratura de Gauss-Kronrod.
f(x) = exp(-x^2)
@time (integral,err) = quadgk(f, 0, 10, rtol=1e-8)
resultando nos mesmos 0.886. Temos também a opção de controlar o erro da aproximação.
Pacotes especiais otimização
Instalamos e rodamos o pacote Optm, ver documentação em http:// julianlsolvers.github.io/Optim.jl/v0.9.3/user/minimization/ que implementa diversos algoritmos de otimização não-linear
apresentados nos livros [6, 7]
Otimização irrestrita
Consideremos a função f(x1, x2) = (2x1− 3)4+ (3x1− x2)2.
Desejamos encontrar o seu mínimo absoluto. Primeiro, preparamos uma function em Julia:
function f(x)
return (2x[1] - 3)^4 + (3x[1] - x[2])^2 end
Pacotes especiais otimização
Otimização irrestritaChamamos esta função partindo do ponto inicial (x1, x2) = (0, 0)T:
using Optim opt = optimize(f, [0.0, 0.0]) println("vetor_ótimo = ", opt.minimizer) println("f_ótimo = ", opt.minimum) resulta em vetor ótimo = [1.5023336961799512, 4.507036749081916] f ótimo = 1.7462409416808738e-9
Pacotes especiais otimização
Otimização irrestrita
Poderemos trocar o algoritmo, que por default é Nelder-Mead. Outros tais como Simulated Annealing,
BroydenFletcherGoldfarbShanno (BFGS), Gradientes Conjugados estão disponíveis:
opt = optimize(f, [0.0, 0.0], BFGS())
Pacotes especiais otimização
Otimização box constrainedQuando as variáveis tem um lower and upper bounds.
Consideremos a minimização da mesma f sujeito às restrições 2 ≤ x1 ≤ 5 e 6 ≤ x2 ≤ 10. Preparamos a função-objetivo:
function f(x)
return (2x[1] - 3)^4 + (3x[1] - x[2])^2 end
Nós também preparamos os limitantes para as variáveis: lb = [2.0; 6.0]
ub = [5.0; 10.0] x0 = [3.0; 7.0]
Pacotes especiais otimização
Otimização box constrainedEscolhemos o otimizador: inner_optimizer = BFGS() E em seguida otimizador: resultados = optimize(f,lb,ub,x0, Fminbox(inner_optimizer)) Perguntamos os resultados resultados.minimizer -->> [2,6] resultados.minimum -->> 1 results.iterations -->> 7
Pacotes especiais otimização
Otimização em problemas mais geraisPrecisamos instalar e rodar o pacote JuMP cuja documentação é disponível em https://jump.dev/JuMP.jl/v0.19.0/index.html
Suponhamos que queiramos resolver o seguinte problema de otimização-não linear:
Min (x1− 3)3+ (x2− 4)2
sujeito a
(x1− 1)2+ (x2+ 1)3+ e−x1 ≤ 1,
Precisamos de duas macros @NLobjective e @NLconstraint para lidar com as não-linearidades.
Pacotes especiais otimização
Otimização em problemas mais geraisConstruimos o modelo (previamente rodar o solver de otimização não-linear restrito Ipopt):
m = Model(solver=IpoptSolver())
Em seguida denir as variáveis, restrições e função-objetivo por meio de macros:
@variable(modelo, x[1:2])
@NLobjective(modelo,Min,(x[1]-3)^3 + (x[2]-4)^2) @NLconstraint(modelo,(x[1]-1)^2 + (x[2]+1)^3
+ exp(-x[1]) <= 1) Em seguida, resolvemos o modelo optimize!(modelo)
Pacotes especiais otimização
Otimização em problemas mais gerais
Após resolvido, extraímos a solução e o valor ótimo:
println("** Valor mínimo = ",objective_value(modelo)) println("** Solução ótima = ",value.(x))
o que resulta em:
** Valor mínimo = 4.409110764366554
Referências I
D. P. Corina, L. S. Jose-Robertson, A. Guillemin, J. High, and A. R. Braun, Language lateralization in a bimanual language, Journal of Cognitive Neuroscience, vol. 15, no. 5, pp. 718730, 2003. J. Bezanson, A. Edelman, S. Karpinski, and V. B. Shah, Julia: A fresh approach to numerical computing, SIAM review, vol. 59, no. 1, pp. 6598, 2017.
A. Edelman, Julia: A fresh approach to technical computing and data processing, tech. rep., MASSACHUSETTS INST OF TECH CAMBRIDGE CAMBRIDGE, 2019.
I. Balbaert, Getting Started with Julia Programming: Enter the exciting world of Julia, a high-performance language for technical computing.
Referências II
W. E. Boyce and R. C. DiPrima, Equações diferenciais elementares e problemas de valores de contorno.
Guanabara Dois, 1985.
M. S. Bazaraa, H. D. Sherali, and C. M. Shetty, Nonlinear programming: theory and algorithms.
John Wiley & Sons, 2013.
J. Nocedal and S. Wright, Numerical optimization.