note.nkmk.me

Pythonで三角関数を計算(sin, cos, tan, arcsin, arccos, arctan)

Date: 2018-04-01 / tags: Python, 算数・数学

Pythonの数学関数の標準モジュールmathを使うと、三角関数(sin, cos, tan)および逆三角関数(arcsin, arccos, arctan)の計算ができる。

ここでは、

  • 円周率: math.pi
  • 角度変換(ラジアン、度): math.degrees(), math.radians()
  • 正弦、逆正弦: math.sin(), math.asin()
  • 余弦、逆余弦: math.cos(), math.acos()
  • 正接、逆正接: math.tan(), math.atan(), math.atan2()
  • math.atan()math.atan2()の違い

について、サンプルコードとともに説明する。

スポンサーリンク

円周率(パイ): math.pi

円周率(パイ)はmathモジュールの中で定数として用意されている。math.piで表す。

import math

print(math.pi)
# 3.141592653589793

角度変換(ラジアン、度): math.degrees(), math.radians()

mathモジュールの三角関数および逆三角関数は、角度の単位としてラジアンを使う。

ラジアン(弧度法)と度(度数法)を相互に変換するにはmath.degrees()math.radians()を使う。

ラジアンから度に変換するのがmath.degrees()で、度からラジアンに変換するのがmath.radians()

print(math.degrees(math.pi))
# 180.0

print(math.radians(180))
# 3.141592653589793

正弦、逆正弦: math.sin(), math.asin()

正弦(サイン、sin)を求める関数はmath.sin()、逆正弦(アークサイン、arcsin)を求める関数はmath.asin()

30度の正弦を求める例を示す。math.radians()で度をラジアンに変換している。

sin30 = math.sin(math.radians(30))
print(sin30)
# 0.49999999999999994

30度の正弦は0.5だが、プログラムでは無理数である円周率を正確に計算できないので誤差が生じる。

適当な桁数で四捨五入したい場合は、round()関数か、print()での表示時にformat()メソッドまたはformat()関数で丸めればOK。

なお、round()の返り値は数値(整数intか浮動小数点数float)だが、format()の返り値は文字列strなので注意。そのあとに計算に使うのであればround()を用いる。

sin30_round = round(sin30, 3)
print(sin30_round)
# 0.5

print('{:.3}'.format(sin30))
# 0.5

print(format(sin30, '.3'))
# 0.5

round()関数は第二引数に小数点以下の桁数を指定する。厳密には四捨五入ではないので注意。詳細は以下の記事を参照。

format()メソッドとformat()関数では書式化指定文字列の.3の部分で小数点以下の桁数を指定している。詳細は以下の記事を参照。

比較したい場合はmath.isclose()を使う方法もある。

0.5の逆正弦を求める例を示す。math.asin()が返すのはラジアンなので、最後にmath.degrees()で度に変換している。

asin05 = math.degrees(math.asin(0.5))
print(asin05)
# 29.999999999999996

asin05_round = round(asin05, 3)
print(asin05_round)
# 30.0

余弦、逆余弦: math.cos(), math.acos()

余弦(コサイン、cos)を求める関数はmath.cos()、逆余弦(アークコサイン、arccos)を求める関数はmath.acos()

60度の余弦と0.5の逆余弦を求める例を示す。

cos60 = math.cos(math.radians(60))
print(cos60)
# 0.5000000000000001

acos05 = math.degrees(math.acos(0.5))
print(acos05)
# 59.99999999999999

適当な桁で丸めたい場合は、正弦と同じくround()またはformat()を使えばよい。

正接、逆正接: math.tan(), math.atan(), math.atan2()

正接(タンジェント、tan)を求める関数はmath.tan()、逆正接(アークタンジェント、arctan)を求める関数はmath.atan()またはmath.atan2()math.atan2()については後述。

45度の正接と1の逆正接を求める例を示す。

tan45 = math.tan(math.radians(45))
print(tan45)
# 0.9999999999999999

atan1 = math.degrees(math.atan(1))
print(atan1)
# 45.0

math.atan()とmath.atan2()の違い

math.atan()math.atan2()はどちらも逆正接を返す関数だが、引数と戻り値の範囲が異なる。

math.atan(x)は引数が一つで、arctan(x)をラジアンで返す。戻り値は-pi / 2からpi / 2(-90度から90度)の間になる。

print(math.degrees(math.atan(1)))
# 45.0

print(math.degrees(math.atan(-1)))
# -45.0

print(math.degrees(math.atan(math.inf)))
# 90.0

print(math.degrees(math.atan(-math.inf)))
# -90.0

上の例のmath.infは無限大を表す(Python3.5で追加)。

math.atan2(y, x)は引数が二つで、arctan(y / x)をラジアンで返す。この角度は、極座標平面において原点から座標(x, y) へのベクトルが x軸の正の方向となす角度であり、戻り値は-piからpi(-180度から180度)の間になる。

第2象限、第3象限での角度も正しく取得できるので、極座標平面で考える場合はmath.atan()よりもmath.atan2()のほうが適当。

引数の順番がx, yではなくy, xなので注意。

print(math.degrees(math.atan2(1, 1)))
# 45.0

print(math.degrees(math.atan2(1, -1)))
# 135.0

print(math.degrees(math.atan2(-1, -1)))
# -135.0

print(math.degrees(math.atan2(-1, 1)))
# -45.0

なお、x軸の負の無限大はpi(180度)を返す。

print(math.degrees(math.atan2(0, -math.inf)))
# 180.0
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事