Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introdução à linguagem de programação Julia Prof. Angelo Aliano Filho UTFPR � Universidade Tecnológica Federal do Paraná Primeiro semestre de 2021 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 1 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 2 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 3 / 151 Instalaçã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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 4 / 151 Instalação e introdução Porque usarmos linguagem Julia? As justi�cativas mais signi�cativas 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 5 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 6 / 151 discourse.julialang.org 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)� Outras referências, ver em: [1, 2, 3, 4] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 7 / 151 Instalação e introdução 2012 2013 2014 2015 2016 2017 2018 2019 0 1 2 3 ·104 # do w nl oa ds Figura: Crescimento do uso da linguagem Julia Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 8 / 151 Instalação e introdução C Julia Python MATLAB R 0 10 20 1 1.11 1.22 2.11 23 sp ee d up em re la çã o a C Figura: Velocidade da linguagem Julia em comparação com as demais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 9 / 151 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 Descarregar o executável e instalar logo em seguida. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 10 / 151 https://juliacomputing.com/products/juliapro Instalação e introdução Figura: Página de download do JuliaPro Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 11 / 151 Instalação e introdução Figura: Cadastro no site o�cial do JuliaPro Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 12 / 151 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�. Deveremos em seguida fazer o download do editor ATOM. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 13 / 151 https://julialang.org/downloads/oldreleases/ http://paginapessoal.utfpr.edu.br/angeloaliano Instalação e introdução Figura: Página do software Julia em versões antigas Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 14 / 151 Instalação e introdução Figura: Página de download do ATOM Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 15 / 151 Instalação e introdução Figura: Arquivos para instalação da linguagem Julia Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 16 / 151 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, con�gurar o ATOM para a linguagem Julia e escrever os códigos para compilação Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 17 / 151 https://atom.io/ Instalação e introdução Instalação do Julia Professional Con�guraçã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 con�gurar o ATOM para a linguagem Julia Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 18 / 151 Instalação e introdução Figura: Con�guração ATOM - passo 1 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 19 / 151 Instalação e introdução Figura: Con�guração ATOM - passo 2 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 20 / 151 Instalação e introdução Instalação do Julia Professional Con�guraçã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� Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 21 / 151 Instalação e introdução Figura: Con�guração ATOM - passo 3 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 22 / 151 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. É neste arquivo .jl é que podemos criar nossos primeiros programas. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 23 / 151 Instalação e introdução Figura: Primeiros passos na linguagem Julia - linha de comando Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 24 / 151 Instalação e introdução Figura: Primeiros passos na linguagem Julia - via arquivo .jl Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 25 / 151 Operações matemáticas Primeiros passos Para 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 # Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 26 / 151 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ção7 Pacotes especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 27 / 151 Operaçõ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 x%y Resto da divisão Executa o resto da divisão Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 28 / 151 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 in�xa: +(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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 29 / 151 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 de�nir/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 O comando typeof() fornece o tipo da variável de�nida. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 30 / 151 Operações matemáticas Efetuando cálculos aritméticos básicos Algumas constantes pré-de�nidas: 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" (ele reconhece letras gregas como em latex) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 31 / 151 Operações matemáticas Efetuando cálculos aritméticos vetorizados Basta inserir um . antes do operador. Por exemplo, [1,2,3]^3 não é de�nida, 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]) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 32 / 151 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 é in�nito isnan Testa se x não é um número Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 33 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 34 / 151 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 De�nimos das variáveis simbólicas do seguinte modo: a,b = symbols("x y") ou @vars x y Por exemplo, de�nimos a expressão simbólica y = x 2+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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 35 / 151 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 + y2 )−1 (eu não �z nada, apenas comandos Julia!) Podemos também expandir expressões: z = expand((x+2y)^4) resulta em 32*x*y^3 + 24*x^2*y^2 + 8*x^3*y + x^4 + 16*y^4 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 36 / 151 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 37 / 151 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 a14a21 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 38 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 39 / 151 Vetores 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 40 / 151 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: s = [sin, cos, tan] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 41 / 151 Vetores e matrizes Criando arrays Criando 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 42 / 151 Vetores e matrizes Criando arrays Criando 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 43 / 151 Vetores e matrizes Criando arrays Outra 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 44 / 151 Vetores e matrizes Criando arrays Utilizando geradores para criar matrizes: Por exemplo, se quisermosum 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 45 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 46 / 151 Vetores e matrizes Criando arrays O 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]] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 47 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 48 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 49 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 50 / 151 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 exempli�car. 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 51 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 52 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 53 / 151 Vetores e matrizes Outras funções Pacote 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 54 / 151 Vetores e matrizes Modi�cando 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 55 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 56 / 151 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 de�nida. O produto interno de dois vetores é usado com o comando dot() ou digitando \cdot e teclando tab em seguida. Para calcular A−1v basta usar A\v Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 57 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 58 / 151 Vetores e matrizes Concatenando matrizes Usaremos 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 59 / 151 Vetores e matrizes Extendendo arrays Muitas 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 e�ciente que alarga a matriz. Considere o código: a = [] for i = 1:80 push!(a, i) end cria [1,2,...,80] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 60 / 151 Vetores e matrizes Extendendo arrays Para 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 nullspace(A) acha a base para o espaço nulo deA Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 61 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 62 / 151 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! Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 63 / 151 Vetores e matrizes Sorting arrays Julia 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 64 / 151 Vetores e matrizes Sorting arrays A 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 65 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 66 / 151 Plotando 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 67 / 151 https://docs.juliaplots.org/latest/generated/plotly/ 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 (sem ligá-las) basta utilizar o comando scatter(a,b) Se quisermos plotar (i, ai) e (j, bj) separadamente, usamos scatter(a) e scatter!(b) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 68 / 151 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 de�nindo 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 69 / 151 Plotando grá�cos Customização Considere 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: Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 70 / 151 Plotando grá�cos Customização Se 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 mark=[:circle :square] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 71 / 151 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) plot(x, y, layout = (4, 1)) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 72 / 151 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) plot(x, y, layout = (2, 2)) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 73 / 151 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 plot(p1, p2, p3, p4, layout = (2, 2),legend = false) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 74 / 151 Plotando grá�cos Customização Podemos 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 ) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 75 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 76 / 151 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)) plot(theta,r, proj=:polar) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 77 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 78 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 79 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 80 / 151 Functions 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 de�nir 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 81 / 151 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 82 / 151 Functions Existe uma segunda sintaxe, mais concisa, para de�nir 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 83 / 151 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 Quando chamamos g(2,3) o retorno é o par (6,5) Angelo Aliano Filho (UTFPR)Linguagem Julia 2021/1 84 / 151 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) end Quando chamamos hypopt(3,4), o retorno é 5 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 85 / 151 Functions 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) irá desenhar um grá�co em coordenadas polares. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 86 / 151 Functions Número variável de argumentos É possível de�nir 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 de�nição na lista de argumentos: function xyzpos(x, y, z=0) println("$x, $y, $z") end Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 87 / 151 Functions Número variável de argumentos Quando chamamos esta função, se não fornecermos o terceiro argumento, a variável z é de�nida em 0 e usa os demais valores normalmente: xyzpos(1,2) 1, 2, 0 xyzpos(1,2,3) 1, 2, 3 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 88 / 151 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 LoadError: UndefVarError: subtotal not defined Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 89 / 151 Functions Função map Se 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); 0.000162 seconds (10 allocations: 78.484 KiB) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 90 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 91 / 151 Controle de �uxo Estrutura if Se 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 92 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 93 / 151 Controle de �uxo Estrutura for Trabalhar 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 A variável i toma o valor de cada elemento do array Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 94 / 151 Controle de �uxo Estrutura for for cor in ["vermelho", "verde", "azul"] # um array print(cor, " ") end aqui, o range é um array de strings Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 95 / 151 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 correndo cada coluna, passando para a próxima e assim por diante. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 96 / 151 Controle de �uxo Estrutura for Iterando em um array e atualizando-a. Veja o exemplo: c = [1]; for i in c push!(c, i) @show c sleep(1) end que pode ser interrompido com ctrl+c Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 97 / 151 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 ERROR: UndefVarError: i not defined Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 98 / 151 Controle de �uxo Estrutura for Se 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 99 / 151 Controle de �uxo Estrutura for De 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 de�nição da mesma Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 100 / 151 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 de�nida como global Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 101 / 151 Controle de �uxo Estrutura for Já o código a seguir roda perfeitamente: contador = 0 for i in 1:10 global contador contador = contador + i end julia> contador 55 porque counter não foi de�nida como global Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 102 / 151 Controle de �uxo Estrutura for Este 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 103 / 151 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 104 / 151 Controle de �uxo Estrutura for Por 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 105 / 151 Controle de �uxo Estrutura for As 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 106 / 151 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 Angelo Aliano Filho (UTFPR) LinguagemJulia 2021/1 107 / 151 Controle de �uxo Estrutura for Loopings aninhados podem ser compactados: for x in 1:6 for y in 1:6 if y % 3 == 0 @show (x, y) end end end Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 108 / 151 Controle de �uxo Estrutura for ...é equivalente a: for x in 1:6, y in 1:6 if y % 3 == 0 @show (x, y) end end Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 109 / 151 Controle de �uxo Estrutura while Para 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 note a necessidade de colocarmos global para x Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 110 / 151 Controle de �uxo Estrutura while Para 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 de�nir x como global porque inserimos while dentro de uma function Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 111 / 151 Controle de �uxo Estrutura while Exemplo: veri�que quantos termos precisamos adicionar para que k∑ n=1 (−1)n+1 4 2n− 1 aproxime π com uma precisão de 5 casas decimais. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 112 / 151 Controle de �uxo Estrutura while Fazemos 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 113 / 151 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 especiais Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 114 / 151 Pacotes 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. Do cálculo, temos que u(t) = u0 exp(αt) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 115 / 151 https://diffeq.sciml.ai/stable/ Pacotes especiais � resolução de EDOs Primeiro, de�nimos 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) de�ne automaticamente o solver mais e�ciente de acordo com as opções de tolerância, número de iterações máximo, etc Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 116 / 151 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 sol = solve(prob,Tsit5(),reltol=1e-8,abstol=1e-8) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 117 / 151 https://diffeq.sciml.ai/stable/basics/common_solver_opts/#solver_options https://diffeq.sciml.ai/stable/basics/common_solver_opts/#solver_options https://diffeq.sciml.ai/stable/tutorials/ode_example/#Example-1-:-Solving-Scalar-Equations https://diffeq.sciml.ai/stable/tutorials/ode_example/#Example-1-:-Solving-Scalar-Equations 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 118 / 151 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!") Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 119 / 151 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, label="Solução verdadeira!") Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 120 / 151 Pacotes especiais � resolução de sistema de EDOs O problema da mistura ([5]) é de�nido por: dQ1 dt = 3 2 − 1 10 Q1 + 3 40 Q2 dQ2 dt = 3 + 1 10 Q1 − 1 5 Q2 , Q1(0) = 25;Q2(0) = 15. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 121 / 151 Pacotes especiais � resolução de sistema de EDOs De�nimos 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 De�nimos 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"]) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 122 / 151 Pacotes especiais � resolução de sistema de EDOs Figura: Grá�co das soluções do sistema de EDO resolvido Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 123 / 151 Pacotes especiais � resolução de sistema de EDOs O problema da mistura ([5]) é de�nido por: dθ dt = ω(t) dω dt = −3 2 g l sin θ(t) + 3 ml2 M(t) , θ(0) = 0.01;ω(0) = 0. e M(t) = 0.1 sin t. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 124 / 151 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)) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 125 / 151 Pacotes especiais � resolução de sistema de EDOs Figura: Grá�co das soluções do sistema de EDO não-homogêneo resolvido Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 126 / 151 Pacotes especiais � resolução de sistema de EDOs O modelo SIR ([5]) é de�nido por: dS dt = −βSI dω dt = βSI − γI dω dt = γI , S(0) = S0; I(0) = I0;R(0) = 0. onde S + I +R = 1 denotam proporções. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 127 / 151 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"], label=["S(t)" "I(t)" "R(t)"]) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 128 / 151 Pacotes especiais � resolução de sistema de EDOs Figura: Grá�co das soluções do sistema de EDO não-linear resolvido Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 129 / 151 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) ydata = 2*tdata .+ 1 .+ 0.8*randn(length(tdata)) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 130 / 151 https://julianlsolvers.github.io/LsqFit.jl/latest/tutorial/ 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. De�nindo 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,) scatter!(tdata,ydata) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 131 / 151 Pacotes especiais � ajuste de curvas Figura: Ajuste linear para o conjunto de dados Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 132 / 151 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"]) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 133 / 151 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+ β3x 2. 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 yfit = model(xdata, param) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 134 / 151 Pacotes especiais � ajuste de curvas Figura: Ajuste quadrático para o conjunto de dados Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 135 / 151 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; 0.39; 1.39; 1.25; 0.76; 1.99; 1.53; 0.86; 0.52; 1.54; 1.05 ] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 136 / 151 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 137 / 151 Pacotes especiais � ajuste de curvas Figura: Ajuste não-linear para o conjunto de dados Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 138 / 151 Pacotes especiais � integração numérica Se quisermos calcular uma integral de�nida do tipo A = ∫ b a f(x) dx, usando aproximações por somas de Riemann, basta utilizar: A ≈ n∑ k=1 f(x∗i )∆x. Isso pode ser feito fornecendo os seguintes comandos, supondo f(x) = e−x 2 , a = 0, b = 10 e n = 100000. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 139 / 151 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 ∫ 10 0 e −x2dx ≈ 0.886. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 140 / 151 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. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 141 / 151 https://juliamath.github.io/QuadGK.jl/latest/ 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 142 / 151 http://julianlsolvers.github.io/Optim.jl/v0.9.3/user/minimization/ http://julianlsolvers.github.io/Optim.jl/v0.9.3/user/minimization/ Pacotes especiais � otimização Otimização irrestrita Chamamos 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 143 / 151 Pacotes especiais � otimização Otimização irrestrita Poderemos trocar o algoritmo, que por default é Nelder-Mead. Outros tais como Simulated Annealing, Broyden�Fletcher�Goldfarb�Shanno (BFGS), Gradientes Conjugados estão disponíveis: opt = optimize(f, [0.0, 0.0], BFGS()) No primeiro, o número de iterações foi 49, ao passo que neste foram 24! Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 144 / 151 Pacotes especiais � otimização Otimização box constrained Quando 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] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 145 / 151 Pacotes especiais � otimização Otimização box constrained Escolhemos 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 Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 146 / 151 Pacotes especiais � otimização Otimização em problemas mais gerais Precisamos 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. Em seguida, construir o modelo de otimização para resolvê-lo. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 147 / 151 https://jump.dev/JuMP.jl/v0.19.0/index.html Pacotes especiais � otimização Otimização em problemas mais gerais Construimos o modelo (previamente rodar o solver de otimização não-linear restrito Ipopt): m = Model(solver=IpoptSolver()) Em seguida de�nir as variáveis, restrições e função-objetivopor 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) Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 148 / 151 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 ** Solução ótima = [0.49239864764413, -0.4918893479728] Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 149 / 151 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. 718�730, 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. 65�98, 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. Packt Publishing, 2015. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 150 / 151 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. Springer Science & Business Media, 2006. Angelo Aliano Filho (UTFPR) Linguagem Julia 2021/1 151 / 151 Instalação e introdução Operações matemáticas Vetores e matrizes Plotando gráficos Functions Estruturas de repetição Pacotes especiais
Compartilhar