三角関数の計算とグラフ描画

三角関数の計算とグラフ描画

mathモジュールの三角関数

 mathモジュールの math.sin(x), math.cos(x), math.tan(x) は、それぞれ引数 x の正弦(サイン)余弦(コサイン)正接(タンジェント)を返します。引数には整数と浮動小数点を渡せますが、複素数を指定することはできません。

角度をラジアンで指定

 math.sin(x), math.cos(x), math.tan(x) は受け取った角度 x をラジアンとして処理します。

# https://python.atelierkobato.com/sin/

import math

# 円周率をpiという名前で定義
pi = math.pi

a = math.sin(pi/6)
b = math.cos(pi/6)
c = math.tan(pi/6)

print("sin(pi/6) =", a)
print("cos(pi/6) =", b)
print("tan(pi/6) =", c)
sin(pi/6) = 0.49999999999999994
cos(pi/6) = 0.8660254037844387
tan(pi/6) = 0.5773502691896257

 math.tan(x) の扱いには注意が必要です。本来ならば、$\tan(\pi/2)$ は値をもたないはずですが ($\displaystyle\lim_{x\rightarrow \pm\pi/2}\tan x=\mp\infty$)、math.tan(x) は引数に pi/2 を渡すと非常に大きな値を返してきます:

# https://python.atelierkobato.com/sin/

import math

# 円周率をpiという名前で定義
pi = math.pi

x = math.tan(pi/2)

print("tan(pi/2) =", x)
tan(pi/2) = 1.633123935319537e+16

 引数が pi/2 の整数倍でも同じことが起こります。内部処理では、三角関数を級数展開によって計算させているので、このように若干の誤差を伴います。プログラムの内容によっては、引数に pi/2 の整数倍が渡されたときは浮動小数点数型の inf (無限大) や -inf (負の無限大) を返すような関数を作るなどの工夫が必要になる場合があります。
 

角度を度数法単位で指定

 度数法単位 (degree) で表された角度の三角関数を計算するときには、math.radians() を使って角度をラジアンに変換してから、math.sin(), math.cos(), math.tan() に渡します。

# https://python.atelierkobato.com/sin/

import math

# sin60°, cos60°, tan60°を計算
a = math.sin(math.radians(60))
b = math.cos(math.radians(60))
c = math.tan(math.radians(60))

print("sin60°=", a)
print("cos60°=", b)
print("tan60°=", c)
sin60°= 0.8660254037844386
cos60°= 0.5000000000000001
tan60°= 1.7320508075688767

 これだと引数の指定の仕方が面倒なので、度数法単位の角度をそのまま渡せるような関数を作っておくのも1つの方法です:

# https://python.atelierkobato.com/sin/

# degreeで引数を指定する三角関数の定義
def dsin(x):
    import math
    return math.sin(math.radians(x))

def dcos(x):
    import math
    return math.cos(math.radians(x))

def dtan(x):
    import math
    return math.tan(math.radians(x))

a = dsin(60)
b = dcos(60)
c = dtan(60)

print("sin60°=", a)
print("cos60°=", b)
print("tan60°=", c)
sin60°= 0.8660254037844386
cos60°= 0.5000000000000001
tan60°= 1.7320508075688767

 

NumPyの三角関数

 NumPyを活用した三角関数についても簡単に解説しておきます。numpy.sin(x), numpy.cos(x), numpy.tan(x) は、それぞれ引数 x の正弦(サイン)、余弦(コサイン)、正接(タンジェント)を返します。引数には整数・浮動小数点数の他に、複素数や配列 (ndarray) を渡すことができます。

引数に配列を指定

 引数に配列を指定する例です:

# https://python.atelierkobato.com/sin/

import numpy as np

# 円周率をpiという名前で定義
pi = np.pi

x = np.array([pi/4, pi/2, pi])

sin_x = np.sin(x)
cos_x = np.cos(x)
tan_x = np.tan(x)

print(sin_x)
print(cos_x)
print(tan_x)
sin60°= 0.8660254037844386
cos60°= 0.5000000000000001
tan60°= 1.7320508075688767

 

引数に複素数を指定

 複素数の三角関数の計算例も載せておきます。
 複素変数 $z$ の三角関数は次のように定義されています:
 
\[\sin z=\frac{e^{iz}-e^{-iz}}{2i},\quad \ \cos z=\frac{e^{iz}+e^{-iz}}{2},\quad \tan z=\frac{\sin z}{\cos z}\] 

# https://python.atelierkobato.com/sin/

import numpy as np

# 複素数を要素にもつ配列を用意
z = np.array([1j, 1+1j, 1+2J])

# 配列の各要素の三角関数を計算
sin_z = np.sin(z)
cos_z = np.cos(z)
tan_z = np.tan(z)

print(sin_z)
print(cos_z)
print(tan_z)
[0. +1.17520119j 1.29845758+0.63496391j 3.16577851+1.95960104j]
[1.54308063-0.j 0.83373003-0.98889771j 2.03272301-3.0518978j]
[0. +0.76159416j 0.27175259+1.08392333j 0.03381283+1.01479362j]

 

Matplotlibで三角関数のグラフを描画する

 Matplotlib.pyplot を読み込んで三角関数のグラフを描画させるサンプルコードを載せておきます。

# https://python.atelierkobato.com/sin/

# y = sinx のグラフ

# モジュールをインポート
import numpy as np
import matplotlib.pyplot as plt

# フィギュアを設定
fig = plt.figure()

# グリッド線を表示
plt.style.use("ggplot")

# グラフ描画領域を追加
ax = fig.add_subplot(111)

# x軸, y軸のラベルを設定
ax.set_xlabel("x", fontsize = 16)
ax.set_ylabel("y", fontsize = 16)

# -2*pi~2*piまでpi/36刻みのデータを用意
x = np.arange(-2*np.pi, 2*np.pi, np.pi/36)

# yのデータを用意
y1 = np.sin(x)
y2 = np.cos(x)

# データをプロット
ax.plot(x, y1, label = "y = sinx")
ax.plot(x, y2, label = "y = cosx")

# 凡例は左下に表示
ax.legend(loc = "lower left")

Python 三角関数のグラフ