双曲線関数

モジュールのインポート

import matplotlib.pyplot as plt  
import numpy as np
import scienceplots
plt.style.use(['science', 'notebook'])
# rcPramsを使ってTeXのフォントをデフォルトにする
#plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
plt.rcParams['font.family'] = 'serif' # font familyの設定
plt.rcParams['mathtext.fontset'] = 'cm' # math fontの設定
plt.rcParams["font.size"] = 10

ユーザ関数

任意の数の1次元配列をフォーマット付出力するために,
def table(*args):
    n1, n2 = np.shape(args)
    for i in range(n2):
        [print(f'{args[j][i]:8.3f}',end=' ') for j in range(n1)]
        print("")
    return

双曲線関数の計算

双曲線関数 $\sinh \theta$,$\cosh \theta$,$\tanh \theta$, 三角関数 $\sin \theta$,$\cos \theta$,$\tan \theta$を求めて1次元配列を作り, いくつかサンプルした数値をフォーマット付出力すると,
q = 180.0/np.pi
thmin, thmax, nth = -2*np.pi, 2*np.pi, 361
th = np.linspace(thmin,thmax,nth)
sht = np.sinh(th)
cht = np.cosh(th)
tht = np.tanh(th)
st = np.sin(th)
ct = np.cos(th)
tt = np.tan(th)
print(f"{'th[deg]':>8s} {'sinh':>8s} {'cosh':>8s} {'tanh':>8s} {'sin':>8s} {'cos':>8s}")
table(th[::15]*q,sht[::15],cht[::15],tht[::15],st[::15],ct[::15])
 th[deg]     sinh     cosh     tanh      sin      cos
-360.000 -267.745  267.747   -1.000    0.000    1.000 
-330.000 -158.607  158.610   -1.000    0.500    0.866 
-300.000  -93.955   93.960   -1.000    0.866    0.500 
-270.000  -55.654   55.663   -1.000    1.000   -0.000 
-240.000  -32.964   32.979   -1.000    0.866   -0.500 
-210.000  -19.519   19.545   -0.999    0.500   -0.866 
-180.000  -11.549   11.592   -0.996   -0.000   -1.000 
-150.000   -6.818    6.891   -0.989   -0.500   -0.866 
-120.000   -3.999    4.122   -0.970   -0.866   -0.500 
 -90.000   -2.301    2.509   -0.917   -1.000    0.000 
 -60.000   -1.249    1.600   -0.781   -0.866    0.500 
 -30.000   -0.548    1.140   -0.480   -0.500    0.866 
   0.000    0.000    1.000    0.000    0.000    1.000 
  30.000    0.548    1.140    0.480    0.500    0.866 
  60.000    1.249    1.600    0.781    0.866    0.500 
  90.000    2.301    2.509    0.917    1.000    0.000 
 120.000    3.999    4.122    0.970    0.866   -0.500 
 150.000    6.818    6.891    0.989    0.500   -0.866 
 180.000   11.549   11.592    0.996    0.000   -1.000 
 210.000   19.519   19.545    0.999   -0.500   -0.866 
 240.000   32.964   32.979    1.000   -0.866   -0.500 
 270.000   55.654   55.663    1.000   -1.000   -0.000 
 300.000   93.955   93.960    1.000   -0.866    0.500 
 330.000  158.607  158.610    1.000   -0.500    0.866 
 360.000  267.745  267.747    1.000   -0.000    1.000 
十分大きな値に対しては,
threshold = 10
tt[tt>threshold] = np.inf
tt[tt<-threshold] = np.inf
双曲線関数を図示すると,
fig = plt.figure(figsize=(8, 6)) # グラフ領域の作成
plt.axis('square')
plt.grid(color = "gray", linestyle="--")
plt.minorticks_on() # #補助目盛りをつける
plt.xlim(thmin, thmax) # x軸範囲の設定
plt.ylim(thmin, thmax) # y軸範囲の設定
plt.xlabel(r"$x$", fontsize=14) # x軸のラベル設定
plt.ylabel(r"$f(x)$", fontsize=14) # y軸のラベル設定
plt.xticks(np.arange(-6, 7, step=1.0), fontsize=12)
plt.yticks(np.arange(-6, 7, step=1.0), fontsize=12)
plt.plot(th,sht, label=r'$f(x) = \sinh(x)$')
plt.plot(th,cht, label=r'$f(x) = \cosh(x)$')
plt.plot(th,tht, label=r'$f(x) = \tanh(x)$')
plt.legend(ncol=1, loc='lower right', fancybox=False, frameon = True)
plt.tight_layout()
fig.savefig('p1_ex01_hyperbolic.pdf')
plt.show()

双曲線関数と三角関数を比較して図示すると,
fig3, ax = plt.subplots(nrows=1, ncols=3, figsize=(14.5, 4.5)) # グラフ領域の作成,nrows=縦に並べる数,ncols=横に並べる数  
ax[0].plot(th,sht, label=r'$f(x) = \sinh(x)$')
ax[0].plot(th,st, label=r'$f(x) = \sin(x)$')
ax[1].plot(th,cht, label=r'$f(x) = \cosh(x)$')
ax[1].plot(th,ct, label=r'$f(x) = \cos(x)$')
ax[2].plot(th,tht, label=r'$f(x) = \tanh(x)$')
ax[2].plot(th,tt, label=r'$f(x) = \tan(x)$')
for i in range(3):
    ax[i].axis('square')
    ax[i].grid(color = "gray", linestyle="--")
    ax[i].minorticks_on() # #補助目盛りをつける
    ax[i].set_xlim(thmin, thmax) # x軸範囲の設定
    ax[i].set_ylim(thmin, thmax) # y軸範囲の設定
    ax[i].set_xlabel(r"$x$") # x軸のラベル設定
    ax[i].set_ylabel(r"$f(x)$") # y軸のラベル設定
    ax[i].set_xticks(np.arange(-6, 8, step=2.0))
    ax[i].set_yticks(np.arange(-6, 8, step=2.0))
    ax[i].legend(ncol=1, loc='lower right', fancybox=False, frameon = True) 
fig3.tight_layout()
fig3.savefig('p1_ex01_hyperbolic3.pdf')