Return to SymPy で理工系の数学C

SymPy で多重積分

必要なパッケージを import します。

In [1]:
from sympy.abc import * 
from sympy import *

# SymPy Plotting Backends (SPB): グラフを描く際に利用
from spb import *

# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']

多変数関数の積分である多重積分のうち,もっとも簡単な2変数関数の積分つまり2重積分についてまとめる。

2重積分は累次積分で

2重積分の計算は,基本的に累次積分でやります。

$\displaystyle \iint_D f(x, y)\, dx dy$ の領域 $D$ が何と何で囲まれているかを明らかにして積分する。

累次積分 1

領域 $D$ が $x_1 \leq x \leq x_2,\ y_1 \leq y \leq y_2$ である場合:

$$\iint_D f(x, y) \,dx\,dy = \int_{x_1}^{x_2} \left\{\int_{y_1}^{y_2} f(x, y)\,dy \right\} dx$$

または

$$\iint_D f(x, y) \,dx\,dy = \int_{y_1}^{y_2} \left\{\int_{x_1}^{x_2} f(x, y)\,dx \right\} dy$$

累次積分 2

領域 $D$ が $x_1 \leq x \leq x_1,\ \phi_1(x) \leq y \leq \phi_2(x)$ である場合:

$$ \iint_D f(x, y) \,dx\,dy = \int_{x_1}^{x_2} \left\{\int_{\phi_1(x)}^{\phi_2(x)} f(x, y)\,dy \right\} dx$$

累次積分 3

領域 $D$ が $\psi_1(y)\leq x \leq \psi_2(y),\ y_1 \leq y \leq y_2$ である場合:

$$ \iint_D f(x, y) \,dx\,dy = \int_{y_1}^{y_2} \left\{\int_{\psi_1(y)}^{\psi_2(y)} f(x, y)\,dx \right\} dy$$

例題

$$I = \iint_D y \,dx dy, \quad D: 0\leq x\leq 2, \ 0 \leq y \leq 2$$

これは,ケース 1。以下のように累次積分にして…
\begin{eqnarray}
f(x, y) &=& y \\
x_1 &=& 0\\
x_2 &=& 2\\
y_1 &=& 0\\
y_2 &=& 2
\end{eqnarray}

SymPy では2重積分は以下のように。

$\displaystyle \int_{y_1}^{y_2} \left\{\int_{x_1}^{x_2} f(x, y) dx \right\} dy =
$

integrate(f(x, y), (x, x1, x2), (y, y1, y2))

In [2]:
f = y
x1 = 0
x2 = 2
y1 = 0
y2 = 2

# 手っ取り早く答えだけを表示させたいなら
integrate(f, (x, x1, x2), (y, y1, y2))
Out[2]:
$\displaystyle 4$
In [3]:
# 何を計算するか表示させてから答えを表示させるなら

Eq(Integral(y, (x, x1, x2), (y, y1, y2)), 
   Integral(y, (x, x1, x2), (y, y1, y2)).doit())
Out[3]:
$\displaystyle \int\limits_{0}^{2}\int\limits_{0}^{2} y\, dx\, dy = 4$

参考:領域 $D$ の塗りつぶし

ついでに,領域 $D$ の部分を塗りつぶして描いてみます。

$x_1 \leq x \leq x_2$ の範囲で $y = y1$ と $y = y2$ に囲まれた領域を塗りつぶす方法は,SymPy Plotting Backends では以下のようにします。

In [4]:
# NumPy に頼らない例
# x1 ~ x2 を 100 等分した数値リストを作成
x_list = [(x1 + (x2-x1)*i/100) for i in range(101)]
# x_array に対応した y1 の数値リストを作成
y1_list = lambdify(x, y1)(x_list)
# x_array に対応した y2 の数値リストを作成
y2_list = lambdify(x, y2)(x_list)

plot(xlim = (-0.5, 2.5), 
     ylim = (-0.5, 2.5), 
     aspect = "equal",
     title = "領域 $D$",
     xlabel = "x", ylabel = "y",
     fill={'x': x_list,
           'y1':y1_list,
           'y2':y2_list,
           'color':'yellow'});

ついでに,3次元的なグラフを描いてみます。

In [5]:
plot3d((0, (x, x1, x2), (y, y1, y2)), 
       (f, (x, x1, x2), (y, y1, y2)),
       xlim = (-0.5, 2.5), ylim = (-0.5, 2.5), 
       zlim = (0, 3), n = 10,
       rendering_kw=[{"color":"yellow"},
                     {"color":"lightblue"}]);

2重積分の結果は,黄色で塗りつぶされた領域 $D$ と薄青色で塗られた平面で挟まれた部分の体積を表す。

縦横高さともに $2$ の立方体を斜めに2つに切った立体であるので体積は

$$\frac{2\cdot 2\cdot 2}{2} = 4$$

になるはずで,答えも確かにそうなっている。

例題

$$I = \iint_D dx dy, \quad D: x^2 + y^2 \leq 1$$

累次積分の形にする。まず先に $-\sqrt{1-x^2} < y < \sqrt{1-x^2}$ の範囲で $y$ で定積分し,そのあとに $ -1 < x < 1$ の範囲で $x$ で定積分する。
被積分関数は $1$。

ケース 2 の累次積分の形:
\begin{eqnarray}
f(x, y) &=& 1 \\
x_1 &=& -1\\
x_2 &=& 1 \\
\phi_1(x) &=& -\sqrt{1-x^2}\\
\phi_2(x) &=& \sqrt{1-x^2}
\end{eqnarray}

\begin{eqnarray}
\iint_D dx dy &=& \int_{x_1}^{x_2} \left\{\int_{\phi_1(x)}^{\phi_2(x) } f(x, y)\,dy \right\} dx \\
&=& \cdots
\end{eqnarray}

$I$ は半径 $1$ の円の面積であるから,$\pi r^2 = \pi \ (\because r=1)$ となるはず。

In [6]:
f = 1
x1 = -1
x2 = 1
phi1 = -sqrt(1-x**2)
phi2 = sqrt(1-x**2)

Eq(Integral(f, (y, phi1, phi2), (x, x1, x2)), 
   Integral(f, (y, phi1, phi2), (x, x1, x2)).doit())
Out[6]:
$\displaystyle \int\limits_{-1}^{1}\int\limits_{- \sqrt{1 – x^{2}}}^{\sqrt{1 – x^{2}}} 1\, dy\, dx = \pi$

参考:領域 $D$ の塗りつぶし

ついでに,領域 $D$ の部分を塗りつぶして描いてみます。

In [7]:
# NumPy を import して使う場合
import numpy as np
x_array = np.linspace(x1, x2, 100)
def y1(x):
    return -np.sqrt(1-x**2)
def y2(x):
    return np.sqrt(1-x**2)

y1_array = y1(x_array)
y2_array = y2(x_array)

plot(xlim = (-1.5, 1.5), 
     ylim = (-1.5, 1.5), 
     aspect = "equal",
     title = "領域 $D$",
     xlabel = "x", ylabel = "y",
     fill={'x': x_array,
           'y1':y1_array,
           'y2':y2_array,
           'color':'yellow'});

ガウス積分の準備としての2重積分

$$ S = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} e^{-x^2 – y^2} dx\,dy$$

極座標に変換して積分

極座標に変換して計算する。

デカルト座標 $x, y$ と2次元極座標 $r, \theta$ との間の関係は
\begin{eqnarray}
x &=& r\cos\theta\\
y &=& r\sin\theta
\end{eqnarray}
であり,微小面積要素 $dx\,dy$ は以下のように変換される。

\begin{eqnarray}
dx\,dy &=& \frac{\partial(x, y)}{\partial(r,\theta)} \,dr\, d\theta
\end{eqnarray}

ここで,ここで,$$ \frac{\partial(x,y)}{\partial(r,\theta)} \equiv
\begin{vmatrix}
\frac{\partial x}{\partial r} & \frac{\partial x}{\partial \theta}\\
\frac{\partial y}{\partial r} & \frac{\partial y}{\partial \theta}\\
\end{vmatrix}
= \frac{\partial x}{\partial r} \frac{\partial y}{\partial \theta} – \frac{\partial y}{\partial r}\frac{\partial x}{\partial \theta}$$ をヤコビアンという。

ヤコビ行例

SymPy でヤコビアンを計算する例:

In [8]:
X = Matrix([r*cos(theta), r*sin(theta)])
Y = Matrix([r, theta])

jaco = X.jacobian(Y)
jaco
Out[8]:
$\displaystyle \left[\begin{matrix}\cos{\left(\theta \right)} & – r \sin{\left(\theta \right)}\\\sin{\left(\theta \right)} & r \cos{\left(\theta \right)}\end{matrix}\right]$
ヤコビアン(ヤコビ行列式)

jacobian() はヤコビ行列。この行列の行列式が,我々が求めたいヤコビアンはヤコビ行列の行列式。det() で行列式。

In [9]:
det(jaco).simplify()
Out[9]:
$\displaystyle r$

ヤコビアンが $r$ となることがわかった。

\begin{eqnarray}
\therefore\ \ S &=& \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} e^{-x^2 – y^2} dx\,dy \\
&=& \int_0^{2\pi} \int_0^{\infty} e^{-r^2} r \,dr \,d\theta\\
&=& 2 \pi \int_0^{\infty} e^{-r^2} r \,dr = \cdots
\end{eqnarray}

In [10]:
Eq(Integral(exp(-r**2)*r, (theta, 0, 2*pi), (r, 0, oo)),
   Integral(exp(-r**2)*r, (theta, 0, 2*pi), (r, 0, oo)).doit())
Out[10]:
$\displaystyle \int\limits_{0}^{\infty}\int\limits_{0}^{2 \pi} r e^{- r^{2}}\, d\theta\, dr = \pi$

ガウス積分

$$ I = \int_{-\infty}^{\infty} e^{-x^2 } dx$$

とすると,上で

\begin{eqnarray}
S &=& \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} e^{-x^2 – y^2} dx\,dy \\
&=& I^2 \\
&=& \pi
\end{eqnarray}

ということがわかったので,

$$ I = \int_{-\infty}^{\infty} e^{-x^2 } dx = \sqrt{S} = \sqrt{\pi}$$

ということになる。SymPy がガウス積分 $I$ を知っていることを確認する。

In [11]:
Eq(Integral(exp(-x**2), (x, -oo, oo)),
   Integral(exp(-x**2), (x, -oo, oo)).doit())
Out[11]:
$\displaystyle \int\limits_{-\infty}^{\infty} e^{- x^{2}}\, dx = \sqrt{\pi}$

被積分関数は偶関数であるから,積分範囲を $0$ からにすると答えは半分になるはずで,これも確認。

In [12]:
Eq(Integral(exp(-x**2), (x, 0, oo)),
   Integral(exp(-x**2), (x, 0, oo)).doit())
Out[12]:
$\displaystyle \int\limits_{0}^{\infty} e^{- x^{2}}\, dx = \frac{\sqrt{\pi}}{2}$

ガウス積分は,積分の上限が $\infty$ のときにだけ解析的に積分できる例。

積分範囲が $0$ から一般に $x$ までだと積分できない(結果が初等関数で表せない)。実際にやってみると…

In [13]:
Eq(Integral(exp(-t**2), (t, 0, x)),
   Integral(exp(-t**2), (t, 0, x)).doit())
Out[13]:
$\displaystyle \int\limits_{0}^{x} e^{- t^{2}}\, dt = \frac{\sqrt{\pi} \operatorname{erf}{\left(x \right)}}{2}$

参考:誤差関数

$\operatorname{erf} (x)$ は「誤差関数」と呼ばれ,これが定義:

\begin{eqnarray}
\operatorname{erf} (x) &\equiv& \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} \, dt
\end{eqnarray}

ガウス積分に関連した積分

$$I(m) \equiv \int_{0}^{\infty} x^m e^{-x^2 } dx$$

In [14]:
def I(m):
    return integrate(x**m * exp(-x**2), (x, 0, oo))
In [15]:
I(0)
Out[15]:
$\displaystyle \frac{\sqrt{\pi}}{2}$
In [16]:
I(2)
Out[16]:
$\displaystyle \frac{\sqrt{\pi}}{4}$
In [17]:
I(4)
Out[17]:
$\displaystyle \frac{3 \sqrt{\pi}}{8}$
In [18]:
I(6)
Out[18]:
$\displaystyle \frac{15 \sqrt{\pi}}{16}$

$m = 2 n$ ($n$ は整数) の場合を推測するために,$I(0)$ の値で割ってみる。

In [19]:
I(2)/I(0)
Out[19]:
$\displaystyle \frac{1}{2}$
In [20]:
I(4)/I(0)
Out[20]:
$\displaystyle \frac{3}{4}$
In [21]:
I(6)/I(0)
Out[21]:
$\displaystyle \frac{15}{8}$

ということは,

\begin{eqnarray}
I(2) &=& 1\times \frac{1}{2} \times I(0), \\
I(4) &=& \frac{3\cdot 1}{2^2} \times I(0), \\
I(6) &=& \frac{5\cdot3\cdot 1}{2^3} \times I(0), \dots
\end{eqnarray}

だから,

$$\displaystyle I(2 n) = \frac{(2n-1)!!}{2^{n}} \frac{\sqrt{\pi}}{2}$$

と推測される。実際確かめてみると…

(SymPy では $n! = $ factorial(n),$n!! = $ factorial2(n)

In [22]:
# m >= 2 の偶数に対して,上記の 2n を m とおいて

def EvenI(m):
    return factorial2(m-1)/2**(m/2) * I(0)
In [23]:
# 例えば m = 8 のとき
EvenI(8) - I(8)
Out[23]:
$\displaystyle 0$

これで $m \geq 2$ が偶数の場合の $I(m)$ は求まった。

次に,$m$ が奇数($m = 2 n +1$)の場合の $I(m)$ の一般形を予想してみる。

In [24]:
I(1)
Out[24]:
$\displaystyle \frac{1}{2}$
In [25]:
I(3)
Out[25]:
$\displaystyle \frac{1}{2}$
In [26]:
I(5)
Out[26]:
$\displaystyle 1$
In [27]:
I(7)
Out[27]:
$\displaystyle 3$
In [28]:
I(3)/I(1)
Out[28]:
$\displaystyle 1$
In [29]:
I(5)/I(1)
Out[29]:
$\displaystyle 2$
In [30]:
I(7)/I(1)
Out[30]:
$\displaystyle 6$

以上のことから次のような推測ができる。

$$ I(2n+1) = n! \times I(1) $$