= 1 ; y = π ; z = 1//2 ; t = x + y + z x
4.641592653589793
Cours ENPC - Pratique du calcul scientifique
Langage de programmation créé en 2009 au MIT
Par Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman
Version 1.10.2 depuis le 01/03/2024
Documentation générale de Julia
: https://docs.julialang.org/en/v1/
Julia
→ deux optionsjuliaup
installer juliaup
depuis https://github.com/JuliaLang/juliaup
ajouter des versions, par exemple la dernière
PS [path] juliaup add release
Option préconisée : VSCode
https://code.visualstudio.com/
Installer Jupyter
https://jupyter.org/install
Installer la bibliothèque IJulia
→ https://github.com/JuliaLang/IJulia.jl
Voir vidéos de D. Anthoff sur l’utilisation de VSCode
pour Julia
, p. ex. lien 1 ou lien 2
REPL = read–eval–print loop → console de Julia
Le REPL est accessible
de manière autonome en tant qu’exécutable ou en tapant julia
dans une console (si PATH
à jour)
intégré dans VSCode
en tapant Maj+Ctrl+P
puis en cherchant Julia: Start REPL
Dans VSCode
, on peut taper ses lignes de code dans un fichier *.jl
et les lancer une par une dans la console intégrée par Maj+Entrée
.
Depuis le REPL, taper
]
donne accès au gestionnaire de bibliothèques
;
donne accès au shell mode
?
donne accès à l’aide en ligne
⟵
retourne au mode normal
Tab
pour la complétion automatique
les flèches haut et bas pour naviguer dans l’historique (éventuellement filtré par le début de ligne tapé)
Julia
?Julia
est facile à apprendre, à lire et à maintenir
Julia
est rapide
Julia
est efficace
Julia
est bien adapté au calcul scientifique
Julia
est facile à apprendre, à lire et à maintenir1 is a Int64
π is a Irrational{:π}
1//2 is a Rational{Int64}
4.641592653589793 is a Float64
lambda
de python)Bibliothèque de base contient les tableaux et leurs opérations courantes (+
, -
, *
, \
) puis LinearAlgebra
pour det
, eigen
…
Compréhension de tableau (for
dans le tableau)
3×3 Matrix{Float64}:
21.0 12.6 9.0
15.75 10.5 7.875
12.6 9.0 7.0
3-element Vector{Float64}:
1.2000000000000342
3.3999999999998263
5.600000000000162
Julia
est rapideCompilation à la volée (Just-in-time compilation)
Parangonnage (cf. https://julialang.org/benchmarks)
⚠ Ces résultats ne tiennent pas compte du temps de compilation.
The vertical axis shows each benchmark time normalized against the C implementation. The benchmark data shown above were computed with Julia v1.0.0, SciLua v1.0.0-b12, Rust 1.27.0, Go 1.9, Java 1.8.0_17, Javascript V8 6.2.414.54, Matlab R2018a, Anaconda Python 3.6.3, R 3.5.0, and Octave 4.2.2. C and Fortran are compiled with gcc 7.3.1, taking the best timing from all optimization levels (-O0 through -O3). C, Fortran, Go, Julia, Lua, Python, and Octave use OpenBLAS v0.2.20 for matrix operations; Mathematica uses Intel MKL. The Python implementations of matrix_statistics and matrix_multiply use NumPy v1.14.0 and OpenBLAS v0.2.20 functions; the rest are pure Python implementations. Raw benchmark numbers in CSV format are available under https://github.com/JuliaLang/Microbenchmarks.
These micro-benchmark results were obtained on a single core (serial execution) on an Intel Core i7-3960X 3.30GHz CPU with 64GB of 1600MHz DDR3 RAM, running openSUSE LEAP 15.0 Linux.
Julia
est efficaceUn atout majeur est le multiple dispatch
Exemple tiré de la conférence The Unreasonable Effectiveness of Multiple Dispatch de Stefan Karpinski
abstract type Animal end
struct Chien <: Animal; nom::String end
struct Chat <: Animal; nom::String end
function rencontre(a::Animal,b::Animal)
verb = agit(a,b)
println("$(a.nom) rencontre $(b.nom) et $verb")
end
agit(a::Chien,b::Chien) = "le renifle" ; agit(a::Chien,b::Chat) = "le chasse"
agit(a::Chat,b::Chien) = "s'enfuit" ; agit(a::Chat,b::Chat) = "miaule"
medor = Chien("Médor") ; 🐶 = Chien("🐶")
felix = Chat("Félix") ; 🐱 = Chat("🐱")
rencontre(medor,🐶)
rencontre(🐶,felix)
rencontre(felix,🐶)
rencontre(🐱,felix)
Médor rencontre 🐶 et le renifle
🐶 rencontre Félix et le chasse
Félix rencontre 🐶 et s'enfuit
🐱 rencontre Félix et miaule
Exemple adapté du blog de Mosè Giordano
abstract type HandShape end
struct Rock <: HandShape end
struct Paper <: HandShape end
struct Scissors <: HandShape end
play(::Type{Paper}, ::Type{Rock}) = println("Paper VS Rock ⇒ Paper wins")
play(::Type{Scissors}, ::Type{Paper}) = println("Scissors VS Paper ⇒ Scissors wins")
play(::Type{Rock}, ::Type{Scissors}) = println("Rock VS Scissors ⇒ Rock wins")
play(::Type{T}, ::Type{T}) where {T<: HandShape} = println("Tie between $(T), try again")
play(a::Type{<:HandShape}, b::Type{<:HandShape}) = play(b, a) # Commutativity
play(Paper, Rock)
play(Scissors, Scissors)
play(Paper, Scissors)
Paper VS Rock ⇒ Paper wins
Tie between Scissors, try again
Scissors VS Paper ⇒ Scissors wins
Il est aisé d’ajouter de nouveaux types a posteriori
Julia
est bien adapté au calcul scientifique$$
% % %
%
$$
… éq. d’Euler-Lagrange \(\frac{{\mathrm{d}}}{{\mathrm{d}}t}\left(\frac{∂ℒ}{∂\dot{q_i}}\right) -\frac{∂ℒ}{∂q_i}=0\)
…
using SymPy, LinearAlgebra, TensND
Spherical = coorsys_spherical()
θ, ϕ, r = getcoords(Spherical)
𝐞ᶿ, 𝐞ᵠ, 𝐞ʳ = unitvec(Spherical)
@set_coorsys Spherical
𝕀, 𝕁, 𝕂 = ISO() ; 𝟏 = tensId2()
k, μ = symbols("k μ", positive = true)
λ = k -2μ/3
u = SymFunction("u", real = true)
𝛆 = SYMGRAD(u(r) * 𝐞ʳ)
𝛆 |> intrinsic
(u(r)/r)𝐞ᶿ⊗𝐞ᶿ + (u(r)/r)𝐞ᵠ⊗𝐞ᵠ + (Derivative(u(r), r))𝐞ʳ⊗𝐞ʳ
\(u{\left(r \right)} = \frac{C_{1}}{r^{2}} + C_{2} r\)
La documentation officielle → https://docs.julialang.org/en/v1/
Learn X in Y minutes → https://learnxinyminutes.com/docs/julia
Intro to Julia tutorial (version 1.0) by Jane Herriman → https://youtu.be/8h8rQyEpiZA
The Unreasonable Effectiveness of Multiple Dispatch → https://www.youtube.com/watch?v=kc9HwsxE1OY