スポンサードリンク
今読んでいる本「ウォール街の物理学者 (ハヤカワ・ノンフィクション文庫)」という本にレヴィ分布という確率分布が出てきました。
初めて聞いたのでpython やらgnuplot使って描画して見るかと思いやったので書いときます。誰得なのか不明ですが笑
レヴィ分布とは?
wikipediaに『レヴィ分布は、安定な分布のなかでも解析表現可能な確率密度関数を有する数少ない分布のひとつである。』と紹介されています。
初めて聞いたけど、正規分布とかコーシー分布と並んで紹介されているということは結構使えそうな確率分布です。
以下の式で表現されます。
\begin{eqnarray}
f(x;\mu,c)=\sqrt{\frac{c}{2\pi}} \frac{e^\frac{-c}{2(x-\mu)}}{(x-\mu)^{3/2}}
\end{eqnarray}
ここでは[/latex]\mu = 0, c = 0.5,1,2,4,6,8\(\)と変化させてグラフ描画しました。
pythonの場合
描画に用いたコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.001) y1 = np.arange(0, 0.6, 0.001) y2= np.arange(0, 0.6, 0.001) y3 = np.arange(0, 0.6, 0.001) y4 = np.arange(0, 0.6, 0.001) y5 = np.arange(0, 0.6, 0.001) y6 = np.arange(0, 0.6, 0.001) y1 = np.sqrt(1/(2*np.pi))*np.exp(-1/(2*x))/x**(3/2) y2 = np.sqrt(2/(2*np.pi))*np.exp(-2/(2*x))/x**(3/2) y3 = np.sqrt(4/(2*np.pi))*np.exp(-4/(2*x))/x**(3/2) y4 = np.sqrt(6/(2*np.pi))*np.exp(-6/(2*x))/x**(3/2) y5 = np.sqrt(8/(2*np.pi))*np.exp(-8/(2*x))/x**(3/2) y6 = np.sqrt(0.5/(2*np.pi))*np.exp(-0.5/(2*x))/x**(3/2) plt.plot(x,y1,label="c=1" ) plt.plot(x,y2,label="c=2") plt.plot(x,y3,label="c=4") plt.plot(x,y4,label="c=6") plt.plot(x,y5,label="c=8") plt.plot(x,y6,label="c=0.5") plt.legend() # 凡例を表示 plt.savefig("graph.png") plt.show() |
グラフは以下になります。
スポンサードリンク
gnuplotの場合
描画に用いたコードは以下です。
1 2 3 4 5 6 7 8 |
set yrange [0:0.6] set xrange [0:3] plot sqrt(1/(2*pi))*exp(-1/(2*x))/x**(3/2) lw 2,sqrt(2/(2*pi))*exp(-2/(2*x))/x**(3/2) lw 2,sqrt(4/(2*pi))*exp(-4/(2*x))/x**(3/2) lw 2,sqrt(8/(2*pi))*exp(-8/(2*x))/x**(3/2) lw 2,sqrt(0.5/(2*pi))*exp(-0.5/(2*x))/x**(3/2) lw 2 set terminal png set output "revy.png" replot set output set terminal x11 |
gnuplotの場合はファイル名.gpで上記を保存し、gnuplot “ファイル名.gp”で実行すれば描けます。
ぱっとみ同じに見えますが、c=1とc=0.5のときの形が大分違います。gnuplotの関数指定のところを見ても特に違っている様子はないんですけどねー笑
比較してわかったこと
gnuplotで書くよりもpython で書いた方が綺麗に書けそうです。それにnp.arrayでxの刻み幅も指定できるので、粗いグラフから滑らかなグラフまで速攻で書けそうですし。
gnuplotはどうやって関数描いてるのか不明です。xの刻み幅の指定方法もよくわかりません。もしかしたら刻み幅を指定する方法があって、細かく指定してやればpythonのように滑らかで綺麗なグラフが書けるのかもしれません。
簡単な関数のグラフ書くならpythonの方が良さそうです。ライブラリも豊富ですしね。今回使ってませんが、listとか使って各グラフ(各c)の設定とかを保持しておいてそのlistの全要素に対して関数を描画するようにしたらもっとコードも短くできますね。