はじめに
Pythonでは、matplotlibというライブラリが存在していて、それを用いることで2次元や3次元のグラフを描写することができる。ベクトルを描写するためにはquiver(x,y,u,v)という関数(x,y,u,vはベクトルを生成するためのパラメータ)を用いることでベクトルを1本ずつ描写することができる。一方で、streamplot(x,y,u,v)という関数を使えば、敷居は高いが、流れの場を描写することができる。今回は2つの関数を比較することによって、それぞれのメリットやデメリット、使用方法などを学習する。
準備
まず、準備として、2次元のベクトル場、流れの場を描くためには、格子状の点の集合を用意する必要がある。したがって以下のようなプログラムをまずは書かなければならない。これは、等高線やコンター図のような曲面を描くときも同様である。
import matplotlib.pyplot as plt
import math
import numpy as np
import japanize_matplotlib
n=10
x=np.linspace(-1,1,n)
y=np.linspace(-1,1,n)
X,Y = np.meshgrid(x,y)
plt.scatter(X,Y)
plt.savefig("格子状の点.png")
plt.show()
これに、高さの情報が加わると三次元情報を内包するコンター図や等高線図を描写することができるようになる。
点電荷の電場と電位の描写
電位分布の描写
試しに、正の電荷をおいたときのその周りに生じる電位分布を描くプログラムを以下のようにして作成することを考える。
ただし、点電荷における電位は二次元空間内だと以下のように表すことができる。
V(r) = k\frac{Q}{r}
$r$は、点電荷からの距離で$Q$は電荷で$k$はクーロン定数である。
したがって、これをxy座標系で表すと以下のようになる。
V(x,y) = k\frac{Q}{\sqrt{x^2+y^2}}
contourf(x,y,z)を用いた描写
これをもとにして以下のようなプログラムを作成する。
import matplotlib.pyplot as plt
import math
import numpy as np
import japanize_matplotlib
n=10
x=np.linspace(-1,1,n)
y=np.linspace(-1,1,n)
X,Y = np.meshgrid(x,y)
R=(X**2+Y**2)**0.5
Q=1
k=9.0*10**9
V= k*Q/R
plt.contourf(X,Y,V)
plt.colorbar()
plt.savefig("点電荷の電位分布.png")
plt.show()
電場分布の描写
一方で、電場ベクトルは、
\textbf{E}=-\frac{dV}{dr}
より、
\textbf{E}=\frac{kQ}{r^2}\frac{\textbf{r}}{r}
したがって、xy直交座標系では、電場は以下のように表すことができる。
E_x = \frac{kQ}{\sqrt{x^2+y^2}^3}x,E_y=\frac{kQ}{\sqrt{x^2+y^2}^3}y
quiver(x,y,u,v)での描写
これをquiver(x,y,u,v)を用いて、矢印一本ずつ描写すると以下のようになる。
import matplotlib.pyplot as plt
import math
import numpy as np
import japanize_matplotlib
n=10
x=np.linspace(-1,1,n)
y=np.linspace(-1,1,n)
X,Y = np.meshgrid(x,y)
R=(X**2+Y**2)**0.5
Q=1
k=9.0*10**9
E= k*Q/R**2
Ex=E*X/R
Ey=E*Y/R
plt.quiver(X,Y,Ex,Ey)
plt.savefig("点電荷の電場分布.png")
plt.show()
これを実行すると以下のような画像が出力される。
この画像から分かるように$r=0$付近で矢印の大きさが発散してしまうことが分かる。また、ベクトル場描写もあまり見やすいとは言えない。
streamplot(x,y,u,v)での描写
一方で、streamplot(x,y,u,v)で描写すると以下のようになる。ただし、streamplot(x,y,u,v)では、x,yが直交座標系でないとエラーがでてしまい上手く描写することができないので注意すること。
import matplotlib.pyplot as plt
import math
import numpy as np
import japanize_matplotlib
n=10
x=np.linspace(-1,1,n)
y=np.linspace(-1,1,n)
X,Y = np.meshgrid(x,y)
R=(X**2+Y**2)**0.5
Q=1
k=9.0*10**9
E= k*Q/R**2
Ex=E*X/R
Ey=E*Y/R
plt.streamplot(X,Y,Ex,Ey)
plt.savefig("点電荷の電場分布_流れ.png")
plt.show()
streamplot(x,y,u,v)では、quiver(x,y,u,v)よりも描写できる制限が厳しい一方で、このように上手く流れの場を表現することができる。このような流れの場を表現することができるので、以下のようなソレノイドコイルに生じる磁場の流れも表現することが可能になる。
まとめ
今回は、点電荷によって生じる電場の分布をPythonで描写することにより、ベクトル場、流れの場の描写方法を学んだ。一般的に、quiver(x,y,u,v)の方が、streamplot(x,y,u,v)よりも描写方法が簡単ではあるが、複雑な流れの情報を知るためには、streamplot(x,y,u,v)を用いた方が良いと考えられる。