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

参考:Matplotlib で初等関数のグラフを描く

旧「Python で初等関数のグラフを描く」改題。

モジュールの import とオプション設定

In [1]:
import matplotlib.pyplot as plt
import numpy as np

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

# font の設定
plt.rcParams['mathtext.fontset'] = 'cm'
plt.rcParams['font.family'] = 'serif'

べき関数

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

In [2]:
x = np.linspace(-5, 5, 1000)
y = x**(-1)
plt.plot(x, y)

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-10, 10);

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

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

以下では,y の絶対値がある程度以上(以下の例では abs(y) > 50)であれば,その点はグラフに描かないように「欠損値」np.nan に置き換えている。

In [3]:
x = np.linspace(-5, 5, 1000)

y = x**(-1)
y[abs(y) > 50] = np.nan
plt.plot(x, y)

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-10, 10);

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

In [4]:
plt.figure(figsize = [6.4, 6.4])
x = np.linspace(-5, 5, 1000)

plt.plot(x, x**(-2), linewidth = 2, label="$x^{-2}$")

# 不連続点をつなげないように
y = x**(-1)
y[abs(y) > 50] = np.nan
plt.plot(x, y, linewidth = 2, label="$x^{-1}$")

plt.plot(x, x**2, linewidth = 2, label="$x^2$")
plt.plot(x, x**3, linewidth = 2, label="$x^3$")

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-10, 10)

# x の目盛
plt.xticks(np.linspace(-5, 5, 11))
plt.xlabel('$x$', fontsize=12)

# グリッド(格子線)は 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);

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

In [5]:
plt.figure(figsize = [6.4, 4.8])
x = np.linspace(0, 5, 500)
plt.plot(x, np.sqrt(x), linewidth = 2, label="$\sqrt{x}$")
# x = 0 は除く。
x = np.linspace(0.0001, 5, 500)
plt.plot(x, 1/np.sqrt(x), linewidth = 2, label="$1/\sqrt{x}$")

# 表示範囲
plt.xlim(0, 5)
plt.ylim(0, 5)

# x の目盛
plt.xticks(np.linspace(0, 5, 6))
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(np.linspace(0, 5, 6))

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

plt.legend(fontsize = 12);

指数関数

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

In [6]:
plt.figure(figsize = [6.4, 4.8])
x = np.linspace(-5, 5, 200)
plt.plot(x, np.exp(-x), linewidth = 2, label="$e^{-x}$")
plt.plot(x, np.exp(x), linewidth = 2, label="$e^x$")

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-1, 30)

# x の目盛
plt.xticks(np.linspace(-5, 5, 11))
plt.xlabel('$x$', fontsize = 12)

# グリッド(格子線)は 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 = \tan x $ のグラフ例。

In [7]:
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
y = np.tan(x)
plt.plot(x, y)

# 横軸縦軸の表示範囲
plt.xlim(-2*np.pi, 2*np.pi)
plt.ylim(-10, 10);

$y=\tan x$ のグラフも,$y \rightarrow -\infty$ と $y \rightarrow +\infty$ を縦の直線でつないでしまう。

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

以下では,y の絶対値がある程度以上(以下の例では abs(y) > 30)であれば,その点はグラフに描かないように「欠損値」np.nan に置き換えている。

In [8]:
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
y = np.tan(x)
y[abs(y) > 30] = np.nan
plt.plot(x, y)

# 横軸縦軸の表示範囲
plt.xlim(-2*np.pi, 2*np.pi)
plt.ylim(-10, 10);

$ y = \sin x, \ \cos x, \ \tan x $ のグラフ例。$y = \tan x$ の不連続点をつなげないように。

In [9]:
plt.figure(figsize = [6.4, 6.4])
x = np.linspace(-2*np.pi, 2*np.pi+1, 200)

plt.plot(x, np.sin(x), linewidth = 2, label="$\sin x$")
plt.plot(x, np.cos(x), linewidth = 2, label="$\cos x$")

# 不連続点をつなげないように
y = np.tan(x)
y[abs(y) > 30] = np.nan
plt.plot(x, y, linewidth = 2, label="$\\tan x$")

# 表示範囲
plt.xlim(-2*np.pi, 2*np.pi+1)
plt.ylim(-5, 5)

# x の目盛
plt.xticks(
  np.linspace(-2*np.pi, 2*np.pi, 9), 
  ["$-2\pi$","$-3\pi/2$","$-\pi$","$-\pi/2$",
   "$0$","$\pi/2$","$\pi$","$3\pi/2$","$2\pi$"])
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(np.linspace(-5, 5, 11))

# グリッド(格子線)は 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 = 11);

逆三角関数

$y = \sin^{-1} x = \arcsin x =$ np.arcsin(x) の定義域は $-1 \leq x \leq 1$

$y = \cos^{-1} x = \arccos x =$ np.arccos(x) の定義域は $-1 \leq x \leq 1$

$y = \tan^{-1} x = \arctan x =$ np.arctan(x) の定義域は $-\infty < x < \infty$

In [10]:
x = np.linspace(-1, 1, 200)
plt.plot(x, np.arcsin(x), linewidth = 2, label="$\\arcsin x$")
plt.plot(x, np.arccos(x), linewidth = 2, label="$\\arccos x$")

# 表示範囲
plt.xlim(-1, 1)
plt.ylim(-np.pi/2, np.pi)

# x の目盛
plt.xticks(np.linspace(-1, 1, 11))
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(
  np.linspace(-np.pi/2, np.pi, 7), 
  ["$-\pi/2$", "", "$0$", "", "$\pi/2$", "", "$\pi$"])

# グリッド(格子線)は 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 [11]:
x = np.linspace(-30, 30, 1000)
plt.plot(x, np.arctan(x), linewidth = 2, label="$\\arctan x$")

# 表示範囲
plt.xlim(-30, 30)
plt.ylim(-np.pi/2, np.pi/2)

# x
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(
  np.linspace(-np.pi/2, np.pi/2, 5), 
  ["$-\pi/2$", "$-\pi/4$", "$0$", "$\pi/4$", "$\pi/2$"])

# グリッド(格子線)は 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 [12]:
plt.figure(figsize = [6.4, 4.8])
x = np.linspace(-1, 1, 200)
plt.plot(x, np.arcsin(x), linewidth = 2, label="$\\arcsin x$")
plt.plot(x, np.arccos(x), linewidth = 2, label="$\\arccos x$")

x = np.linspace(-10, 10, 200)
plt.plot(x, np.arctan(x), linewidth = 2, label="$\\arctan x$")

# 表示範囲
plt.xlim(-1, 1)
plt.ylim(-np.pi/2, np.pi)

# x の目盛
xticl = []
for i in range(-10, 11, 2):
    xticl.append(str(i))
    xticl.append("")
plt.xticks(np.linspace(-10, 10, 21), xticl[:-1])
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(
  np.linspace(-np.pi/2, np.pi, 7), 
  ["$-\pi/2$", "", "$0$", "", "$\pi/2$", "", "$\pi$"])

# グリッド(格子線)は 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 [13]:
x = np.linspace(-5, 5, 200)
plt.plot(x, np.sinh(x), linewidth = 2, label="$\\sinh x$")
plt.plot(x, np.cosh(x), linewidth = 2, label="$\\cosh x$")

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-50, 50)

# x の目盛
plt.xticks(np.linspace(-5, 5, 11))
plt.xlabel('$x$', fontsize = 12)

# グリッド(格子線)は 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 [14]:
x = np.linspace(-5, 5, 200)
plt.plot(x, np.tanh(x), linewidth = 2, label="$\\tanh x$")

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-1, 1)

# x の目盛
plt.xticks(np.linspace(-5, 5, 11))
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(np.linspace(-1, 1, 11))

# グリッド(格子線)は 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);

双曲線関数の値域はそれぞれ

\begin{eqnarray}
-\infty < &\sinh x& < \infty \\
1 \leq &\cosh x& < \infty \\
-1 \leq &\tanh x& \leq 1
\end{eqnarray}

あえて全部一緒にしてグラフを描くと…

In [15]:
plt.figure(figsize = [6.4, 6.4])
x = np.linspace(-5, 5, 200)
plt.plot(x, np.sinh(x), linewidth = 2, label="$\\sinh x$")
plt.plot(x, np.cosh(x), linewidth = 2, label="$\\cosh x$")
plt.plot(x, np.tanh(x), linewidth = 2, label="$\\tanh x$")

# 表示範囲
plt.xlim(-5, 5)
plt.ylim(-10, 10)

# x の目盛
plt.xticks(np.linspace(-5, 5, 11))
plt.xlabel('$x$', fontsize = 12)
# y
plt.yticks(np.linspace(-10, 10, 21))

# グリッド(格子線)は 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 [16]:
x = np.linspace(-20, 20, 1000)
plt.plot(x, np.arcsinh(x), linewidth = 2, label="$\sinh^{-1} x$")

x = np.linspace(1, 20, 500)
plt.plot(x, np.arccosh(x), linewidth = 2, label="$\cosh^{-1} x$")

# 表示範囲
plt.xlim(-20, 20)

# x 
plt.xlabel('$x$', fontsize = 12)

# グリッド(格子線)は 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 [17]:
# x = -1, 1 は除く
x = np.linspace(-0.99999, 0.99999, 10000)
plt.plot(x, np.arctanh(x), linewidth = 2, label="$\\tanh^{-1} x$")

# 表示範囲
plt.ylim(-6,6)

# x 
plt.xlabel('$x$', fontsize = 12)

# グリッド(格子線)は 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 [18]:
plt.figure(figsize = [6.4, 4.8])
x = np.linspace(-20, 20, 1000)
plt.plot(x, np.arcsinh(x), linewidth = 2, label="$\\sinh^{-1} x$")

x = np.linspace(1, 20, 500)
plt.plot(x, np.arccosh(x), linewidth = 2, label="$\\cosh^{-1} x$")

# x = -1, 1 は除く
x = np.linspace(-0.99999, 0.99999, 10000)
plt.plot(x, np.arctanh(x), linewidth = 2, label="$\\tanh^{-1} x$")

# 表示範囲
plt.xlim(-10, 10)
plt.ylim(-5, 5)
# x の目盛
xticl = []
for i in range(-10, 11, 2):
    xticl.append(str(i))
    xticl.append("")
plt.xticks(np.linspace(-10, 10, 21), xticl[:-1])
plt.xlabel('$x$', fontsize = 12)
# y の目盛
plt.yticks(np.linspace(-5,5,11))

# グリッド(格子線)は 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);