Julia は比較的新しい言語で、数値計算にも向いている。 「Juliaメモ」 と言うメモを書いた。
(2021/1/23 加筆)
最小限のインストール |
curl -O https://julialang-s3.julialang.org/bin/mac/x64/1.5/julia-1.5.3-mac64.dmg open julia-1.5.3-mac64.dmgJulia-1.5 というのが現れるので、Applications に入れる。 続いてターミナルで pushd /usr/local/bin sudo ln -s /Applications/Julia-1.5.app/Contents/Resources/julia/bin/julia . popd(sudo するとパスワードを尋ねられるので、入力する。) |
明治大学図書館のeBook (https://elib.maruzen.co.jp/elib/) で、 「1から始めるJuliaプログラミング」と言う書籍が試読できる (来年度購入予定)。
次のプログラムに rungekutta() と言う関数があるが、 この1つのプログラムで、ベクトルの次元がいくつの問題でも解くことが出来る。
# tanshin.jl --- 投げたボールのバウンド, 空気抵抗ありのシミュレーション # Julia を起動して # using Printf # include("tanshin.jl") # tanshin(1000) # Euler 法の1ステップ function euler(f,t,x,dt) x + dt * f(t, x) end # Runge-Kutta 法の1ステップ function rungekutta(f,t,x,dt) k1=dt*f(t,x) k2=dt*f(t+dt/2, x+k1/2) k3=dt*f(t+dt/2, x+k2/2) k4=dt*f(t+dt, x+k3) x + (k1 + 2 * k2 + 2 * k3 + k4) / 6 end function f(t,x) omega2 = 1.0 y=similar(x) y[1] = x[2] y[2] = - omega2 * x[1] y end function tanshin(n=100) # 100等分くらい t=0.0 x=[1.0,0.0] println("t x y") println("$t $x") Tmax=20.0 dt=Tmax/n println("Tmax=$Tmax, dt=$dt") s=@sprintf "%f %f %f\n" t x[1] x[2] print(s) of = open("tanshin.dat","w") print(of,s) for i=1:n #x=euler(f,t,x,dt) x=rungekutta(f,t,x,dt) t=i*dt s=@sprintf "%f %f %f\n" t x[1] x[2] print(s) print(of,s) end close(of) # 以下は工事中 of = open("tanshin.gp","w") println(of,"set size ratio 1") println(of,"plot \"tanshin.dat\" using 2:3 with lp") close(of) run(`gnuplot tanshin.gp`) end
tanshin.jl を試す |
以下の $ はシェルのプロンプト、
julia> は Julia のプロンプトである。
$ curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20210122/tanshin.jl $ julia julia> using Printf julia> include("tanshin.jl") julia> tanshin(100)Julia は、control+D または exit() で終了出来る。 |
tanshin.jl の
#x=euler(f,t,x,dt) x=rungekutta(f,t,x,dt) |
x=euler(f,t,x,dt) #x=rungekutta(f,t,x,dt) |
読み込み直して実行する |
julia> include("tanshin.jl") julia> tanshin(100) |
上の rungeekutta(f,t,x,dt) が、 ベクトルの次元によらずに使えることを見てみよう。 例えば2次元空間の質点の運動の問題 (弾むボール, 4次元ベクトル)
$ curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20210122/ballbound.jl $ julia julia> using Printf julia> include("ballbound.jl") julia> ballbound(100) |