Package "Interact" を使ってみよう

Julia の Jupyter 環境などでは Interact package を使うと,パラメータをマウスでコントロールしながら計算などを行わせることができる. これを試してみよう.

まずは Package の使用宣言だ.ちなみに,JuliaBox はこのパッケージはデフォルトでインストールされているので,自分でインストールしなくても良い(しようとすると失敗する).

In [1]:
using Interact
INFO: Precompiling module Interact.

ロジスティック写像

試してみる対象として,ロジスティック写像を用いてみよう. これは初期値 $0 < u_0 < 1$ に対して

$u_{n+1} = a u_n ( 1- u_n ),$ $n=0,1,\cdots$

で表される写像で,パラメータ $a$ が 1 より少しだけ大きいときは,人口問題のロジスティックモデルの微分方程式の近似になっている式である. 逆に言えば,$a$ が 1 からずれていくとロジスティックモデルからずれていくということだ.

初期値を 0.01 として,パラメータ $a$ と,得られる数列の長さ $num$ を与えるとロジスティック写像によって得られる数列を返すような関数を用意しておこう.

In [2]:
function logistic(a, num)
    u0 = 0.01
    u = u0
    u_sq = [ u0 ]
    
    for i in 1:num
        u = a*u*(1-u)
        push!(u_sq, u)
    end
    
    return u_sq
end
Out[2]:
logistic (generic function with 1 method)

動作を確認しておこう.

In [3]:
result = logistic(1.2, 50)
Out[3]:
51-element Array{Float64,1}:
 0.01     
 0.01188  
 0.0140866
 0.0166658
 0.0196657
 0.0231348
 0.0271195
 0.0316608
 0.0367901
 0.0425239
 0.0488587
 0.0557658
 0.0631872
 ⋮        
 0.16584  
 0.166004 
 0.166136 
 0.166242 
 0.166327 
 0.166395 
 0.166449 
 0.166492 
 0.166527 
 0.166555 
 0.166577 
 0.166595 
In [4]:
using Plots
gr()
Out[4]:
Plots.GRBackend()
In [5]:
plot(result, marker = :circle)
Out[5]:
<?xml version="1.0" encoding="utf-8"?> 0 10 20 30 40 50 0.03 0.06 0.09 0.12 0.15 y1

確かに人口問題っぽい変化をしていることがわかる.

Interact を試してみる

Interact の使い方は,@manipulate マクロに続けて for 文を書けば良い.

通常だと for 文はその中身がループするが,@manipulate がついているときはループせずに,for で指定されている数量などが画面で制御できるようになる.

まあ,例で見てみたほうがわかりやすいだろうから,以下の例を見てみよう.

In [6]:
@manipulate for a in 0:0.01:4
    plot( logistic(a,100), marker = :circle)
end
Out[6]:
<?xml version="1.0" encoding="utf-8"?> 0 25 50 75 100 0.0 0.1 0.2 0.3 0.4 0.5 y1

表示されるスライダをマウスで掴んで,左右に動かしてみよう. 特に,$a$ の値が、「1の前後」「2.3? あたりの前後」「3.56? あたりの前後」で本質的な変化が起こるので,よくよく見てみよう.

ちなみに,for 文で制御する変数は複数でも良い.以下の例を見てみよう.

In [7]:
@manipulate for a in 0:0.01:4, num in 10:300
    plot( logistic(a,num), marker = :circle)
end
Out[7]:
<?xml version="1.0" encoding="utf-8"?> 0 50 100 150 0.0 0.1 0.2 0.3 0.4 0.5 y1