Juliaは科学技術計算向けに作られたJITで動くプログラミング言語。
このノートは適当にまとめたもの。適宜更新する。
http://bicycle1885.hatenablog.com/entry/2014/12/23/170745
http://docs.juliadiffeq.org/latest/features/callback_functions.html
インストールなどは1つずつ行うこと。同時並行でやってはいけない。
Homebrewのインストール
xxxxxxxxxx/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"pyenvのインストール
xxxxxxxxxxbrew install pyenvAnacondaのインストール
xxxxxxxxxxpyenv install anaconda3-5.0.0Juliaのインストール
xxxxxxxxxxbrew cask install juliaJuliaをREPLで起動して、IJuliaを追加
xxxxxxxxxxjulia xxxxxxxxxxPkg.add("IJulia")exit()インストールされているJuliaの設定ファイルは$HOME/.julia以下。
作業ディレクトリを作成
xxxxxxxxxxmkdir workcd workpyenv local anaconda3-5.0.0jupyter notebookJupyter NotebookでJuliaを使う。
xxxxxxxxxxjupyter notebook --generate-config~/.jupyter以下にJupyterの設定ファイルが生成される。
file.jlの読み込み
xxxxxxxxxxinclude("file.jl") xxxxxxxxxxjulia script.jl arg1 arg2...import ModuleでModuleを読み込み、Module.fn(x)でその関数を使う。using Module でModuleでexportされた関数を全て現在の名前空間にimportする。Juliaはfile.jlに呼び出したいコードを書き、REPLでincludeし、使いながらデバッグする。じゃないとModuleの読み込み時間がかかってしょうがない。
Juliaは起動が遅い。
@で始まるのはJuliaのマクロ呼出し。
xxxxxxxxxxPkg.add("IJulia") # Jupyter Notebookで使えるようにするPkg.add("Plots") # plotPkg.add("GR") # plot backgroundPkg.add("JuMP") # Julia MathProgPkg.add("GLPK") # GNU Linear Programming KitPkg.add("DifferentialEquations") # Differential EquationsPkg.add("Distributions") # Probability Distributions xxxxxxxxxxx = 10変数名にはUTF-8の文字列が使える。
xxxxxxxxxxδ = 0.01こんにちは = "Hello" xxxxxxxxxxprintln("Hello world!") xxxxxxxxxxfor i = 0:9 println(i)end xxxxxxxxxxif a println("a is true")elseif b println("b is true")else println("fulled with false")end xxxxxxxxxxa_and_b = a && ba_or_b = a || bnot_a = !a xxxxxxxxxxtypeof(x) xxxxxxxxxxfunction f(x, y) return x + yend xxxxxxxxxxfunction f(x, y) x + yend xxxxxxxxxxf(x, y) = x + y関数は第1級オブジェクト
xxxxxxxxxxf(x, y) = x + yg = fg(2, 3) 関数名の後ろに!が付くものは引数を変更する。
複数行の文字列
xxxxxxxxxxx = """foobarbuzgegege"""最初の改行文字が取り除かれる。
型指定
xxxxxxxxxxf(x::Float64, y::Float64) = 2x + yf(2.0, 3.0) # 7.0f(2.0, 3) # ERROR: MethodError: no method matching f(::Float64, ::Int64)関数の確認
xxxxxxxxxxjulia> methods(f)# 2 methods for generic function "f"f(x::Float64, y::Float64) in Main at none:1f(x::Number, y::Number) in Main at none:1::による型宣言がない場合、メソッド引数の型はAnyがデフォルトで使われる。Any型はどんな型でも受け入れる。
型Tを省略した場合、デフォルトではFloat64が使われる。
xxxxxxxxxxArray{T}(dims...) # 型Tを要素とするdims次元ArrayArray{T, N}(dims...) # 型Tを要素とするN次元テンソルzeros{T}(dims...) # 型Tを要素とするdims次元零Arrayzeros(A) # Array Aと同じ型・同じ形の零Arrayones{T}(dims...)ones(A)trues(dims...)trues(A)falses(dims...)falses(A)reshape(A, dims...)copy(A)deepcopy(A)similar(A, T, dims...) # Aと同じ型を持つ初期化されていないArrayを作成する。Tまたはdimsが指定されているときはその値になる。指定されていないときはAと同じになる。 xxxxxxxxxx1:0.1:10Juliaは複素数と有理数を扱うことができる。
恒等写像
xxxxxxxxxx+x加法の逆元
xxxxxxxxxx-x足し算
xxxxxxxxxxx + y引き算
xxxxxxxxxxx - y掛け算
x * y
割り算
xxxxxxxxxxx / yy \ x階乗
xxxxxxxxxxx ^ y余り
xxxxxxxxxxx % y xxxxxxxxxxx == y xxxxxxxxxxx != yx ≠ y xxxxxxxxxxx < y xxxxxxxxxxx <= yx ≦ y xxxxxxxxxxx > y xxxxxxxxxxx >= yx ≧ y xxxxxxxxxxInf xxxxxxxxxx-Inf xxxxxxxxxx1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 6 # true xxxxxxxxxxInt8(10.4) # 10 xxxxxxxxxxround(x) # 四捨五入floor(x) # 床関数ceil(x) # 天井関数trunc(x) # 0に向かって丸める xxxxxxxxxxabs(x) # 絶対値abs2(x) # 平方の絶対値sign(x) # sign関数 xxxxxxxxxxsqrt(x) # 平方根√x # 平方根cbrt(x) # 立方根∛x # 立方根 xxxxxxxxxxpi # 円周率π # 円周率e # exp(1) xxxxxxxxxxexp(x)log(x)log(b, x)log2(x)log10(x) xxxxxxxxxxsincostancotseccsc xxxxxxxxxxsinhcoshtanhcothsechcsch xxxxxxxxxxasinacosatanacotasecacscPlots
xxxxxxxxxxPkg.add("Plots")Pkg.add("GR") xxxxxxxxxxusing Plotsgr()plot(randn(100, 3))DifferentialEquations.jlはユーザのコードをアルゴリズムのソルバーに挿入するためにcallback関数を使うことができる。ドキュメントはこちら。
xxxxxxxxxxPkg.add("DifferentialEquations")using DifferentialEquationsprecompilingにはかなり時間がかかる(私の環境で13分)ので気長に待つこと。
0045->0058
callbackの種類は次のように定義されている。ContinuousCallbackとDiscreteCallbackである。ContinuousCallbackは連続条件関数が0になったときに作用される。DiscreteCallbackはcondition関数がtrueのときにapplyされる。
xxxxxxxxxxContinuousCallback(condition,affect!,affect_neg!=affect!; rootfind = true, initialize = (c,t,u,integrator) -> nothing, save_positions = (true,true), interp_points=10, abstol=1e-12,reltol=0 idxs=nothing)決められた条件で微分方程式を解くのを打ち切る。
xxxxxxxxxxcondition(t, u, integrator) = u[1] > 100affect!(integrator) = terminate!(integrator)cb = DiscreteCallback(condition, affect!)sol = solve(prob, callback=cb)多次元配列のサポートに加えて、Juliaは多くの一般的によく使われて便利な線型代数演算のネイティブな実装を提供します。traceやdet、invのような基礎的な演算は全てサポートしています。
xxxxxxxxxxjulia> A = [1 2 3; 4 1 6; 7 8 1]3×3 Array{Int64,2}: 1 2 3 4 1 6 7 8 1julia> trace(A)3julia> det(A)104.0julia> inv(A)3×3 Array{Float64,2}: -0.451923 0.211538 0.0865385 0.365385 -0.192308 0.0576923 0.240385 0.0576923 -0.0673077固有値や固有ベクトルを求めるような他の便利な演算についてもです。
xxxxxxxxxxjulia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]3×3 Array{Float64,2}: 1.5 2.0 -4.0 3.0 -1.0 -6.0 -10.0 2.3 4.0julia> eigvals(A)3-element Array{Complex{Float64},1}: 9.31908+0.0im -2.40954+2.72095im -2.40954-2.72095imjulia> eigvecs(A)3×3 Array{Complex{Float64},2}: -0.488645+0.0im 0.182546-0.39813im 0.182546+0.39813im -0.540358+0.0im 0.692926+0.0im 0.692926-0.0im 0.68501+0.0im 0.254058-0.513301im 0.254058+0.513301imそれに加えて、Juliaは多くの因子化を提供します。
要素積.*
行列の積*
Julia MathProg
https://github.com/JuliaOpt/JuMP.jl/blob/master/docs/src/quickstart.md
xxxxxxxxxxPkg.add("JuMP")Pkg.add("GLPKMathProgInterface")UnitRange{T}
M-element Array{T, N}
Tuple{T, T, …, T}
xxxxxxxxxxabstract Numberabstract Real <: Numberabstract AbstractFloat <: Realabstract Integer <: Realabstract Signed <: Integerabstract Unsigned <: Integer<:演算子は型について数学でいうところのを意味する。
xxxxxxxxxxjulia> Integer <: Numbertruejulia> Integer <: AbstractFloatfalseAbstract型の重要な使い方は、具体的な型の代わりに関数の引数の型を制限するときなどである。
コンストラクタは新しいオブジェクトを作る関数である。特に、合成した型の実体を作るときなどに使われる。Juliaでは、型オブジェクト自体がコンストラクタ関数として使える。型オブジェクトはタプル引数が与えられたときに、関数として新しい実体を作る。これは、合成型の説明をした時に既に言及した。例えばこんな感じである。
xxxxxxxxxxtype Foo bar bazendjulia> foo = Foo(1,2)Foo(1,2)julia> foo.bar1julia> foo.baz2多くの型では、
マクロの呼び出しは@hogehogeである。
マクロ構文は
xxxxxxxxxxmacro sayhello() return :( println("Hello, world!") )end@timeで実行にかかった時間を測れる。
@inbounds, @boundscheck
@profile
@code_typed
Base.Test.@test
@shorthands
@vectorize_1arg
@.
f.(x)によりベクトル関数が作れる。
xxxxxxxxxxjulia> A = [1.0, 2.0, 3.0]3-element Array{Float64,1}: 1.0 2.0 3.0julia> sin.(A)3-element Array{Float64,1}: 0.8414709848078965 0.9092974268256817 0.1411200080598672Heatmapというのは行列の値に応じて色でプロットするようなやつである。
Pkg.add("Plotly")でエラー
Pkg.buld("HttpParser")がエラー
説明書はREPLまたはIJulia中で?を関数やマクロの前に打ってEnterを押すことによって見ることができる。例えば、
xxxxxxxxxx?fft??r""とすれば、関係する関数やマクロ、文字列マクロの説明書が表示される。Junoでは、Ctrl-J, Ctrl-Dによりカーソル下のオブジェクトの説明書が表示される。