LoginSignup
2
1

Pythonによるベクトル場の描写

Last updated at Posted at 2024-03-07

はじめに

Pythonでは、matplotlibというライブラリが存在していて、それを用いることで2次元や3次元のグラフを描写することができる。ベクトルを描写するためにはquiver(x,y,u,v)という関数(x,y,u,vはベクトルを生成するためのパラメータ)を用いることでベクトルを1本ずつ描写することができる。一方で、streamplot(x,y,u,v)という関数を使えば、敷居は高いが、流れの場を描写することができる。今回は2つの関数を比較することによって、それぞれのメリットやデメリット、使用方法などを学習する。

準備

まず、準備として、2次元のベクトル場、流れの場を描くためには、格子状の点の集合を用意する必要がある。したがって以下のようなプログラムをまずは書かなければならない。これは、等高線やコンター図のような曲面を描くときも同様である。

python lattice_2D.py
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()

格子状の点.png

これに、高さの情報が加わると三次元情報を内包するコンター図や等高線図を描写することができるようになる。

点電荷の電場と電位の描写

電位分布の描写

試しに、正の電荷をおいたときのその周りに生じる電位分布を描くプログラムを以下のようにして作成することを考える。

ただし、点電荷における電位は二次元空間内だと以下のように表すことができる。

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)を用いた描写

これをもとにして以下のようなプログラムを作成する。

python Potential.py
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()

点電荷の電位分布.png

電場分布の描写

一方で、電場ベクトルは、

\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)を用いて、矢印一本ずつ描写すると以下のようになる。

python E_quiver.py
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()

これを実行すると以下のような画像が出力される。

点電荷の電場分布.png
この画像から分かるように$r=0$付近で矢印の大きさが発散してしまうことが分かる。また、ベクトル場描写もあまり見やすいとは言えない。

streamplot(x,y,u,v)での描写

一方で、streamplot(x,y,u,v)で描写すると以下のようになる。ただし、streamplot(x,y,u,v)では、x,yが直交座標系でないとエラーがでてしまい上手く描写することができないので注意すること。

python E_streamplot.py
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()

点電荷の電場分布_流れ.png

streamplot(x,y,u,v)では、quiver(x,y,u,v)よりも描写できる制限が厳しい一方で、このように上手く流れの場を表現することができる。このような流れの場を表現することができるので、以下のようなソレノイドコイルに生じる磁場の流れも表現することが可能になる。

solenoid.png

まとめ

今回は、点電荷によって生じる電場の分布をPythonで描写することにより、ベクトル場、流れの場の描写方法を学んだ。一般的に、quiver(x,y,u,v)の方が、streamplot(x,y,u,v)よりも描写方法が簡単ではあるが、複雑な流れの情報を知るためには、streamplot(x,y,u,v)を用いた方が良いと考えられる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1