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)
|