Return to 参考:初等関数のグラフを描く

参考:SymPy Plotting Backends で初等関数のグラフを描く

モジュールの import といくつかの設定

Python の SymPy + SymPy Plotting Backends (SPB) で初等関数のグラフを描く。関数は全て SymPy の関数を使う。NumPy は使わない方針で。

In [1]:
from sympy.abc import *
from sympy import *
# SymPy Plotting Backends
from spb import *

# π
Pi = float(pi)

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

# グラフを描くためではなくデフォルト設定のため
import matplotlib.pyplot as plt
# font の設定
plt.rcParams['font.family'] = 'serif'
plt.rcParams['mathtext.fontset'] = 'cm'

べき関数

まず,$y = x^{-1}$ のグラフ。

In [2]:
plot(1/x, (x, -5, 5), 
     xlim = (-5, 5), ylim = (-10, 10));

$y=x^{-1}$ のグラフの $x=0$ 付近,$y \rightarrow -\infty$ と $y \rightarrow +\infty$ を縦の直線でつないでしまう。

不連続点をつなげない対策

detect_poles=True オプションをつけて,さらに n の値を大きめにすると,以下のようになる。

In [3]:
plot(1/x, (x, -5, 5), 
     xlim = (-5, 5), ylim = (-10, 10), 
     detect_poles = True, n = 1e4);

$y = x^{-2}, \ x^{-1}, \ x^2, \ x^3$ のグラフ例。$y = x^{-1}$ の不連続点をつなげないように。

In [4]:
plot(x**(-2), x**(-1), x**2, x**3, (x, -5, 5), 
     xlim = (-5, 5), ylim = (-10, 10), size = (6.4, 6.4),
     detect_poles = True, n = 1e4);

以下では「参考:初等関数のグラフを描く」シリーズの他のページの見てくれに合わせて,いくつかオプションを設定してグラフを描く例を紹介する。

In [5]:
p = plot((x**(-2), '$x^{-2}$'), 
         (x**(-1), '$x^{-1}$'),
         (x**2, '$x^2$'),
         (x**3, '$x^3$'), (x, -5, 5), 
         xlim = (-5, 5), ylim = (-10, 10), 
         detect_poles = True, n = 1e4, 
         size = (6.4, 6.4), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted に
ax.grid(ls = ':')
# x軸 y軸は dashed に
ax.axhline(0, c='k', ls = '--', lw=0.5)
ax.axvline(0, c='k', ls = '--', lw=0.5)

ax.legend(fontsize = 12);

$\displaystyle y = \sqrt{x}, \ \frac{1}{\sqrt{x}}$ のグラフ例。

In [6]:
# x = 0 は除く
p = plot((sqrt(x), '$\\sqrt{x}$', (x, 0, 5)), 
         (1/sqrt(x), '$1/\\sqrt{x}$', (x, 0.0001, 5)), 
         xlim = (0, 5), ylim = (0, 5), 
         size = (6.4, 4.8), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x 
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted に
ax.grid(ls = ':')

plt.legend(fontsize = 12);

指数関数

$y = e^{-x}, \ e^x$ のグラフ例。

In [7]:
p = plot(exp(-x), exp(x), (x, -5, 5), 
         xlim = (-5, 5), ylim = (-1, 30), 
         size = (6.4, 4.8), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted に
ax.grid(ls = ':')
# x軸 y軸は dashed に
ax.axhline(0, c='k', ls = '--', lw=0.5)
ax.axvline(0, c='k', ls = '--', lw=0.5)

ax.legend(fontsize = 14);

三角関数

$ y = \sin x, \ \cos x, \ \tan x $ のグラフ例。$\tan x$ の不連続点の処理と,$x$ 軸の目盛を $\pi/2$ ごとにしてラベルをつける例。

In [8]:
p = plot((sin(x), "$\\sin x$"), 
         (cos(x), "$\\cos x$"), 
         (tan(x), "$\\tan x$"), (x, -2*pi, 2*pi+1), 
         xlim = (-2*pi, 2*pi+1), ylim = (-5, 5), 
         size = (6.4, 6.4), show=False,
         # 不連続点をつなげない対策
         detect_poles = True)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks(
    [i*Pi/2 for i in range(-4, 5)], 
    ["$-2 \pi$", "$-3 \pi/2$", "$-\pi$", "$-\pi/2$","$0$",
     "$\pi/2$", "$\pi$", "$3 \pi/2$", "$2 \pi$"])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks([i for i in range(-5, 6)])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize = 12);

逆三角関数

$y = \sin^{-1} x = \arcsin x =$ asin(x) の定義域は $-1 \leq x \leq 1$
$y = \cos^{-1} x = \arccos x =$ acos(x) の定義域は $-1 \leq x \leq 1$
$y = \tan^{-1} x = \arctan x =$ atan(x) の定義域は $-\infty < x < \infty$

In [9]:
p = plot((asin(x), "$\\arcsin x$"), 
         (acos(x), "$\\arccos x$"), (x, -1, 1), 
         xlim = (-1, 1), ylim=(-0.5, 1), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([0.2*i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks(
    [i*Pi/4 for i in range(-2, 5)], 
    ["$-\pi/2$", "", "$0$", "", "$\pi/2$", "", "$\pi$"])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

In [10]:
p = plot(atan(x), "$\\arctan x$", (x, -30, 30), 
         xlim = (-30, 30), ylim=(-pi/2, pi/2), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x 
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks(
    [i*Pi/4 for i in range(-2, 3)], 
    ["$-\pi/2$", "$-\pi/4$", "$0$", "$\pi/4$", "$\pi/2$"])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

3つの逆三角関数を一緒にグラフにすると…

In [11]:
p = plot((asin(x), "$\\arcsin x$", (x, -1, 1)), 
         (acos(x), "$\\arccos x$", (x, -1, 1)), 
         (atan(x), "$\\arctan x$", (x, -10, 10)), 
         xlim = (-10, 10), ylim = (-pi/2, pi), 
         size = (6.4, 4.8), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
xticl = []
for i in range(-10, 11, 2):
    xticl.append(str(i))
    xticl.append("")
ax.set_xticks([i for i in range(-10, 11)], xticl[:-1])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks(
    [i*Pi/4 for i in range(-2, 5)], 
    ["$-\pi/2$", "", "$0$", "", "$\pi/2$", "", "$\pi$"])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

双曲線関数

$y = \sinh x, \ \cosh x, \ \tanh x$ のグラフ例。

In [12]:
p = plot((sinh(x), "$\\sinh x$"), 
         (cosh(x), "$\\cosh x$"), (x, -5, 5), 
         xlim = (-5, 5), ylim = (-50, 50), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

In [13]:
p = plot((tanh(x), "$\\tanh x$"), (x, -5, 5), legend = True,
         xlim = (-5, 5), ylim=(-1, 1), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks([0.2*i for i in range(-5, 6)])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

3つの双曲線関数を一緒にグラフにすると…

In [14]:
p = plot((sinh(x), "$\\sinh x$"), 
         (cosh(x), "$\\cosh x$"), 
         (tanh(x), "$\\tanh x$"), (x, -5, 5), 
         xlim = (-5, 5), ylim = (-10, 10), 
         size = (6.4, 6.4), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
ax.set_xticks([i for i in range(-5, 6)])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks([i for i in range(-10, 11)])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

逆双曲線関数

$ y = \sinh^{-1} x = \mbox{arsinh}\ x = $ np.arcsinh(x) の定義域は $ -\infty < x < \infty$

$ y = \cosh^{-1} x = \mbox{arcosh}\ x = $ np.arccosh(x) の定義域は $ 1 \leq x < \infty$

$ y = \tanh^{-1} x = \mbox{artanh}\ x = $ np.arctanh(x) の定義域は $ -1 < x < 1$

In [15]:
p = plot((asinh(x), "$\\sinh^{-1}\, x$", (x, -20, 20)), 
         (acosh(x), "$\\cosh^{-1}\, x$", (x, 1, 20)),
         xlim = (-20, 20), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x 
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

In [16]:
# x = -1, 1 は除く
p = plot(atanh(x), "$\\tanh^{-1}\, x$", (x, -0.99999, 0.99999), 
         ylim=(-6, 6), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x 
ax.set_xlabel('$x$', fontsize = 12)
# y 
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);

3つの逆双曲線関数を一緒にしてグラフにすると…

In [17]:
p = plot((asinh(x), "$\\sinh^{-1}\, x$", (x, -20, 20)), 
         (acosh(x), "$\\cosh^{-1}\, x$", (x, 1, 20)),
         (atanh(x), "$\\tanh^{-1}\, x$", (x, -0.99999, 0.99999)), 
         xlim = (-10, 10), ylim = (-5, 5), 
         size = (6.4, 4.8), show = False)

fig, ax = p.fig, p.ax
fig.tight_layout()

# x の目盛
xticl = []
for i in range(-10, 11, 2):
    xticl.append(str(i))
    xticl.append("")
ax.set_xticks([i for i in range(-10, 11)], xticl[:-1])
ax.set_xlabel('$x$', fontsize = 12)
# y の目盛
ax.set_yticks([i for i in range(-5, 6)])
ax.set_ylabel('')

# グリッド(格子線)は dotted で
plt.grid(ls = ':')
# x軸 y軸 は dashed で
plt.axhline(0, c='k', ls = '--', lw=0.5)
plt.axvline(0, c='k', ls = '--', lw=0.5)

plt.legend(fontsize=12);