どうも、木村(@kimu3_slime)です。
今回は、Julia(PyPlot)で2次元のベクトル場・流線を描く方法を作る方法を紹介します。
この記事のコードと実行結果(GitHub)
準備
PyPlotを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("Pyplot") |
グラフを描く準備として、以下のコードを実行します。
1 | using PyPlot |
2次元のベクトル場を描く方法
例として、いくつかの2変数のベクトル値関数(平面のベクトル場)の図(流線)を描いてみましょう。
線形ベクトル場を
\[ \begin{aligned}F(x,y)= \begin{pmatrix} a&b\\c&d \end{pmatrix} \begin{pmatrix} x\\y \end{pmatrix}=\begin{pmatrix} ax+by\\cx+dy \end{pmatrix}\end{aligned} \]
と表します。
\(F(x,y)=(x,y)\)、つまり\(a=1,b=0,c=0,d=1\)のとき、次のコードで描くことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sample =200 x = repeat(range(-5,5,length=sample)',sample) y = repeat(range(-5,5,length=sample),1,sample) a=1 b=0 c=0 d=1 u = a*x+b*y v = c*x+d*y speed = sqrt.(u.^2 + v.^2) PyPlot.figure(figsize=(5,5)) PyPlot.streamplot(x, y, u, v, density=1.5, color=speed, linewidth=1) |
「range」は描写する範囲の指定です。\(x,y\)ともに-5から5まで、sampleの数(200)だけ分割して値を取ることにします。
「u = a*x+b*y, v = c*x+d*y」が、ベクトル場の定義式です。
「PyPlot.streamplot(x, y, u, v)」によって、結果を図として出力します。各点でのベクトル場の大きさ(速度)に応じて色を変えるために、「speed」を計算し、「color=speed」で割り当てています。「density」で線の密度を調整できます。
係数を変えて、同様の方法で描いてみましょう。
\[ \begin{aligned}F(x,y)=(-x,-y)\end{aligned} \]
\[ \begin{aligned}F(x,y)=\begin{pmatrix} 0&1\\1&0 \end{pmatrix} \begin{pmatrix} x\\y \end{pmatrix}=\begin{pmatrix} y\\x \end{pmatrix}\end{aligned} \]
\[ \begin{aligned}F(x,y)=\begin{pmatrix} 0&1\\-1&0 \end{pmatrix} \begin{pmatrix} x\\y \end{pmatrix}=\begin{pmatrix} y\\-x \end{pmatrix}\end{aligned} \]
\[ \begin{aligned}F(x,y)=\begin{pmatrix} -1&1\\-1&-1 \end{pmatrix} \begin{pmatrix} x\\y \end{pmatrix}=\begin{pmatrix} -x+y\\-x-y \end{pmatrix}\end{aligned} \]
\(F(x,y)=(y,-\sin x)\)という非線形のベクトル場を描きましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sample =200 x = repeat(range(-5,5,length=sample)',sample) y = repeat(range(-5,5,length=sample),1,sample) a=0 b=1 c=-1 d=0 u = a*x+b*y v = c*sin.(x)+d*y speed = sqrt.(u.^2 + v.^2) PyPlot.figure(figsize=(5,5)) PyPlot.streamplot(x, y, u, v, density=1.5, color=speed, linewidth=1) |
ベクトル場の定義式を、「sin.(x)」に置き換えるだけです。配列に対する計算なので、ドットをつけるのを忘れないようにしましょう。
最後に、矢印(quiver)を使ってベクトル場を描く方法を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | sample =20 x = repeat(range(-5,5,length=sample)',sample) y = repeat(range(-5,5,length=sample),1,sample) a=2 b=0 c=0 d=-2 u = a*x+b*y v = c*x+d*y speed = sqrt.(u.^2 + v.^2) PyPlot.figure(figsize=(5,5)) PyPlot.quiver(x, y, u, v) |
sampleを20まで落としたことに注意。矢印が多すぎると、密集して何が起こっているのかわからなくなってしまいます。
もし各点での矢印の大きさを統一したいならば、「PyPlot.quiver(x, y, u./speed, v./speed)」と大きさで割ると良いでしょう。
以上、Julia(PyPlot)で2次元のベクトル場・流線を描く方法を紹介してきました。
Plotsで描く方法を探していたのですが、良い出力を得る方法が見つからなかったので、Pyplotを利用することになりました。ベクトル場を手書きするのは大変なので、コンピュータで描けると嬉しいですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
ベクトル値関数をベクトル場として描いてみよう:ヤコビ行列と線形近似
流体の複素ポテンシャル、速度ポテンシャル、流れ関数、流線とは