println("¡Hola Julia!")
¡Hola Julia!
Seminario de Innovación Docente
Universidade da Coruña
21 de julio de 2023
Julia un lenguaje de programación moderno creado en 2012 el MIT por el equipo del profesor Edelman, orientado a cálculo científico y el análisis de datos.
De los creadores de Julia:
We want a language that is:
- Open source.
- With the speed of C.
- Obvious, familiar mathematical notation like Matlab.
- As usable for general programming as Python.
- As easy for statistics as R.
- As natural for string processing as Perl.
- As powerful for linear algebra as Matlab.
- As good at gluing programs together as the shell.
- Dirt simple to learn, yet keeps the most serious hackers happy.
Prácticas en el Grado de Ingeniería Matemática
Curso 2022/2023
Curso 2023/2024
Curso 2024/2025
Lenguaje de alto nivel con una sintaxis fácil de aprender (similar a Python, R o Matlab).
Julia es un lenguaje muy veloz (equiparable a C o Fortran en muchas tareas).
La razón por la que Julia es tan rápido es por que usa despacho múltiple para precompilar distintas versiones de una misma función para cada posible tipo de dato de sus argumentos.
La sintaxis de Julia es similar a la de lenguajes como Python o MATLAB, y en algunos casos es incluso más concisa, por lo que la transición de estos lenguajes a Julia es fácil.
Tipo | Signo | Bits | Min | Max |
---|---|---|---|---|
Int8 | ✓ | 8 | \(-2^7\) | \(2^7-1\) |
UInt8 | 8 | \(0\) | \(2^8-1\) | |
Int16 | ✓ | 16 | \(-2^{15}\) | \(2^{15}-1\) |
UInt16 | 16 | \(0\) | \(2^{16}-1\) | |
Int32 | ✓ | 32 | \(-2^{31}\) | \(2^{31}-1\) |
UInt32 | 32 | \(0\) | \(2^{32}-1\) | |
Int64 | ✓ | 64 | \(-2^{63}\) | \(2^{63}-1\) |
UInt64 | 64 | \(0\) | \(2^{64}-1\) | |
Int128 | ✓ | 128 | \(-2^{127}\) | \(2^{127}-1\) |
UInt128 | 128 | \(0\) | \(2^{128}-1\) | |
Bool | N/A | 8 | false (0) | true (1) |
Tipo | Bits | Min | Max | ||
---|---|---|---|---|---|
Float16 | 16 | \(-6.55e4\) | \(6.55e4\) | ||
Float32 | 32 | \(-3.4028235e38\) | \(3.4028235e38\) | ||
Float64 | 64 | \(-1.7976931348623157e308\) | \(1.7976931348623157e308\) |
Tipo | Min positive | Epsilon |
---|---|---|
Float16 | \(6.104e-5\) | \(0.000977\) |
Float32 | \(1.1754944f-38\) | \(1.1920929f-7\) |
Float64 | \(2.2250738585072014e-308\) | \(2.220446049250313e-16\) |
BigInt
permite representar enteros de cualquier tamaño.BigFloat
permite representar reales de cualquier tamaño y precisión.El límite lo marca la memoria del ordenador.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412736
La constante im
está asociada al número complejo \(i=\sqrt{-1}\).
Siempre se promociona hacia el tipo más general.
Vectores
Matrices
Tuplas
Los tipos compuestos incluyen parámetros que determinan el tipo de sus elementos.
Es fácil definir nuevos operadores.
Julia admite múltiples formas de definir funciones.
Tradicional. Similar a otros lenguajes de programación.
En línea. Muy cómoda para definir funciones matemáticas.
Funciones anónimas. Se utilizan sobre todo en programación funcional, como argumentos de otras funciones.
Las funciones son objetos que pueden asignarse o pasarse como argumentos de otras funciones.
El operador punto .
permite aplicar una función u operador a los elementos de una colección (arrays, vectores, tuplas, etc.)
Julia permite caracteres Unicode lo que facilita la expresión de fórmulas matemáticas.
Para ello se utilizan códigos especiales (en muchos casos son los mismos que en \(\LaTeX\)), pulsando después la tecla de tabulación.
El operador ∘
permite componer funciones.
También puede realizarse con el operador de tubería |>
(similar a %>% en R).
El paquete Latexify
permite obtener el código \(\LaTeX\) para representar cualquier expresión matemática.
Quarto es un sistema de publicación de textos científicos y técnicos de alta calidad basado en Markdown y \(\LaTeX\) (similar a RMarkdown).
Julia es uno de los lenguajes de programación que admite.
Lenguaje de propósito general, pero especialmente diseñado para el cálculo científico y el análisis de datos.
El paquete Plots
permite la representación gráfica de funciones con diversos tipos de diagramas.
The WebIO Jupyter extension was not detected. See the WebIO Jupyter integration documentation for more information.
Existen dos paquetes para cálculo simbólico:
SymPy
: Basado en el paquete sympy
de Phthon. Muy maduro, pero lento.Symbolics
. Paquete puro en Julia muy rápido, pero no tan completo.SymPy
SymPy
SymPy
Symbolics
\[ \begin{equation} \cos\left( x \right) \end{equation} \]
\[ \begin{equation} \cos\left( x \right) \end{equation} \]
Es posible usar también la notación prima f'
sobrecargando el operador adjoin
.
SymPy
\(\left[\begin{smallmatrix}y^{2} e^{x y} & x y e^{x y} + e^{x y}\\x y e^{x y} + e^{x y} & x^{2} e^{x y}\end{smallmatrix}\right]\)
Symbolics
\[ \begin{equation} \left[ \begin{array}{c} y e^{x y} \\ x e^{x y} \\ \end{array} \right] \end{equation} \]
\[ \begin{equation} \left[ \begin{array}{cc} y^{2} e^{x y} & e^{x y} + x y e^{x y} \\ e^{x y} + x y e^{x y} & x^{2} e^{x y} \\ \end{array} \right] \end{equation} \]
SymPy
\(y{\left(x \right)} = C_{1} e^{k x}\)
3-element Vector{ComplexF64}:
-2.5943130163548487 + 0.0im
0.29715650817742467 - 1.205625150602913im
0.29715650817742467 + 1.205625150602913im
10-element interpolate(::Vector{Float64}, BSpline(Linear())) with element type Float64:
0.0
0.6931471805599453
1.0986122886681098
1.3862943611198906
1.6094379124341003
1.791759469228055
1.9459101490553132
2.0794415416798357
2.1972245773362196
2.302585092994046
19-element interpolate(OffsetArray(::Vector{Float64}, 0:20), BSpline(Quadratic(Line(OnGrid())))) with element type Float64:
0.0
0.4054651081081644
0.6931471805599454
0.9162907318741551
1.0986122886681098
1.252762968495368
1.3862943611198908
1.504077396776274
1.6094379124341005
1.7047480922384253
1.791759469228055
1.8718021769015913
1.9459101490553135
2.0149030205422642
2.079441541679836
2.1400661634962708
2.1972245773362196
2.2512917986064953
2.302585092994046
3-element Vector{Float64}:
-3.141592653589793
0.0
3.141592653589793
retcode: Default
u: 3-element Vector{Float64}:
3.0
2.0
1.0
using NLsolve
f(x, y) = [(x+3)*(y^3-7)+18, sin(y*exp(x)-1)]
f(x) = [(x[1]+3)*(x[2]^3-7)+18, sin(x[2]*exp(x[1])-1)]
nlsolve(f, [ 0.1, 1.2])
Results of Nonlinear Solver Algorithm
* Algorithm: Trust-region with dogleg and autoscaling
* Starting Point: [0.1, 1.2]
* Zero: [-7.775548712324193e-17, 0.9999999999999999]
* Inf-norm of residuals: 0.000000
* Iterations: 4
* Convergence: true
* |x - x'| < 0.0e+00: false
* |f(x)| < 1.0e-08: true
* Function Calls (f): 5
* Jacobian Calls (df/dx): 5
(0.7834305107121344070592643865269751743063670117483685034318247197232693913877173, 7.736858106873745132469365322882480666696649544982787019412483807349385217202092e-31)
Al precompilar cualquier función la primera ejecución se demora un poco. Esta demora puede ser significativa en paquetes que incorporan muchas funciones (por ejemplo Plots).
Se puede evitar con el paquete JuliaInterpreter
.
Cuando se excede el mayor valor que puede representarse con un tipo, no se produce un error de desbordamiento, sino que se aplica aritmética modular y se continúa contando a partir del mínimo.
Aunque Julia es un lenguaje de tipado dinámico como Python, no permite redefinir una constante como una variable o viceversa.
Hay que tener en cuenta que las funciones se definen como constantes por lo que no se puede utilizar el mismo nombre para una variable y una función.
^
(y no **
como en Python).&
(conjunción), |
(disyunción) y !
(negación), (y no and
, or
y not
como en Python).*
(y no +
como en Python).inicio:salto:fin
(y no inicio:(fin+1):salto
como en Python).%
(y no el módulo como en Python).im
(y no j
como en Python).