A Julia egy open-source (OS), JIT fordított, elsősorban nagy számításigényű feladatok gyors prototipizálására és nagy teljesítményű futtatására.
Tulajdonságai:
Legfontosabb tudnivalók:
ESC
billentyű lenyomásával érhető el, kék csík a cella kijelölése esetén):s
b
az aktuális cella alá, a
az aktuális cella föléd
billentyű lenyomásaz
c
, kivágás: x
, beillesztés az aktuális cella alá: v
l
(kis L), vagy Shift + l
az összes celláray
, nyers kód (nem futtatható): r
, markdown (formázott szöveg): m
Enter
billenytű lenyomásával érhető el, zöld szín):Ctrl + /
Ctrl + Bal egérgomb
Alt + Bal egérgomb
"húzása" (dragging)Shift + Enter
(ez létrehoz egy új cellát, ha nincs hova lépnie)Ctrl + Enter
Jupyter notebook help-jének előhozása: Edit mode-ban h
lenyomásával
Julia help: Kurzorral a függvény nevén állva Shift + Tab
vagy egy cellába ?"fv_név"
beírása és futtatása
String1 = "Ez egy string"
String2 = "és ez egy másik string"
string(String1, ", ", String2)
🐱 = "Ez egy string egy macskafejben tárolva." # \:cat: + TAB
println("Ez mi? $🐱")
Megjegyzés: A Julia megengedi a speciális karakterek használatát, a 😺 erre egy példa.
Speciális karakterek listája
😺 = 1
😀 = 0
😞 = -1
😺 + 😞 == 😀
@show 17 + 7 #Összeadás
@show 333 - 7 #Kivonás
@show 11 * 22 #Szorzás
@show 7/9 #Osztás (ez nem egész (int) lesz: külön típus float)
@show 0.3-0.1-0.2 # float: számábrázolási hiba lehet!!
@show 2^3 # Hatványozás
@show sqrt(2) # Gyökvönás hatványozás segítségével
@show 5e-3 #normálalak e segítségével (vagy 5E-3)
;
String1 = "str_1";
String2 = "str_2";
@show String1*String2
Complex(0.,π)
@show sin(2) #szinusz
@show acos(1)
@show exp(3)
@show exp(π*im)
@show Complex(1,2);
myfavoriteanimals = ("penguins", "cats", "sugargliders")
myfavoriteanimals[1]
myfavoriteanimals[1] = "lions"
Összetartozó adatokat lehet jól kezelni ezzel a struktúrával.
Syntax:
Dict(key1 => value1, key2 => value2, ...)
Egy jó példa erra a telefonkönyv:
myphonebook = Dict("Scooby Doo" => "867-5309", "Ghostbusters" => "555-2368")
myphonebook["Scooby Doo"]
Tömbök, de ennek elemei változtathatóak (ellenben a Tuple-vel), sorrendtartó.
Syntax:
[item1, item2, ...]
Példák:
#String
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
fibonacci = [1, 1, 2, 3, 5, 8, 13]
mixture = [1, 1, 2, 3, "Ted", "Robyn"]
We can also create arrays of other data structures, or multi-dimensional arrays.
numbers = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
rand(4, 3)
for n in 1:10
println(n)
end
n = 0
while n < 10
n += 1
println(n)
end
x, y = 3, 4 # Enter two numbers here!
if x > y
x
else
y
end
(x > y) ? x : y
function f(x)
x^2
end
f2(x) = x^2
f3 = x -> x^2 # Anonim függvény / Lambda függvény
f(42)
f2(42)
f3(42)
"If it quacks like a duck, it's a duck."
A = rand(3, 3)
A
f(A)
Másrészről f
nem működik vektorokra: v^2
forma vektorok esetén nem egyértelműen definiált.
v = rand(3)
f(v)
Konvenció: ha egy függvény neve mögött van egy !
, akkor az a bemenetet megváltoztatja (mutate)
Pl. sort
vs sort!
v = [3, 5, 2]
sort(v)
v
sort!(v)
v
map(f, [1, 2, 3])
map(x -> x^3, [1, 2, 3])
A broadcast
a map
függvény általánosítása
broadcast(f, [1, 2, 3])
A broadcast
rövidítése: .
karakter segítségével
broadcast(f, [1, 2, 3])
ugyanaz, mint
f.([1, 2, 3])
f.([1, 2, 3])
A = [i + 3*j for j in 0:2, i in 1:3]
f(A)
B = f.(A)
A .
szintaktika komplexebb műveletek egymásba fűzését is lehetővé teszik:
C = A .+ 2 .* f.(A) ./ A
A hosszabb formája:
broadcast(x -> x + 2 * f(x) / x, A)
Az elérhető csomagok listája elérhető:
https://pkg.julialang.org/docs/
https://juliaobserver.com/
import Pkg
Pkg.add("Example")
using Example
hello("World")
Pkg.add("Colors")
using Colors
Let's create a palette of 100 different colors
palette = distinguishable_colors(20)
and then we can create a randomly checkered matrix using the rand
command
rand(3, 3)
rand(1:10, 3, 3)
rand(palette, 3, 3)
f(x) = x^2
f(10)
f([1, 2, 3])
foo(x::String, y::String) = println("My inputs x and y are both strings!")
foo("hello", "hi!")
foo(3, 4)
foo(x::Int, y::Int) = println("My inputs x and y are both integers!")
foo(3, 4)
methods(foo)
methods(hello)
methods(+);
@which foo(3, 4)
@which 3.0 + 3.0
@code_native 3.0 + 3.0
xf=1.
xi=1
xf2=Float16(1);
xf-xf2
typeof(xf)
typeof(xf2)
typeof(xf) == typeof(xf2)
typeof(xf2) <: Real <:Number
Statikus elemekkel:
struct MyStruct{T}
a::T
b::Float64
c # Paraméterezés nélkül nem ajánlott!
end
Változtatható elemekkel (csak ha nagyon muszáj):
mutable struct MyStruct{T}
a::T
b::Float64
c # Paraméterezés nélkül nem ajánlott!
end
struct D <: Number
x::Float64
d::Float64
end
D(x::Real) = D(x,1.);
import Base: +,-,*,/,abs,sin,cos,sqrt
import Base:promote_rule, convert, zero
+(d1::D,d2::D) = D(d1.x+d2.x,d1.d+d2.d)
-(d1::D,d2::D) = D(d1.x-d2.x,d1.d-d2.d)
*(d1::D,d2::D) = D(d1.x*d2.x,d1.d * d2.x + d1.x * d2.d)
/(d1::D,d2::D) = D(d1.x/d2.x, (d2.x*d1.d - d1.x*d2.d)/d2.x^2)
abs(d1::D) = D(abs(d1.x), d1.x > 0 ? d1.d : -d1.d)
sin(d1::D) = D(sin(d1.x),cos(d1.x)*d1.d)
cos(d1::D) = D(cos(d1.x),-sin(d1.x)*d1.d)
sqrt(d1::D) = D(sqrt(d1.x),d1.d/2sqrt(d1.x))
convert(::Type{D}, x::Real) = D(x,zero(x))
promote_rule(::Type{D}, ::Type{<:Number}) = D;
zero(::Type{D}) = D(0.,0.)
zero(::D) = zero(D)
D()=zero(D)
using Plots
datagen(t)=sin(2.1 + 2 * cos(3*t))
ts=0:0.1:10.;
its=0:0.01:10.;
data0=datagen.(ts)
data=data0 .+ 0.1*randn(length(ts));
scatter(ts,data)
plot!(ts,data)
plot!(ts,data0)
using LsqFit
# model(t,p;k=3) = sum(p[i]*sin(i*t) + p[i+k]*cos(i*t) for i in 1:k) + p[end]
model(t::AbstractVector,p;k=3) = sum(p[i]*sin.(i*t) + p[i+k]*cos.(i*t) for i in 1:k) .+p[end]
modeld(t::AbstractVector,p;k=3) = sum(i*p[i]*cos.(i*t) - i*p[i+k]*sin.(i*t) for i in 1:k)
k=10
p0=rand(2k+1)
fit = curve_fit((t,p)->model(t,p,k=k), ts, data, p0);
plot(its,model(its,fit.param,k=k),linewidth=3,label="Illesztés",)
scatter!(ts,data,label="\"Mérés\"")
plot!(ts,data0,linewidth=3,color=:green,linealpha=0.4,label="Eredeti")
xd=model(D.(its),fit.param,k=k);
plot(its,getfield.(xd,:x),linewidth=3,label="Illesztés")
plot!(its,getfield.(xd,:d),linewidth=1,label="Derivált (Automatikus)")
plot!(its,modeld(its,fit.param,k=k),linewidth=1,label="Derivált (Függvény)")
# plot!(its,getfield.(datagen.(D.(its)),:d),linewidth=1,label="Derivált (Eredeti)")
sum(abs.(getfield.(xd,:d) .- modeld(its,fit.param,k=k)))
# Sebesség koordináták segítségével
r(φ)=[cos(φ);sin(φ);0.]
@show r(D(π/6,3.))
# Babylonian algorithm
function Babylonian(x; N = 10)
t = (1+x)/2
for i = 2:N; t=(t + x/t)/2 end
t
end
using BenchmarkTools
@show db=Babylonian(D(2))
@show db.d
@show 1/2sqrt(2);
@btime Babylonian($2.0);
@btime Babylonian($D(2.));
@btime sqrt($2.0);
@btime sqrt($D(2))
Ahelyett, hogy D(a,b)
-t ír ki a program, az a + b ϵ
jelölést is lehet használni, ahol ϵ^2 = 0
. (Analóg módon a komplex számokhoz, ahol i^2 = -1
, vagy értelmezhető úgy is, hogy a magasabb rendű O(ϵ)
tagokat elhagyjuk)
A négy fő szabály (ezeket leprogramoztuk a definíció során)
$ (a+b\epsilon) \pm (c+d\epsilon) = (a \pm c) + (b \pm d)\epsilon$
$ (a+b\epsilon) * (c+d\epsilon) = (ac) + (bc+ad)\epsilon$
$ (a+b\epsilon) / (c+d\epsilon) = (a/c) + (bc-ad)/d^2 \epsilon $
Base.show(io::IO,x::D) = print(io,round(x.x,sigdigits=4),x.d < 0 ? " - " : " + ",round(abs(x.d),sigdigits=4)," ε")
r(D(π/6,3.))
Rendes automatikus deriváláshoz a ForwardDiff
/ReverseDiff
csomag használata ajánlott!!!
x = rand(1000);
function sum_global()
s = 0
for i in x
s += i
end
return s
end;
function sum_arg(x)
s = 0
for i in x
s += i
end
return s
end;
function sum_argT(x::Vector{T}) where T
s = zero(T)
for i in x
s += i
end
return s
end;
@time sum_global();
@time sum_arg(x);
@time sum_argT(x);
x=rand(10000000);
@time s1 = sum_global();
@time s2 = sum_arg(x);
@time sum_argT(x);
s1==s2
# @code_warntype sum_arg(x)
# @code_warntype sum_argT(x)
@code_lowered sum_argT(x)
function foo(x::Vector{T}) where T
n=10000
newx=Vector{T}(undef,n)
for i in 1:n
newx[i] = 2*x[i].^3 + sin.(x[i])
end
end
function foo_prealloc(x::Vector{T}) where T
n=10000
newx=[similar(x[1]) for i in 1:n]
for i = 1:n
newx[i] .= 2*x[i].^3 .+ sin.(x[i])
end
return newx
end
myx=[rand(100) for i in 1:10000];
@time foo(myx);
@time foo_prealloc(myx);
struct MyAmbiguousType
a
end
struct MyStillAmbiguousType
a::AbstractFloat
end
struct MyType{T<:AbstractFloat}
a::T
end
function bar(mt)
sin(2.1 + 2 * cos(3*mt.a))
end
testa1=MyAmbiguousType.(rand(10000));
testa2=MyStillAmbiguousType.(rand(10000));
testa3=MyType.(rand(10000));
@time bar.(testa1);
@time bar.(testa2);
@time bar.(testa3);
@code_warntype bar(testa1[1])
println("----------------------")
@code_warntype bar(testa2[1])
println("----------------------")
@code_warntype bar(testa3[1])