Introdução à Linguagem Julia

Julia é uma linguagem dinâmica de alto nível e alto desempenho. Ela se assemelha ao MatLab e ao Python na facilidade de escrita de código, mas sua velocidade pode ser comparável ao C e Fortran.

A versão mais atual do Julia é a 1.3.

Jupyter

O Jupyter é uma interface web para Julia, Python, R (daí o nome Ju[lia], py[thon], R) e muitas outras. Ela não é o Julia, isto é, o Julia não depende do Jupyter para funcionar. No entanto, usando o Jupyter, aulas e apresentações ficam mais práticas.

Cada célula do Jupyter pode ser executada com um ctrl+enter, ou um ctrl+shift, sendo que o último move a seleção para a célula de baixo. Você pode adicionar novas células usando o + no topo da página.

O REPL - Terminal Interativo

Ao abrir o Julia no Windows, ou digitar julia no terminal do Mac ou Linux, se abrirá um prompt tipo

julia>

O Jupyter também serve como esse prompt e todo comando digitado aqui pode ser digitado lá.

Editor: JunoLab ou Atom

JunoLab é o editor oficial de Julia. Você pode usar outros editores, mas o suporte à caracteres especiais é quase que exclusivo de um punhado. Em especial, o JunoLab é um dos melhores para isso.

O JunoLab é feito em cima do Atom. Você pode baixar o Atom e instalar os pacotes específicos, se preferir ter mais controle.

Jupyter vs Editor

O Jupyter é utilizado para aulas, apresentações, workshops. A parte importante é a interatividade.

O editor é usado para fazer códigos sérios. Para desenvolver os exercícios, projetos, e futuros pacotes, é necessário criar arquivos e ter um ambiente adequado.

Ajuda

É bastante fácil encontrar ajuda para vários comandos de julia na internet. Use e abuse do google. Entretanto, um bom guia rápido é esta página, uma via rápido para julia.


In [6]:
using Random
Random.seed!(0) # Para controle pessoal. Ignorar


Out[6]:
MersenneTwister(UInt32[0x00000000], Random.DSFMT.DSFMT_state(Int32[748398797, 1073523691, -1738140313, 1073664641, -1492392947, 1073490074, -1625281839, 1073254801, 1875112882, 1073717145  …  943540191, 1073626624, 1091647724, 1073372234, -1273625233, -823628301, 835224507, 991807863, 382, 0]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], UInt128[0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000  …  0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000], 1002, 0)

Básico

Aprenderemos aqui alguns comandos básicos de Julia


In [7]:
2 + 3


Out[7]:
5

In [8]:
3 * 5


Out[8]:
15

In [9]:
7 ^ 3


Out[9]:
343

In [10]:
exp(2)


Out[10]:
7.38905609893065

In [11]:
sin(3.14159/4)


Out[11]:
0.7071063120935576

In [12]:
pi


Out[12]:
π = 3.1415926535897...

In [13]:
sin(pi/4)


Out[13]:
0.7071067811865475

In [14]:
round(1.2)


Out[14]:
1.0

In [15]:
abs(-3)


Out[15]:
3

In [16]:
x = 3


Out[16]:
3

In [17]:
x ^ 2


Out[17]:
9

In [18]:
y = 2x


Out[18]:
6

In [19]:
y - x


Out[19]:
3

In [20]:
1e-2 # 10⁻²


Out[20]:
0.01

In [21]:
1e3 # 10³


Out[21]:
1000.0

In [22]:
0.1 + 0.2 - 0.3


Out[22]:
5.551115123125783e-17

Álgebra Linear Numérica

Para acessar alguns comandos é necessário chamarmos módulos ou pacotes do Julia. Muitas vezes é necessário instalar algum pacote adicional. Para tanto, usamos o comando using.

Por exemplo para podermos acessar alguns comandos necessários para Álgebra Linear Numérica chamamos o pacote LinearAlgebra e para usar comandos relacionados a números aleatórios o pacote Random.


In [23]:
# Para usar comandos de Álgebra Linear
using LinearAlgebra
# Para usar comandos de aleatoriedade
using Random

In [24]:
rand(3)


Out[24]:
3-element Array{Float64,1}:
 0.8236475079774124 
 0.9103565379264364 
 0.16456579813368521

In [25]:
ones(3)


Out[25]:
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

In [26]:
zeros(3)


Out[26]:
3-element Array{Float64,1}:
 0.0
 0.0
 0.0

In [27]:
rand(2,4)


Out[27]:
2×4 Array{Float64,2}:
 0.177329  0.203477   0.0682693  0.973216
 0.27888   0.0423017  0.361828   0.585812

In [28]:
v = rand(3)


Out[28]:
3-element Array{Float64,1}:
 0.5392892841426182 
 0.26003585026904785
 0.910046541351011  

In [29]:
A = rand(2, 3)


Out[29]:
2×3 Array{Float64,2}:
 0.167036  0.575887  0.9678 
 0.655448  0.868279  0.76769

In [30]:
A * v


Out[30]:
2-element Array{Float64,1}:
 1.1205748345978757
 1.277893829796319 

In [31]:
w = rand(2)


Out[31]:
2-element Array{Float64,1}:
 0.46930370935301835
 0.06236755817015882

In [32]:
A' * w


Out[32]:
3-element Array{Float64,1}:
 0.11926942265451293
 0.3244185135075323 
 0.502070891896173  

In [33]:
B = rand(2, 3)


Out[33]:
2×3 Array{Float64,2}:
 0.353129  0.043141  0.0668464
 0.767602  0.267985  0.156637 

In [34]:
A + B


Out[34]:
2×3 Array{Float64,2}:
 0.520165  0.619028  1.03465 
 1.42305   1.13626   0.924327

In [35]:
A * B'


Out[35]:
2×2 Array{Float64,2}:
 0.148524  0.434139
 0.320233  0.856057

In [36]:
A' * B


Out[36]:
3×3 Array{Float64,2}:
 0.562109  0.182856  0.113833
 0.869855  0.25753   0.1745  
 0.931038  0.247481  0.184942

In [37]:
A = rand(3, 3)
b = rand(3)
x = A\b # Resolve o SL


Out[37]:
3-element Array{Float64,1}:
  0.9777840990959168
 -0.704457336499003 
  0.7343813824094813

In [38]:
A * x - b # É pra ser zero (ou quase)


Out[38]:
3-element Array{Float64,1}:
 -4.163336342344337e-17
 -5.551115123125783e-17
  0.0                  

In [39]:
norm(A*x-b) # norm = ‖ ⋅ ‖


Out[39]:
6.938893903907228e-17

In [40]:
v = [1.0; 2.0; 3.0]
w = [2.0; -2.0; 2.0]
dot(v, w) # ⟨v,w⟩


Out[40]:
4.0

In [41]:
det(A)


Out[41]:
0.28017349071272585

In [42]:
A^2 # A * A


Out[42]:
3×3 Array{Float64,2}:
 0.590834  0.914645  0.870025
 0.765794  0.768688  0.861552
 1.27754   1.56322   1.29784 

In [43]:
A .^ 2 # Cada elemento de A ao quadrado


Out[43]:
3×3 Array{Float64,2}:
 0.366384   0.836698  0.0143167
 0.0184266  0.090045  0.588396 
 0.702441   0.522512  0.643081 

In [44]:
cos.(v) # Calcula o cosseno de cada elemento de v


Out[44]:
3-element Array{Float64,1}:
  0.5403023058681398
 -0.4161468365471424
 -0.9899924966004454

In [45]:
B = rand(3, 3)


Out[45]:
3×3 Array{Float64,2}:
 0.951691  0.114269   0.104823
 0.801119  0.0795545  0.838075
 0.124323  0.776674   0.184115

In [46]:
A .* B


Out[46]:
3×3 Array{Float64,2}:
 0.576055  0.104523   0.0125423
 0.108747  0.0238723  0.642862 
 0.104197  0.561419   0.147646 

Acesso aos elementos


In [47]:
v


Out[47]:
3-element Array{Float64,1}:
 1.0
 2.0
 3.0

In [48]:
v[1]


Out[48]:
1.0

In [49]:
v[2]


Out[49]:
2.0

In [50]:
A


Out[50]:
3×3 Array{Float64,2}:
 0.605297  0.914712  0.119653
 0.135745  0.300075  0.76707 
 0.838118  0.72285   0.801924

In [51]:
A[1,1]


Out[51]:
0.6052967398293401

In [52]:
A[2,3]


Out[52]:
0.7670696322682211

In [53]:
v[1:2]


Out[53]:
2-element Array{Float64,1}:
 1.0
 2.0

In [54]:
A[:,2]


Out[54]:
3-element Array{Float64,1}:
 0.9147120238969264 
 0.30007495800798534
 0.7228497594213787 

In [55]:
A[1,:]


Out[55]:
3-element Array{Float64,1}:
 0.6052967398293401
 0.9147120238969264
 0.1196525672223625

In [56]:
A[2,3] = 0.0


Out[56]:
0.0

In [57]:
A


Out[57]:
3×3 Array{Float64,2}:
 0.605297  0.914712  0.119653
 0.135745  0.300075  0.0     
 0.838118  0.72285   0.801924

In [59]:
m, n = size(A)


Out[59]:
(3, 3)

In [60]:
length(v)


Out[60]:
3

Matriz por blocos - concatenação

Você pode montar matrizes por blocos concatenando Matrizes e vetores de dimensões compatíveis.

Para usar Matriz identidade, use o comando I, que se ajusta a qualquer tamanho vetor e contexto.


In [147]:
I*v


Out[147]:
6-element Array{Float64,1}:
 1.0
 1.0
 1.0
 1.0
 1.0
 1.0

In [152]:
[rand(3,3) zeros(3,2); rand(2,3) I]


Out[152]:
5×5 Array{Float64,2}:
 0.153504  0.310106  0.238476  0.0  0.0
 0.860951  0.455955  0.823485  0.0  0.0
 0.910171  0.649583  0.369335  0.0  0.0
 0.916117  0.557537  0.537944  1.0  0.0
 0.502476  0.973393  0.242003  0.0  1.0

Funções


In [62]:
f(x) = x^2
f(2)


Out[62]:
4

In [63]:
f(-3)


Out[63]:
9

In [64]:
g(a,b) = exp(a + b)


Out[64]:
g (generic function with 1 method)

In [65]:
g(2,3)


Out[65]:
148.4131591025766

In [66]:
g(3,-3)


Out[66]:
1.0

In [67]:
h = x -> sin(x)


Out[67]:
#3 (generic function with 1 method)

In [68]:
h(2)


Out[68]:
0.9092974268256817

In [69]:
function aprox_der(f, a, h)
    (f(a+h) - f(a))/h
end


Out[69]:
aprox_der (generic function with 1 method)

In [70]:
aprox_der(h, pi/6, 1e-8)


Out[70]:
0.8660254013914681

In [71]:
function aprox_der(f, a, h = 1e-8)
    (f(a+h) - f(a))/h
end


Out[71]:
aprox_der (generic function with 2 methods)

In [72]:
aprox_der(h, pi/6)


Out[72]:
0.8660254013914681

In [73]:
aprox_der(x->x^2+3x+2, 2) # 2x + 3 com x = 2: 7


Out[73]:
6.999999868639861

Exercício

Escreva uma função usando function que recebe uma função f, um valor a, um valor b, e retorna a * f(b).


In [ ]:
# Escreva aqui sua função
function minhafunc()
        
end

Vetor vs Array vs Array 1xN vs Array Nx1


In [74]:
ones(3)


Out[74]:
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

In [75]:
[1.0 1.0 1.0]


Out[75]:
1×3 Array{Float64,2}:
 1.0  1.0  1.0

In [76]:
[1.0; 1.0; 1.0]


Out[76]:
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

In [77]:
[1.0, 1.0, 1.0]


Out[77]:
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

In [78]:
[1.0 1.0 1.0]'


Out[78]:
3×1 Adjoint{Float64,Array{Float64,2}}:
 1.0
 1.0
 1.0

In [79]:
ones(3)'


Out[79]:
1×3 Adjoint{Float64,Array{Float64,1}}:
 1.0  1.0  1.0

In [80]:
ones(3)''


Out[80]:
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

Exercícios

  1. Crie um vetor aleatório e mude o primeiro elemento para o seu oposto (i.e. mude o sinal)
  2. Crie um vetor com os ângulos importantes: 0, pi/6, pi/4, pi/3 e pi/2.
  3. Crie um vetor com o seno de cada ângulo e outro com o cosseno, usando o vetor acima.
  4. Calcule a tangente de cada angulo usando os dois vetores acima (tan = sen/cos)
  5. Crie uma função que recebe uma matriz A e um vetor v e retorna $\dfrac{\langle v, Av\rangle}{\langle v, v\rangle}$

In [ ]:
# Exercício 1

In [ ]:
# Exercícios 2

In [ ]:
# Exercícios 3

In [ ]:
# Exercícios 4

In [ ]:
# Exercícios 5

Loops e condicionais


In [81]:
collect(1:5)


Out[81]:
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

In [82]:
collect(1:2:5)


Out[82]:
3-element Array{Int64,1}:
 1
 3
 5

In [83]:
collect(0.0:0.1:1.0)


Out[83]:
11-element Array{Float64,1}:
 0.0
 0.1
 0.2
 0.3
 0.4
 0.5
 0.6
 0.7
 0.8
 0.9
 1.0

In [154]:
collect(range(0, 1, length=10))


Out[154]:
10-element Array{Float64,1}:
 0.0               
 0.1111111111111111
 0.2222222222222222
 0.3333333333333333
 0.4444444444444444
 0.5555555555555556
 0.6666666666666666
 0.7777777777777778
 0.8888888888888888
 1.0               

In [85]:
collect(10:-1:1)


Out[85]:
10-element Array{Int64,1}:
 10
  9
  8
  7
  6
  5
  4
  3
  2
  1

In [86]:
for i = 2.0:0.5:3.0
    println(i^2) # Impressão e quebra linha
end


4.0
6.25
9.0

Pedindo ajuda

Para encontrar ajuda para um comando digite?comando. Por exemplo, para o comando println temos


In [87]:
?println


search: println printstyled print sprint isprint

Out[87]:
println([io::IO], xs...)

Print (using print) xs followed by a newline. If io is not supplied, prints to stdout.

Examples

jldoctest
julia> println("Hello, world")
Hello, world

julia> io = IOBuffer();

julia> println(io, "Hello, world")

julia> String(take!(io))
"Hello, world\n"

In [88]:
for i = 1:10
    print(i)
end


12345678910

In [89]:
for i = 1:10
    println("i = $i")
end


i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10

Notação de C

É possível usar a notação do comando printf de C. Basta chamar o pacote Printf.


In [156]:
using Printf
for i = 1:10
    @printf("i = %03d\n", i) # Notação de C
end


i = 001
i = 002
i = 003
i = 004
i = 005
i = 006
i = 007
i = 008
i = 009
i = 010

In [157]:
x = rand(10)
y = zeros(10)
for i = 1:10
    y[i] = x[i] * i
end

In [158]:
y ./ x


Out[158]:
10-element Array{Float64,1}:
  1.0
  2.0
  3.0
  4.0
  5.0
  6.0
  7.0
  8.0
  9.0
 10.0

In [93]:
for x in [0; pi/6; pi/4; pi/3; pi/2]
    println("sin($x) = $(sin(x))")
end


sin(0.0) = 0.0
sin(0.5235987755982988) = 0.49999999999999994
sin(0.7853981633974483) = 0.7071067811865475
sin(1.0471975511965976) = 0.8660254037844386
sin(1.5707963267948966) = 1.0

In [94]:
for i = 3:3:20
    print("$i ")
end


3 6 9 12 15 18 

In [95]:
for i in 3:2:10
    println("$i^2 = $(i^2)")
end


3^2 = 9
5^2 = 25
7^2 = 49
9^2 = 81

In [96]:
Float64[2; 3]


Out[96]:
2-element Array{Float64,1}:
 2.0
 3.0

In [165]:
for x in Any["a", 0, 3.14, exp(1), 3//4, im, ones(2), ones(2,2)]
    println("x: $x    Tipo: $(typeof(x))")
end


x: a    Tipo: String
x: 0    Tipo: Int64
x: 3.14    Tipo: Float64
x: 2.718281828459045    Tipo: Float64
x: 3//4    Tipo: Rational{Int64}
x: im    Tipo: Complex{Bool}
x: [1.0, 1.0]    Tipo: Array{Float64,1}
x: [1.0 1.0; 1.0 1.0]    Tipo: Array{Float64,2}

In [173]:
# Estes comandos vão dar erro
n = 6
v = ones(n)
v[n/2] = 2
v


ArgumentError: invalid index: 3.0 of type Float64

Stacktrace:
 [1] to_index(::Float64) at ./indices.jl:270
 [2] to_index(::Array{Float64,1}, ::Float64) at ./indices.jl:247
 [3] to_indices at ./indices.jl:298 [inlined]
 [4] to_indices at ./indices.jl:295 [inlined]
 [5] setindex!(::Array{Float64,1}, ::Int64, ::Float64) at ./abstractarray.jl:1074
 [6] top-level scope at In[173]:4

In [169]:
n/2


Out[169]:
3.0

In [100]:
div(n,2)


Out[100]:
3

In [172]:
v[div(n,2)]


Out[172]:
1.0

In [101]:
round(Int, n/2)


Out[101]:
3

In [102]:
10 % 4 # Resto da divisão de 10 por 4


Out[102]:
2

Fatorial: $ n! = n(n-1)\dots2. 1 $


In [103]:
function fatorial(n)
    resultado = 1
    for i = 1:n
        resultado = resultado * i
    end
    return resultado
end


Out[103]:
fatorial (generic function with 1 method)

In [104]:
fatorial(4)


Out[104]:
24

In [105]:
fatorial(5)


Out[105]:
120

In [106]:
fatorial(0)


Out[106]:
1

In [107]:
fatorial(4.3)


Out[107]:
24.0

In [108]:
fatorial(-2)


Out[108]:
1

In [176]:
function fatorial2(n :: Int)
    resultado = 1
    for i = 1:n
        resultado = resultado * i
    end
    return resultado
end


Out[176]:
fatorial2 (generic function with 1 method)

In [177]:
fatorial2(4)


Out[177]:
24

In [179]:
fatorial2(3.4)


MethodError: no method matching fatorial2(::Float64)
Closest candidates are:
  fatorial2(!Matched::Int64) at In[176]:2

Stacktrace:
 [1] top-level scope at In[179]:1

sinal: $ \mbox{sinal}(x) = \left\{\begin{array}{rl} 1, & x > 0 \\ -1, & x < 0 \\ 0, & x = 0. \end{array}\right.$


In [180]:
function sinal(x)
    if x > 0
        return 1
    elseif x < 0
        return -1
    else
        return 0
    end
end


Out[180]:
sinal (generic function with 1 method)

In [112]:
sinal(3.2)


Out[112]:
1

In [113]:
sinal(-1.2)


Out[113]:
-1

In [114]:
sinal(0.0)


Out[114]:
0

Bháskara: $ax^2 + bx + c = 0$ e $b^2 - 4ac \geq 0$ implicam em $x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}. $


In [181]:
function bhaskara(a, b, c)
    Δ = b^2 - 4 * a * c
    if Δ < 0
        @error("Nos reais não tem solução")
    end
    return (-b + sqrt(Δ)) / 2a, (-b - sqrt(Δ)) / 2a
end


Out[181]:
bhaskara (generic function with 1 method)

In [182]:
bhaskara(1, 0, -1)


Out[182]:
(1.0, -1.0)

In [183]:
bhaskara(1, 0, 1)


┌ Error: Nos reais não tem solução
└ @ Main In[181]:4
DomainError with -4.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).

Stacktrace:
 [1] throw_complex_domainerror(::Symbol, ::Float64) at ./math.jl:31
 [2] sqrt at ./math.jl:493 [inlined]
 [3] sqrt at ./math.jl:519 [inlined]
 [4] bhaskara(::Int64, ::Int64, ::Int64) at ./In[181]:6
 [5] top-level scope at In[183]:1

In [118]:
bhaskara(1, 0, -1)


Out[118]:
(1.0, -1.0)

In [119]:
bhaskara(0, 1, 1)


Out[119]:
(NaN, -Inf)

MMC: $\mbox{mmc}(a, b)$ é o menor número natural que é múltiplo de $a$ e de $b$.

or -> ||
and -> &&

In [120]:
function mmc(a::Int, b::Int)
    if a < 1 || b < 1
        @error("Entrada deve ser de dois inteiros positivos")
    end
    x = 1
    while a > 1 || b > 1
        achou = false
        for j = 2:max(a,b)
            if a % j == 0 || b % j == 0
                x = x * j
                achou = true
            end
            if a % j == 0
                a = div(a, j)
            end
            if b % j == 0
                b = div(b, j)
            end
            if achou
                break
            end
        end
    end
    return x
end


Out[120]:
mmc (generic function with 1 method)

In [121]:
mmc(2,3)


Out[121]:
6

In [122]:
mmc(5, 7)


Out[122]:
35

In [123]:
mmc(6, 8)


Out[123]:
24

In [124]:
mmc(12, 14)


Out[124]:
84

In [125]:
mmc(-1, 0)


Entrada deve ser de dois inteiros positivos

Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] mmc(::Int64, ::Int64) at ./In[120]:3
 [3] top-level scope at In[125]:1

In [126]:
mmc(2.0, 3.0)


MethodError: no method matching mmc(::Float64, ::Float64)

Stacktrace:
 [1] top-level scope at In[126]:1

Exercício

  • Atualize a função fatorial para proibir números negativos não inteiros. Proíba também o fatorial de um número maior que 21.
  • Atualize a função de Bháskara para que retorne um erro caso $a$ seja 0.
  • Faça uma função que recebe um inteiro n e verifica se ele é primo.

Arquivos

A aula de arquivos deve ser feira fora do Jupyter para melhor entendimento. Use:

  • Atom/JunoLab para edição;
  • o terminal do Julia.

Dentro do terminal, use

include("arquivo.jl")

para incluir um arquivo e rodar todo seu conteúdo.

O arquivo precisa estar na mesma pasta. Se não estiver você tem duas opções:

  • Navegar até a pasta corresponde, usando o comando cd; ou
  • incluir o arquivo passando o caminho inteiro: include("~/Desktop/arquivo.jl"). (~ em Linux quer dizer diretório pessoal padrão - em geral /home/fulano/.

Pacotes

O Julia não vem com tudo pré-instalado, assim como a maioria das linguagem de programação. Para encontrar um pacote que faça o que você quer, você pode buscar na lista http://pkg.julialang.org/ ou no Google.

Instalação de pacotes

Caso o pacote que você encontrou seja indexado, basta usar os comandos using Pkg, Pkg.add("Pacote"). A indexação depende do criador do pacote. Os principais pacotes estão indexados. Por exemplo:

  • Pacote Plots: comandos unificados de fazer gráficos.
  • Pacote PyPlot: para desenhar gráficos usando o matplotlib. Bonito, mas lento e demorado de instalar.
  • Pacote GR: outro pacote para desenhar gráficos. Mais rápido, mas menos bonito.
  • Pacote Primes: pacote para trabalhar com números primos.
  • Pacote Combinatorics: pacote para funções de combinátoria.

Se você estiver usando o Julia no terminal, então clicando em ] você abre o administrador de pacotes

julia> ]
(v1.2) pkg>

Plots

Utilizaremos os pacotes Plots e PyPlot para fazer nossos gráficos. Caso prefira o GR, mude o comando pyplot logo abaixo por gr.

Para o help dos gráficos, veja Julia Plots.


In [185]:
using Pkg; Pkg.add("Plots") #Isso só necessário na primeira vez que instalamos
using Plots
pyplot(size=(400,300)) # ou gr()


  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
[1mFetching: [========================================>]  99.9 %0.0 %Fetching: [======>                                  ]  13.2 % [===========>                             ]  26.2 %39.4 %======================>                  ]  53.9 %54.3 %>            ]  68.9 % Resolving package versions...
 Installed PositiveFactorizations ─ v0.2.3
 Installed JuliaFormatter ───────── v0.1.19
 Installed ForwardDiff ──────────── v0.10.5
 Installed DataStructures ───────── v0.17.5
 Installed QuadGK ───────────────── v2.1.1
 Installed GitHub ───────────────── v5.1.3
 Installed Optim ────────────────── v0.19.4
 Installed Parsers ──────────────── v0.3.8
 Installed Interpolations ───────── v0.12.4
  Updating `~/.julia/environments/v1.2/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.2/Manifest.toml`
  [864edb3b] ↑ DataStructures v0.17.4 ⇒ v0.17.5
  [f6369f11] ↑ ForwardDiff v0.10.3 ⇒ v0.10.5
  [bc5e4493] ↑ GitHub v5.1.1 ⇒ v5.1.3
  [a98d9a8b] ↑ Interpolations v0.12.3 ⇒ v0.12.4
  [98e50ef6] ↑ JuliaFormatter v0.1.17 ⇒ v0.1.19
  [429524aa] ↑ Optim v0.19.3 ⇒ v0.19.4
  [69de0a69] ↑ Parsers v0.3.7 ⇒ v0.3.8
  [85a6dd25] ↑ PositiveFactorizations v0.2.2 ⇒ v0.2.3
  [1fd47b50] ↑ QuadGK v2.0.3 ⇒ v2.1.1
Out[185]:
Plots.PyPlotBackend()

In [186]:
plot([1; 2; 3], [3; 1; 2]) # plot(x, y)


Out[186]:

In [192]:
x = range(0, 1, length=100) # 100 elementos igual. esp. de 0 a 1
y = x.^2
plot(x, y)


Out[192]:

In [200]:
scatter(x, 4 * x .* (1 .- x)) #note uso do .* e .-


Out[200]:

In [201]:
scatter(x, rand(100))


Out[201]:

In [202]:
f(x) = x * sin(x)
plot(f, 0, 4pi) # plot(f, a, b)


Out[202]:

In [204]:
# Definindo função inline
plot(x->exp(x) * x, -1, 1)


Out[204]:

In [205]:
plot!(x->exp(-x), -1, 1)


Out[205]:

In [206]:
xlims!(-0.5, 0.5)


Out[206]:

In [207]:
ylims!(0.5, 1.5)


Out[207]:

In [208]:
t = range(-2, 3, length=200)
x = cos.(t*pi*2) .* exp.(t)
y = sin.(t*pi*2) .* exp.(t)
plot(x, y)


Out[208]:

In [209]:
plot(sin, 0, 2pi, label="sin")
plot!(cos, 0, 2pi, label="cos", c = :magenta)
plot!(x->1, 0, 2pi, c=:red, l=:dash, label="")
plot!(x->-1, 0, 2pi, c=:red, l=:dash, label="")
ylims!(-1.2, 1.2)


Out[209]:

In [139]:
xticks!(0:pi/2:2pi)


Out[139]:

In [140]:
xticks!(0:pi/2:2pi, ["0", "\\pi /2", "\\pi", "3\\pi/2", "2\\pi"])


Out[140]:

In [210]:
x = range(0, 2*pi, length=100)
anim = Animation()
for i = 1:5:100
    plot(x[1:i], sin.(x[1:i]))
    frame(anim)
end
gif(anim, "exemplo.gif", fps=10)


┌ Info: Saved animation to 
│   fn = /Users/lrsantos/Dropbox/UFSC/Docência/Ensino/Materiais/algebra_linear/exemplo.gif
└ @ Plots /Users/lrsantos/.julia/packages/Plots/Iuc9S/src/animation.jl:95
Out[210]:

In [211]:
x = range(0, 2*pi, length=100)
anim = Animation()
for i = 1:3:100
    plot(x[1:i], sin.(x[1:i]))
    xlims!(x[1], x[end])
    ylims!(-1, 1)
    frame(anim)
end
gif(anim, "exemplo2.gif", fps=12)


┌ Info: Saved animation to 
│   fn = /Users/lrsantos/Dropbox/UFSC/Docência/Ensino/Materiais/algebra_linear/exemplo2.gif
└ @ Plots /Users/lrsantos/.julia/packages/Plots/Iuc9S/src/animation.jl:95
Out[211]:

In [218]:
x = range(0, 2*pi, length=100)
anim = Animation()
for i = 1:3:100
    plot(x, sin.(x), leg=false)
    a = x[i]
    scatter!([a], [sin(a)], c=:red)
    plot!(x, sin(a) .+ cos(a) * (x .- a), c=:red, l=:dash)
    xlims!(x[1], x[end])
    ylims!(-2, 2)
    frame(anim)
end
gif(anim, "exemplo3.gif", fps=12)


┌ Info: Saved animation to 
│   fn = /Users/lrsantos/Dropbox/UFSC/Docência/Ensino/Materiais/algebra_linear/exemplo3.gif
└ @ Plots /Users/lrsantos/.julia/packages/Plots/Iuc9S/src/animation.jl:95
Out[218]:

Exercícios

  1. Crie uma função que resolve $ax^2 + bx + c = 0$ por Bháskara, mas se $\Delta < 0$, ele retorna as soluções complexas.
  2. Faça uma função para calcular o máximo dividor comum de dois números inteiros positivos.
  3. Crie um vetor x aleatório, e crie y = 2x + 3. Crie um plot e depois um scatter de x vs y. Qual a diferença?
  4. Faça o gráfico de $e^x$ no intervalo [-1,1] em vermelho.
  5. Faça no mesmo gráfico os gráficos de $1$, $1+x$ e $1+x+0.5x^2$ em azul, com linha pontilhada.