3.4 Julia によるプログラム例

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.dmg
Julia-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)
とすると、Euler法に切り替わる。プログラムを読み込み直して実行すると良い。
読み込み直して実行する
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)



桂田 祐史