つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方15 ~ ベクトルモジュール3

 今回はSymPyのベクトル演算を専門に扱うベクトルモジュールのうちベクトル積分について紹介する。

1. 積分領域の定義

 ベクトル積分を実行するには、積分領域を定義する必要がある。SymPyではParametricRegionImplicitRegionおよびGeometryモジュールを使用して領域を定義することができる。 ParametricRegionImplicitRegionは最新のSymPyを使用する必要があり、Google ColabのSymPyはVer 1.1.1なので一時的なアップデートであれば

!pip install -U sympy

とする。ParametricRegionImplicitRegionなどをロードするには

from sympy.vector import CoordSys3D, ParametricRegion, ImplicitRegion, vector_integrate
from sympy import sin, cos, exp, pi, sqrt, symbols
from sympy.abc import r, x, y, z, theta, phi
C = CoordSys3D('C')

半径2の円の領域を定義するためにParametricRegion((para1,para2),(変数,下限,上限))では

param_circle = ParametricRegion((2*cos(theta), 2*sin(theta)), (theta, 0, 2*pi))

通常のXY座標を用いるImplicitRegionでは

implicit_circle = ImplicitRegion((x, y), x**2 + y**2 - 1)

2. 線積分の例

 定義した領域に従って積分を実行するにはvector_integrate()を使用する。以下のように1を領域に沿って積分する場合は、領域の長さ、今回は半径2の円周を計算することになる。 ParametricRegionImplicitRegionいずれも計算できるが、ImplicitRegionの方が時間がかかる。

vector_integrate(1, param_circle)
>4*pi
vector_integrate(1, ImplicitRegion)
>4*pi

3角形のような図形はパラメータ定義が難しいので、Geometryモジュールを用いて図形を定義する。 2辺が長さ1の直角2等辺三角形は

from sympy.geometry import Point, Polygon
triangle = Polygon(Point(0, 0), (0, 1), (1,0))

積分方法は上と同様で

vector_integrate(1, triangle)
>sqrt(2)+2

3. 面積分、体積積分の例

 ParametricRegionなどの領域の定義内の変数により、面積分や体積積分も実行できる。例えば円の面積を計算するには変数rを加え、さらにrの変化域を0からシンボリックのaとすると

a=symbols('a')
area_circle = ParametricRegion((r*cos(theta), r*sin(theta)), (theta, 0, 2*pi),(r,0,a))
vector_integrate(1, area_circle)
>pi*a**2

ParametricRegionのタプルの次元を増やせば2次元だけでなく3次元の積分にも適用できる。以下は半径1の球の表面積を計算する。

surfacesphere = ParametricRegion((sin(phi)*cos(theta),sin(phi)*sin(theta), cos(phi)),(phi, 0, pi), (theta, 0, 2*pi))
vector_integrate(1, surfacesphere)

さらに変数rを加えると体積積分になる。

solidsphere = ParametricRegion((r*sin(phi)*cos(theta),r*sin(phi)*sin(theta), r*cos(phi)),(phi, 0, pi), (theta, 0, 2*pi), (r, 0, 1))
vector_integrate(1, solidsphere)
>4/3*pi

積分する関数を1の代わりにC.xとすると直線に沿って積分していることが確認できる。

line = Polygon(Point(0, 0), (3, 0))
vector_integrate(C.x, line)
>9/2

4. まとめ

 今回はベクトル積分の基礎として領域の設定とベクトル積分の実行方法について紹介した。