Julia es un lenguaje de propósito general de código abierto,dinámico y de alto rendimiento basado en un compilador avanzado (JIT),que permite que el código se ejecute rápido como si fuera compilado.
Sin embargo,algunas de las caracteristicas mas interesantes de Julia para Ciencias e Ingeniería,son las siguientes:
Sintáxis Matemáticas: Lleva el lenguaje matemático al código de programación similar a como lo realizan software como Mathematica.
Buen desempeño: Tiene un rendimiento similar a lenguajes compilados como C.
Diseño paralelo: Esta desarrollado para la computación paralela y distribuida.
Entre otros...
La última versión descargable de Julia es la versión 1.8.1 y la puedes descargar desde el siguiente enlance Julia.Además puedes instalar algunos Entornos de desarrollo para utilizar Julia como VSCode o incluso puedes utilizar la Suite JupyterLab.Sin embargo en este curso utilizaremos la versión 1.7.3.
x=10
typeof(x)
Int64
y="Proyecto exitoso"
typeof(y)
String
En este caso definimos la variable *x* que almacena el valor 10 y la variable y que almacena el texto "Proyecto exitoso".Luego verificamos el tipo de variable que es cada una,mediante la funcion typeof().
Sin embargo,tal vez una de las características mas importantes de Julia es la existencia de jerarquía en las variables numéricas.De esta forma, es posible transformar un valor entero en formatos de Float64,Float32 o Float16 correspondientes a números de doble,única o la mitad de la precisión.
Float64(2)
2.0
Float32(2)
2.0f0
Float16(2)
Float16(2.0)
Si queremos realizar la operación inversa,transformar una variable float en integer,no siempre sera válida debido a la jerarquía en las variables.Es por esto que es preferible utilizar funciones como ceil(),floor() o round().
Si consideramos el siguiente caso
Int64(2.4)
Nos lanzara un error,ya que no se puede transformar a valor entero el decimal 2.4.Para esto preferimos utilizar la siguientes funciones.
floor(Int64,2.4)
2
ceil(Int64,2.4)
3
round(Int64,2.4)
2
En los 3 casos estamos transformando el mismo valor decimal,sin embargo la función determina si se redondea al valor mas cercano hacia abajo o hacia arriba.
Uno de los aspectos mas importantes en la mayoría de los lenguajes, son los ciclos o loops para el desarrollo de iteraciones en distintos contextos,ya sea recorrer los valores en una lista o matriz,iterar una función, imprimir mensajes por pantalla con alguna variable que cambia de valor,entre otros aspectos.
Uno de los primeros puntos que podemos ver es la sintáxis,la cual es muy similar a lenguajes como Matlab o R,en donde usamos la funcion println(),ya que nos permite imprimir cada valor de i en una nueva línea.
for i in 1:10
println(i)
end
1 2 3 4 5 6 7 8 9 10
En caso contrario si usamos en Julia la funcion print() obtenemos la misma secuencia pero se imprimen todos los valores en la misma línea.
for i in 1:10
print(i)
end
12345678910
Sin embargo, el ciclo for tambien puede recorrer otro tipo de estructuras de datos o variables.En algunos casos podriamos querer recorrer los valores en un vector previamente definido
for i in [10,20,30,40,50]
println(i)
end
10 20 30 40 50
O incluso podriamos recorrer uno a uno los caracteres en una cadena de texto... cualquier parecido con la realidad es mera coincidencia. 👀
for i in "Lunes"
println(i)
end
L u n e s
Afortunadamente no solo existe el ciclo for para realizar iteraciones.Sino que también podemos hacer uso del ciclo *while*,el cual tiene una sintáxis un poco mas breve,pero que sin embargo debemos tener algunos cuidados.
En este caso el ciclo while se ejecuta siempre que sea cierta la condición lógica,pero en el caso que la condición logica deje de ser verdadera se ejecuta el código que viene despues de la palabra reservada end
Una sintáxis clásica es el homólogo del ciclo for.
i = 1
while i <= 10
println(i)
i=i+1
end
1 2 3 4 5 6 7 8 9 10
En este caso a diferencia del ciclo for,primero tenemos que inicializar la variable i,para luego definir la condición lógica, en este caso mientras i sea menor o igual que 10 se debe imprimir las instrucciones que se encuentran en el bloque.Luego definimos 2 instrucciones,primero que se imprima el valor de i para luego redefinir el valor de i como i=i+1,asi de esta forma en cada iteración el valor de i va aumentando en 1.🪃
Uno de los principales cuidados que debemos tener al utilizar el ciclo While,es que mientras la condición lógica sea verdadera las instrucciones siempre se ejecutan,por tanto si la condición nunca deja de ser verdadera el ciclo se ejecuta de forma indefinida,ocasionando que en el peor de los casos el software se cierre de forma abrupta.Un caso común es el que se muestra en la sintáxis... 🔥
i = 1
while i > 0
println(i)
i=i+1
end
Pero bueno,si necesitamos que la condición si sea la que ya definimos,podriamos hacer uso de dos comandos muy útiles,en este caso break y continue.
Si consideramos el último ciclo while,podriamos hacer que la variable *i* alcance un determinado valor el ciclo termine.
i = 1
while i > 0
if i ==15
break;
end
println(i)
i=i+1
end
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Afortunadamente resulto bien la sintáxis jajaj... Bueno como pueden ver acá agregamos una condición,en este caso se verifiqua si el valor de *i* llegó a 15,si es el caso entonces el while termina,pero mientras no llegue a ese valor se puede seguir ejecutando.
Y tal vez uno de los favoritos para muchos son los ciclos anidados 🙄.En general cuando hablamos de ciclos anidados hacemos referencia a incluir un ciclo dentro de otro,algo típico que podriamos ver seria lo siguiente.
for i in 1:3
for j=1:3
println("i tiene el valor ",i," y j tiene el valor ",j)
end
end
i tiene el valor 1 y j tiene el valor 1 i tiene el valor 1 y j tiene el valor 2 i tiene el valor 1 y j tiene el valor 3 i tiene el valor 2 y j tiene el valor 1 i tiene el valor 2 y j tiene el valor 2 i tiene el valor 2 y j tiene el valor 3 i tiene el valor 3 y j tiene el valor 1 i tiene el valor 3 y j tiene el valor 2 i tiene el valor 3 y j tiene el valor 3
Aca estamos usando 2 ciclos for.El primero de ellos recorre los valores que puede tomar la variable *i* (1,2,3) y luego el ciclo de adentro recorre los valores que puede tomar la variable *j.De esta forma cuando i* tiene el valor de 1,se recorren todos los valores de j y asi de forma sucesiva con los siguientes valores.
Haciendo uso de ciclos pero esta vez de forma separada,podriamos hacer algo un poco mas matemático.🤓
x=[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]
for i in 1:5
x[i,i]=1
end
for i in 1:5
x[i,-i+6]=1
end
x
5×5 Matrix{Int64}: 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1
Un último importante y no menor,es algo que vimos de forma indirecta en uno de los ciclos anteriormente y corresponde a los condicionales y operadores lógicos.
Los *condicionales* sirven para ejecutar una instrucción siempre que se cumpla una condición.Sin embargo,podemos verificar n condiciones si fuera necesario las cuales las podemos realizar mediante operadores lógicos.
Operador | Descripción | ||
---|---|---|---|
< | Menor a | ||
> | Mayor a | ||
< = | Menor o igual a | ||
>= | Mayor o igual a | ||
== | Igual a | ||
!= | No es igual a | ||
| | Si al menos una es verdadera (o). | ||
|| | Si al menos la primera s verdadera | ||
& | Es Verdadero si todas lo son. | ||
! | Negación | ||
any | Es Verdadero si algun elemento de un arreglo booleano es verdadero. | ||
all | Es verdadero si se cumple que todos los elementos de un arreglo booleano son Verdaderos. | ||
|| | Menor a | ||