必要なモジュールの import
from sympy.abc import *
from sympy import *
# SymPy Plotting Backends (SPB)
from spb import *
# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']
mathtext.fontset
の設定
# グラフを描くためではなくデフォルト設定のため
import matplotlib.pyplot as plt
plt.rcParams['mathtext.fontset'] = 'cm'
楕円の面積
SymPy Plotting Backends で長半径 $a$,単半径 $b$ の楕円を描く例。(一部が微妙にカクカクするので,n
を大きめに。)
a = 2
b = 1
p = plot_geometry(
Ellipse(Point(0, 0), hradius=a, vradius=b),
{"facecolor": "yellow", "edgecolor":"blue", "lw":2},
aspect = 'equal', size=(6.4,6.4), n=500, show=False);
fig, ax = p.fig, p.ax
fig.tight_layout()
ax.grid(linestyle = 'dotted')
# 表示範囲
ax.set_xlim(-a-0.5, a+0.5)
ax.set_ylim(-b-0.5, b+0.5)
# 目盛設定
ax.set_xticks([-a, 0, a])
ax.set_xticklabels(labels = ["$-a$", "$0$", "$a$"], fontsize=14)
ax.set_yticks([-b, 0, b])
ax.set_yticklabels(labels = ["$-b$", "$0$", "$b$"], fontsize=14)
# x 軸,y 軸
ax.axhline(0, color='lightgray', dashes=(3, 3), linewidth=0.6)
ax.axvline(0, color='lightgray', dashes=(3, 3), linewidth=0.6);
$\displaystyle \frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$ の楕円の面積。
$a > b > 0$ として $a$ は長半径,$b$ は短半径と呼ぶ。離心率 $e$ を使って書くと,$b = a \sqrt{1-e^2}$。
$\displaystyle \frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$ より $\displaystyle y = \pm b \sqrt{1-\frac{x^2}{a^2}}$。上半分の面積,つまり $\displaystyle y = b \sqrt{1-\frac{x^2}{a^2}}$ と $x$ 軸で囲まれる部分の面積を求めて2倍すればよいから,
\begin{eqnarray}
S &=& 2 \int_{-a}^a b \sqrt{1 –\frac{x^2}{a^2}} dx \\
&&\qquad (x \equiv a \sin\theta, \ \sqrt{1 -\frac{x^2}{a^2}} = \cos\theta, \ dx = a \cos\theta d\theta)\\
&=& 2 a b \int_{-\pi/2}^{\pi/2} \cos^2\theta d\theta\\
&=& a b \int_{-\pi/2}^{\pi/2} (1 + \cos 2\theta) d\theta \\
&=&a b \left[ \theta + \frac{1}{2}\sin 2\theta\right]_{-\pi/2}^{\pi/2} \\
&=& \pi a b
\end{eqnarray}
SymPy で直接積分してみると,($a>0, b>0$ を仮定して)
var('a b e', positive = True)
var('x y')
def f(x):
return b*sqrt(1-x**2/a**2)
Eq(
2*Integral(f(x), (x, -a, a)),
2*integrate(f(x), (x, -a, a))
)
楕円の周
a = 2
b = 1
p = plot_geometry(
Ellipse(Point(0, 0), hradius=a, vradius=b),
{"color":"blue", "lw":2}, is_filled = False,
aspect = 'equal', size=(6.4,6.4), n=500, show=False);
fig, ax = p.fig, p.ax
fig.tight_layout()
ax.grid(linestyle = 'dotted')
# 表示範囲
ax.set_xlim(-a-0.5, a+0.5)
ax.set_ylim(-b-0.5, b+0.5)
# 目盛設定
ax.set_xticks([-a, 0, a])
ax.set_xticklabels(labels = ["$-a$", "$0$", "$a$"], fontsize=14)
ax.set_yticks([-b, 0, b])
ax.set_yticklabels(labels = ["$-b$", "$0$", "$b$"], fontsize=14)
# x 軸,y 軸
ax.axhline(0, color='lightgray', dashes=(3, 3), linewidth=0.6)
ax.axvline(0, color='lightgray', dashes=(3, 3), linewidth=0.6);
楕円の式を媒介変数表示すると,($x = a \cos\theta, \ y = b \sin\theta$ とするところを趣向を変えて) $x = a \sin\theta, \ y = b \cos\theta$。$0 \le \theta \le \pi/2$ の長さを4倍すればよいから,
\begin{eqnarray}
L &=& 4 \int_0^{\frac{\pi}{2}} \sqrt{\left(\frac{dx}{d\theta}\right)^2 + \left(\frac{dy}{d\theta}\right)^2} \,d\theta\\
&=& 4 \int_0^{\frac{\pi}{2}} \sqrt{a^2 \cos^2\theta + b^2 \sin^2\theta} \,d\theta \\
&=& 4 a \int_0^{\frac{\pi}{2}} \sqrt{\cos^2\theta + (1-e^2) \sin^2\theta} \,d\theta \\
&=& 4 a \int_0^{\frac{\pi}{2}} \sqrt{1 -e^2 \sin^2\theta} \,d\theta \\
&=& 4 a E(e)
\end{eqnarray}
ここで
$\displaystyle E(k) \equiv \int_0^{\frac{\pi}{2}} \sqrt{1 -k^2 \sin^2\theta} \,d\theta$ は第二種完全楕円積分である。
要するに,楕円の周を求める積分は初等関数で表すことができない。
SymPy では,第二種完全楕円積分は elliptic_e(m)
として組み込まれている。
def E(e):
return elliptic_e(e**2)
離心率 $e$ は $0 \le e < 1$ であるから…
E(0)
E(1)
$0 \le e \le 1$ の範囲で関数 $E(e)$ のグラフを描いておく。
# plot(E(e), (e, 0, 1)) と書きたいところだが...
# plot(E(x), (x, 0, 1)) として (x) を省略して...
plot(E, (x, 0, 1), xlabel="$e$", ylabel="$E(e)$");
plot(E(e), (e, 0, 1), xlabel="$e$", ylabel="$E(e)$");
# と書くと,以下のような UserWarning が最初に出ますが,
# 文句を言いつつもグラフを描いてくれます。
回転楕円体の表面積 1.
SymPy Plotting Backends で回転楕円体を描く例。
var('a b e', positive = True)
var('x y')
def f(x):
return b*sqrt(1-x**2/a**2)
a = 2
b = 1
# 回転楕円体の表面
p1 = plot3d_parametric_surface(
x, f(x)*cos(t), f(x)*sin(t), (x, -a, a), (t, 0, 2*pi),
{'cmap':'Blues', "alpha":0.6},
use_cm=True, color_func=-f(x)*cos(t), colorbar=False,
axis=False, size=(6.4, 6.4), n=60,
xlim=(-2.2,2.2), ylim=(-1.2, 1.2), zlim=(-1.2, 1.2),
aspect="equal", show=False
);
p2 = plot3d_parametric_line(
# x 軸
(x, 0, 0, (x, -2.5, a), "", {"color":"blue","zorder":0, "lw":2}),
(x, 0, 0, (x, a, 2.5), "", {"color":"blue","zorder":10,"lw":2}),
# いわゆる「y 軸」,実は z 軸
(0, 0, z, (z, -1.5, b), "", {"color":"red","zorder":0, "lw":0.7}),
(0, 0, z, (z, b, 1.5), "", {"color":"red","zorder":10,"lw":0.7}),
# いわゆる「y = y(x)」,実は z = z(x)
(x, 0, f(x), (x, -a, -a+0.1), "", {"color":"darkblue","zorder":0, "lw":2}),
(x, 0, f(x), (x, -a+0.1, a), "", {"color":"darkblue","zorder":10,"lw":2}),
use_cm=False, show=False
)
(p1+p2).show();
$\displaystyle y = b \sqrt{1-\frac{x^2}{a^2}} = \sqrt{b^2 -(1-e^2) x^2}$ を $x$ 軸のまわりに回転してできる回転楕円体の表面積は
\begin{eqnarray}
S &=& \int_{-a}^a 2\pi y \sqrt{1+ \left(\frac{dy}{dx}\right)^2}\,dx \\
\end{eqnarray}
… ということで,$y$ を定義し,
$$\displaystyle f \equiv 2 \pi y \sqrt{1+\left(\frac{dy}{dx}\right)^2} = 2 \pi \sqrt{y^2 + y^2 \left(\frac{dy}{dx}\right)^2}$$
を計算すると…
var('a b e', positive = True)
var('x y')
y = b*sqrt(1 - (1-e**2)*x**2/b**2)
f = 2*pi*sqrt(y**2 + y**2*diff(y,x)**2)
f = simplify(f)
f
以上の結果をじっとみて,
$$f = 2 \pi b\sqrt{1 -\frac{e^2}{a^2} x^2}$$
となることがわかれば,以下のように積分してやると…
f = 2*pi*b*sqrt(1-e**2*x**2/a**2)
ans = integrate(f, (x, -a, a))
simplify(ans)
つまり,この回転楕円体の表面積 $S$ は
\begin{eqnarray}
S &=& 2 \pi ab\left(\sqrt{1-e^2} + \frac{\arcsin e}{e} \right) \\
&=& 2 \pi \left(b^2 + ab \,\frac{\arcsin e}{e} \right)
\end{eqnarray}
確かに定積分できることがわかったので,置換積分の立場から確認してみよう。そもそも計算するのは,
int1 = Integral(f, (x, -a, a))
int1
$\displaystyle \frac{e x}{a} \rightarrow t$ と置換してやると…
int2 = int1.transform(e*x/a, t)
int2
つまり,基本的に $\displaystyle \int \sqrt{1-t^2} \, dt$ がわかればよい。これは以下のように積分できる。
Eq(Integral(sqrt(1-t**2), t),
integrate(sqrt(1-t**2), t)
)
SymPy では苦もなく出てくるが,人力では以下のように部分積分してみると…
\begin{eqnarray}
I &\equiv& \int \sqrt{1-t^2}\, dt \\
&=& t \sqrt{1-t^2} -\int t \, \frac{d}{dt} \sqrt{1-t^2}\,dt \\
&=& t \sqrt{1-t^2} + \int \frac{t^2}{\sqrt{1-t^2}}\,dt \\
&=& t \sqrt{1-t^2} + \int \frac{1}{\sqrt{1-t^2}} \,dt -\int \frac{1-t^2}{\sqrt{1-t^2}}\, dt \\
&=& t \sqrt{1-t^2} + \int \frac{1}{\sqrt{1-t^2}} \,dt -I \\
\therefore\ \ I &=& \frac{1}{2} \left(t \sqrt{1-t^2} + \int \frac{1}{\sqrt{1-t^2}} \,dt \right) \\
&=& \frac{t\sqrt{1-t^2}}{2} + \frac{\sin^{-1} t}{2}
\end{eqnarray}
定積分も以下のように…
int2.doit()
simplify(_)
回転楕円体の表面積 2.
var('a b e', positive = True)
var('x y')
def g(z):
return a*sqrt(1-z**2/b**2)
a = 2
b = 1
# 回転楕円体の表面
p1 = plot3d_parametric_surface(
g(z)*cos(t), g(z)*sin(t), z, (z, -b, b), (t, 0, 2*pi),
{'cmap':'Reds', 'alpha':0.5},
use_cm=True, color_func=-g(z)*sin(t), colorbar=False,
axis=False, size=(6.4, 6.4), n=80,
xlim=(-2.2,2.2), ylim=(-2.2, 2.2), zlim=(-1.2,1.2),
aspect="equal", show=False
);
p2 = plot3d_parametric_line(
# x 軸
(x, 0, 0, (x, -2.5, a), "", {"color":"blue","zorder":0, "lw":0.7}),
(x, 0, 0, (x, a, 2.5), "", {"color":"blue","zorder":10, "lw":0.7}),
# いわゆる「y 軸」,実は z 軸
(0, 0, z, (z, -2, b), "", {"color":"red","zorder":0, "lw":2}),
(0, 0, z, (z, b, 2), "", {"color":"red","zorder":10,"lw":2}),
# いわゆる「x = x(y)」,実は x = x(z)
(g(z), 0, z, (z, -2, -0.5), "", {"color":"darkred","zorder":0,"lw":2}),
(g(z), 0, z, (z, -0.5, b), "", {"color":"darkred","zorder":10,"lw":2}),
use_cm=False, show=False
)
(p1+p2).show();
$\displaystyle x = a \sqrt{1-\frac{y^2}{b^2}}= \frac{\sqrt{b^2-{y^2}}}{\sqrt{1-e^2}}$ を $y$ 軸のまわりに回転してできる回転楕円体の表面積は
\begin{eqnarray}
S &=& \int_{-b}^b 2\pi x \sqrt{1+ \left(\frac{dx}{dy}\right)^2}\,dy \\
\end{eqnarray}
var('a b e', positive = True)
var('x y')
x = a*sqrt(1 - y**2/b**2)
f = 2*pi*sqrt(x**2 + x**2*diff(x,y)**2)
f = simplify(f)
f
以上の結果をじっとみて,
$$f = 2 \pi a\sqrt{1 + \frac{a^2 e^2}{b^4} y^2}$$
となることがわかれば,以下のように積分してやると…
f = 2*pi*a*sqrt(1 + a**2 * e**2*y**2/b**4)
ans = integrate(f, (y, -b, b))
simplify(ans)
つまり,この回転楕円体の表面積 $S$ は
\begin{eqnarray}
S &=& 2 \pi \left(a \sqrt{a^2 e^2 + a^2 (1-e^2)} +
b^2 \frac{\operatorname{asinh} \frac{a e}{b}}{e} \right) \\
&=& 2 \pi \left(a^2 +
\frac{b^2}{e} \operatorname{asinh} \frac{e}{\sqrt{1-e^2}} \right) \\
&=& 2 \pi \left(a^2 +
b^2 \frac{\operatorname{atanh}e}{e} \right)
\end{eqnarray}
なお,$\operatorname{asinh}$ すなわち $\sinh^{-1}$ と $\operatorname{atanh}$ すなわち $\tanh^{-1}$ の関係については,
\begin{eqnarray}
y &\equiv& \operatorname{asinh} \frac{e}{\sqrt{1-e^2}} \\
\sinh y &=& \frac{e}{\sqrt{1-e^2}} \\
\cosh y &=& \sqrt{1 + \sinh^2 y} = \frac{1}{\sqrt{1-e^2}} \\
\therefore\ \ \tanh y &=& \frac{\sinh y}{\cosh y} = e \\
\therefore\ \ y &=& \operatorname{atanh} e = \operatorname{asinh} \frac{e}{\sqrt{1-e^2}}
\end{eqnarray}
確かに定積分できることがわかったので,置換積分の立場から確認してみよう。そもそも計算するのは,
var('a b e', positive = True)
var('x y')
int1 = Integral(f, (y, -b, b))
int1
$\displaystyle \frac{a e y}{b^2} \rightarrow t$ と置換してやると…
int2 = int1.transform(a*e*y/b**2, t)
int2
つまり,基本的に $\displaystyle \int \sqrt{1+t^2} \, dt$ がわかればよい。これは以下のように積分できる。
Eq(Integral(sqrt(1+t**2), t),
integrate(sqrt(1+t**2), t)
)
SymPy では苦もなく出てくるが,人力では以下のように部分積分してみると…
\begin{eqnarray}
I &\equiv& \int \sqrt{1+t^2}\, dt \\
&=& t \sqrt{1+t^2} -\int t \, \frac{d}{dt} \sqrt{1+t^2}\,dt \\
&=& t \sqrt{1-t^2} -\int \frac{t^2}{\sqrt{1+t^2}}\,dt \\
&=& t \sqrt{1-t^2} + \int \frac{1}{\sqrt{1+t^2}} \,dt -\int \frac{1+t^2}{\sqrt{1+t^2}}\, dt \\
&=& t \sqrt{1-t^2} + \int \frac{1}{\sqrt{1+t^2}} \,dt -I \\
\therefore\ \ I &=& \frac{1}{2} \left(t \sqrt{1+t^2} + \int \frac{1}{\sqrt{1+t^2}} \,dt \right) \\
&=& \frac{t\sqrt{1+t^2}}{2} + \frac{\sinh^{-1} t}{2}
\end{eqnarray}
定積分も以下のように…
int2.doit()
simplify(_)
回転楕円体の体積 1.
$\displaystyle y = b \sqrt{1-\frac{x^2}{a^2}}$ を $x$ 軸のまわりに回転してできる回転楕円体の体積は
\begin{eqnarray}
V &=& \int_{-a}^a \pi y^2 \,dx \\
\end{eqnarray}
$\displaystyle y = b \sqrt{1-\frac{x^2}{a^2}}$ とおいて…
var('a b e', positive = True)
var('x y')
y = b*sqrt(1-x**2/a**2)
y
Eq(Integral(pi*y**2, (x, -a, a)),
integrate(pi*y**2, (x, -a, a)))
回転楕円体の体積 2.
$\displaystyle x = a \sqrt{1-\frac{y^2}{b^2}}$ を $y$ 軸のまわりに回転してできる回転楕円体の体積は
\begin{eqnarray}
V &=& \int_{-b}^b \pi x^2 \,dy \\
\end{eqnarray}
$\displaystyle x = a \sqrt{1-\frac{y^2}{b^2}}$ とおいて…
var('a b e', positive = True)
var('x y')
x = a*sqrt(1-y**2/b**2)
x
Eq(Integral(pi*x**2, (y, -b, b)),
integrate(pi*x**2, (y, -b, b)))
楕円および楕円体にまつわるエトセトラ
- 楕円の周は第二種完全楕円積分で表される。(初等関数ではあらわせない。)
- 回転楕円体の表面積を求める際には,以下のような簡単な無理関数の積分がでてくるので,しっかりやっておく。
$$\int \sqrt{1-t^2} \, dt, \quad \int \sqrt{1+t^2} \, dt$$
答えは逆三角関数や逆双曲線関数を含むからね。