計算部分を独立した関数とするように分けて書くことも可能である。
Euler法の場合は例えば次のようになる。
testeuler2.jl |
# testeuler2.jl --- dx/dt=x (0<t<1), x(0)=1 を Euler法で解く # using Printf が必要 function euler(f,t,x,dt) x + dt * f(t,x) end function testeuler2(Tmax=1.0,N=10) # 初期値 t=0.0 x=1.0 # Euler法 dt=Tmax/N for j=1:N x = euler(f,t,x,dt) t = j * dt @printf "t=%.4f x=%.7f exact=%.7f error=%.3e\n" t x exp(t) abs(exp(t)-x) end end function f(t,x) x end |
実行例 |
julia> include("testeuler2.jl") julia> testeuler2(1.0,10) |
Runge-Kutta法の場合。
testrungekutta2.jl |
# testrungekutta2.jl --- dx/dt=x (0<t<1), x(0)=1 を Runge-Kutta法で解く # using Printf が必要 # 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 testrungekutta2(Tmax=1.0,N=10) # 初期値 t=0 x=1 @printf "t=%.4f x=%.7f exact=%.7f error=%.3e\n" t x exp(t) abs(exp(t)-x) # Runge-Kutta法 dt=Tmax/N for j=1:N x = rungekutta(f,t,x,dt) # この行を変えただけ t = j * dt @printf "t=%.4f x=%.7f exact=%.7f error=%.3e\n" t x exp(t) abs(exp(t)-x) end end function f(t,x) x end |
実行例 |
julia> include("testrungekutta2.jl") julia> testrungekutta2(10) |