1週間で学べる! Julia数値計算プログラミング(KS情報科学専門書)
1週間で学べる! Julia数値計算プログラミング(KS情報科学専門書)
更新履歴
- 2022年7月19日 サイトを公開しました
- 2022年8月3日 動作確認したコードの公開を始めました(2章から順番にアップロードしていきます)
- 2023年5月21日 Julia 1.9での動作確認を行いました。
動作確認したコード
コメントなどは省いたJupyterノートブックとコードです。コードの方は開いて該当箇所をREPLにコピーペーストすることで動かすことができます。動作確認にはJulia 1.7.3および1.9.0を用いています。
- 2日目 Jupyter notebookとコード
- 3日目 Jupyter notebookとコード1、コード2、コード3
- 4日目 Jupyter notebook その1とJupyter notebook その2、コード1とコード2
- 5日目 Jupyter notebook その1とコード その1。本書ではJulia 1.6を用いていましたが、Julia 1.7以降だと乱数の発生方法が変わっているためにそのままでは本書の結果を再現できません(乱数が違う程度の値の変化があります)。ですので、二種類のコードを用意しました。Julia 1.6以前で再現する場合のJupyter notebook その2とコード その2。Julia 1.7以降を使う場合に本書を再現する場合のJupyter notebook その2 とコード その2。
- 6日目 Jupyter notebook その1とJupyter notebook その2、コード1とコード2
誤植について
もし誤植や間違いと思われる箇所を発見した方はこちらに記入していただければチェックして反映したいと思います。
第1刷の誤植
- p.17 下部
\[f(x) = \cos(x) + 2 \sin(3 x^2)\]
はコードとずれていますので、
\[f(x) = \cos(x) + 2 \sin(2 x^2)\]
が正しいです。
- p.19 上部
\[f(x,y) = \cos(x) + 2 \sin(3 y^2)\]
はコードとずれていますので、
\[f(x,y) = \cos(x) + 2 \sin(2 y^2)\]
が正しいです。
- p.95
正$(8N)角形の場合
は正$(N)角形の場合
が正しいです。本文の出力を全て8で割って読み替えてください。
- p.102 最後のplot
markershape = [:circle,:star5]
->
markershape = [:circle :star5]
- p.105の最後
n = 10000
->
N = 10000
- p.111 反発係数の定義式
\[e = \frac{v'- V'}{v-V}\]
->
\[e = -\frac{v'- V'}{v-V}\]
- p.111 $V'$の表式
\[V' = \frac{2v(r-1)V}{1+r}\]
->
\[V' = \frac{2v+(r-1)V}{1+r}\]
コードに変更はありません。
- p.117のコード
x,v = get_xv(small,ith)
X,V = get_xv(large,ith)
の部分の2変数関数get_xv(small,ith)
は本では定義されていませんでした。 関数の終わり(25行目の後)に
function get_xv(ball::Ball, ith)
return ball.x_history[ith], ball.v_history[ith]
end
を定義してください。報告ありがとうございます。
- p.123 中央付近
\[d_{ij} = -(\delta_{i,i+1} + \delta_{i,i-1}-2\delta_{ij})/(\Delta x)^2\]
->
\[d_{ij} = -(\delta_{i,j+1} + \delta_{i,j-1}-2\delta_{ij})/(\Delta x)^2\]
コードの修正はありません。
- p.129
V(q)
の式
\[e^{-eqx}\]
->
\[e^{-iqx}\]
- p130の
make_Hk
内
v += Ukkp
->
v += Vkkp
- p130の
calc_psi
内
nmax = length(bn)
->
nmax = length(cn)
です。
- p133の変数変換は$r = r' \sqrt{R}$ではなく$r' = r \sqrt{R}$でした。
- p133 5行目の式、左辺第三項
\[(r'-n^2) \rightarrow (r'^2 -n^2)\]
- p133 5行目の式、左辺第四項
\[V(r) \rightarrow V(r')\]
です。
- p138の
calc_Vij
正しくは、
function calc_Vij(n,i,j,R,V)
αi = besselj_zero(n,i)
αj = besselj_zero(n,j)
f(r) = r*V(R*r)*besselj(n,αi*r)*besselj(n,αj*r)
v,err = quadgk(f,0,1)
Vij =v*2/besselj(n+1,αi)^2
return Vij
end
です(申し訳ありません。なぜこんな間違いになっているか、謎です)。
- p138の式
\[(R/20) \rightarrow (R/20)^2\]
でした(コード内の訂正はありません)。
- p141の
timedep_simple()
内
H = zeros(Float64,N,N)
make_H!(H,N,L,V)
->
H = make_H(N,L,V)
make_H!
はp143で定義されていますので、この修正をしなくてもそちらを先に定義してからなら動きます(登場順番が逆になっています)。報告ありがとうございます。
- p.146 上部
\[\exp(i {\cal H} \Delta t) \exp(-i {\cal H} \Delta t) \sim (1- i {\cal H} \Delta t)(1- i {\cal H} \Delta t)\]
->
\[\exp(i {\cal H} \Delta t) \exp(-i {\cal H} \Delta t) \sim (1+ i {\cal H} \Delta t)(1- i {\cal H} \Delta t)\]
最右辺の結果は変わりません。
- p160の
test6
コードの定義の前に、
using Plots
using Measures
を追加。add Measures
でパッケージを追加しておく必要があります。
- p170のコード
return mz_data,accept_count/(num_total*Lx*Ly)
->
return mz_data,accept_count/(num_total*Lx*Ly),absmz_meanvalue/measure_count
です。p173のコードを動かすためには引数が一つ足りませんでした。関連して、p171のコードはp173と同様に
@time mz_data,acceptance_ratio
->
@time mz_data,acceptance_ratio,absmz
と修正してください。
- p170のコード
引数が${\rm measure_{i}nterval}$となっているものを
measure_interval
と修正。
- p210のOptim
optimize(f, [0.0, 0.0])
->
a1 = optimize(f, [0.0, 0.0])
と修正。
- p232のコード
14行目と15行目の間に
n = 10000
を挿入。
謝辞
Twitterやメールなどを通じて誤植の指摘をしていただいた方々に深く感謝いたします。