Pythonで三角関数を完全マスター【sin・cos・tan・arcsin・arccos・arctan】
![]() | 20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード |
| | 週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ |
| | 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks |
Pythonのmathモジュールを使えば、三角関数の計算を簡単に行うことができます。この記事では、基本的な三角関数から逆三角関数まで、実践的なサンプルコードと共に詳しく解説します。
目次
mathモジュールの基本
三角関数の基本関数
import math
# 基本的な三角関数
angle = math.pi / 4 # 45度をラジアンで表現
sin_value = math.sin(angle) # sin(45°) = √2/2 ≈ 0.707
cos_value = math.cos(angle) # cos(45°) = √2/2 ≈ 0.707
tan_value = math.tan(angle) # tan(45°) = 1.0
print(f"sin(π/4): {sin_value:.3f}")
print(f"cos(π/4): {cos_value:.3f}")
print(f"tan(π/4): {tan_value:.3f}")
角度の単位変換
import math
# 度からラジアンへの変換
degrees = 60
radians = math.radians(degrees) # π/3
print(f"{degrees}° = {radians:.3f} rad")
# ラジアンから度への変換
angle_rad = math.pi / 3
angle_deg = math.degrees(angle_rad) # 60度
print(f"{angle_rad:.3f} rad = {angle_deg}°")
# 手動変換
deg_to_rad = degrees * math.pi / 180
rad_to_deg = angle_rad * 180 / math.pi
基本三角関数の計算
sin(正弦)関数
import math
# 特別な角度のsin値
angles_deg = [0, 30, 45, 60, 90, 180, 270, 360]
print("角度(°) | ラジアン | sin値")
print("-" * 30)
for angle in angles_deg:
rad = math.radians(angle)
sin_val = math.sin(rad)
print(f"{angle:4}° | {rad:7.3f} | {sin_val:6.3f}")
cos(余弦)関数
import math
def cos_table():
print("角度(°) | cos値 | 説明")
print("-" * 30)
special_angles = [
(0, "最大値"),
(60, "1/2"),
(90, "ゼロ"),
(120, "-1/2"),
(180, "最小値")
]
for angle, desc in special_angles:
rad = math.radians(angle)
cos_val = math.cos(rad)
print(f"{angle:4}° | {cos_val:8.3f} | {desc}")
cos_table()
tan(正接)関数
import math
def tan_with_error_handling():
angles = [0, 30, 45, 60, 89, 90, 91, 180]
for angle in angles:
rad = math.radians(angle)
try:
tan_val = math.tan(rad)
if abs(tan_val) > 1000: # 非常に大きな値
print(f"tan({angle}°): 無限大に近い値")
else:
print(f"tan({angle}°): {tan_val:.3f}")
except:
print(f"tan({angle}°): 計算エラー")
tan_with_error_handling()
逆三角関数の計算
arcsin(逆正弦)関数
import math
def arcsin_examples():
values = [0, 0.5, 0.707, 0.866, 1.0]
print("値 | arcsin(ラジアン) | arcsin(度)")
print("-" * 40)
for val in values:
try:
arcsin_rad = math.asin(val)
arcsin_deg = math.degrees(arcsin_rad)
print(f"{val:5.3f} | {arcsin_rad:15.3f} | {arcsin_deg:9.1f}°")
except ValueError:
print(f"{val:5.3f} | 定義域外")
arcsin_examples()
arccos(逆余弦)関数
import math
def arccos_examples():
values = [1.0, 0.866, 0.707, 0.5, 0, -0.5, -1.0]
print("値 | arccos(度) | 対応角度")
print("-" * 35)
for val in values:
arccos_rad = math.acos(val)
arccos_deg = math.degrees(arccos_rad)
print(f"{val:5.3f} | {arccos_deg:9.1f}° | {int(arccos_deg)}°")
arccos_examples()
arctan(逆正接)関数
import math
def arctan_examples():
values = [0, 0.577, 1.0, 1.732, float('inf')]
print("値 | arctan(度) | 対応角度")
print("-" * 35)
for val in values:
if val == float('inf'):
# 無限大の場合
arctan_deg = 90
print(f"∞ | {arctan_deg:9.1f}° | 90°")
else:
arctan_rad = math.atan(val)
arctan_deg = math.degrees(arctan_rad)
print(f"{val:5.3f} | {arctan_deg:9.1f}° | {int(arctan_deg)}°")
arctan_examples()
atan2関数の使用
import math
def atan2_quadrant_examples():
# 各象限の点での角度計算
points = [(1, 1), (-1, 1), (-1, -1), (1, -1)]
quadrants = ["第1象限", "第2象限", "第3象限", "第4象限"]
print("座標 | atan2(度) | 象限")
print("-" * 30)
for i, (x, y) in enumerate(points):
angle_rad = math.atan2(y, x)
angle_deg = math.degrees(angle_rad)
print(f"({x:2}, {y:2}) | {angle_deg:8.1f}° | {quadrants[i]}")
atan2_quadrant_examples()
三角恒等式の検証
ピタゴラスの定理
import math
def verify_pythagorean_identity(angle_deg):
angle_rad = math.radians(angle_deg)
sin_val = math.sin(angle_rad)
cos_val = math.cos(angle_rad)
# sin²θ + cos²θ = 1
identity_result = sin_val**2 + cos_val**2
print(f"角度: {angle_deg}°")
print(f"sin²θ + cos²θ = {identity_result:.10f}")
print(f"誤差: {abs(identity_result - 1.0):.2e}")
# 複数の角度で検証
for angle in [30, 45, 60, 120]:
verify_pythagorean_identity(angle)
print()
加法定理の検証
import math
def verify_addition_formula(a_deg, b_deg):
a_rad = math.radians(a_deg)
b_rad = math.radians(b_deg)
# sin(a + b) = sin(a)cos(b) + cos(a)sin(b)
left_side = math.sin(a_rad + b_rad)
right_side = math.sin(a_rad)*math.cos(b_rad) + math.cos(a_rad)*math.sin(b_rad)
print(f"sin({a_deg}° + {b_deg}°) = sin({a_deg + b_deg}°)")
print(f"直接計算: {left_side:.6f}")
print(f"加法定理: {right_side:.6f}")
print(f"誤差: {abs(left_side - right_side):.2e}")
verify_addition_formula(30, 45)
実践的な応用例
三角波の生成
import math
def generate_triangle_wave(frequency, duration, sample_rate):
samples = []
total_samples = int(duration * sample_rate)
for i in range(total_samples):
t = i / sample_rate
# 基本周波数と奇数次高調波の合成
amplitude = 0
for n in range(1, 10, 2): # 1, 3, 5, 7, 9次高調波
amplitude += (1/n**2) * math.sin(2*math.pi*n*frequency*t)
samples.append(amplitude * 8/math.pi**2) # 正規化係数
return samples
# 1Hz、1秒間、100サンプル/秒
wave = generate_triangle_wave(1, 1, 100)
print(f"最初の10サンプル: {wave[:10]}")
座標変換(直交座標⇔極座標)
import math
def cartesian_to_polar(x, y):
r = math.sqrt(x**2 + y**2)
theta = math.atan2(y, x)
theta_deg = math.degrees(theta)
return r, theta_deg
def polar_to_cartesian(r, theta_deg):
theta_rad = math.radians(theta_deg)
x = r * math.cos(theta_rad)
y = r * math.sin(theta_rad)
return x, y
# 使用例
x, y = 3, 4
r, theta = cartesian_to_polar(x, y)
print(f"直交座標 ({x}, {y}) → 極座標 (r={r:.2f}, θ={theta:.1f}°)")
x2, y2 = polar_to_cartesian(r, theta)
print(f"極座標 (r={r:.2f}, θ={theta:.1f}°) → 直交座標 ({x2:.2f}, {y2:.2f})")
GPS座標間の距離計算
import math
def haversine_distance(lat1, lon1, lat2, lon2):
# 地球の半径(km)
R = 6371.0
# 度をラジアンに変換
lat1_rad = math.radians(lat1)
lon1_rad = math.radians(lon1)
lat2_rad = math.radians(lat2)
lon2_rad = math.radians(lon2)
# 差分を計算
dlat = lat2_rad - lat1_rad
dlon = lon2_rad - lon1_rad
# ハーバーシン公式
a = math.sin(dlat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2)**2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
distance = R * c
return distance
# 東京駅と大阪駅間の距離
tokyo_lat, tokyo_lon = 35.6812, 139.7671
osaka_lat, osaka_lon = 34.7024, 135.4959
distance = haversine_distance(tokyo_lat, tokyo_lon, osaka_lat, osaka_lon)
print(f"東京-大阪間の距離: {distance:.2f} km")
双曲線関数
双曲線関数の基本
import math
def hyperbolic_functions(x):
sinh_val = math.sinh(x) # 双曲線正弦
cosh_val = math.cosh(x) # 双曲線余弦
tanh_val = math.tanh(x) # 双曲線正接
print(f"x = {x}")
print(f"sinh({x}) = {sinh_val:.3f}")
print(f"cosh({x}) = {cosh_val:.3f}")
print(f"tanh({x}) = {tanh_val:.3f}")
# 双曲線関数の恒等式: cosh²x - sinh²x = 1
identity = cosh_val**2 - sinh_val**2
print(f"cosh²x - sinh²x = {identity:.6f}")
# 複数の値で検証
for x in [0, 0.5, 1.0, 2.0]:
hyperbolic_functions(x)
print()
三角関数のグラフ作成
Matplotlibとの連携
import math
def generate_trig_data(start, end, steps):
x_values = []
sin_values = []
cos_values = []
tan_values = []
step_size = (end - start) / steps
for i in range(steps + 1):
x = start + i * step_size
x_values.append(x)
sin_values.append(math.sin(x))
cos_values.append(math.cos(x))
# tanの無限大付近を処理
tan_val = math.tan(x)
if abs(tan_val) > 10: # 大きな値は制限
tan_val = 10 if tan_val > 0 else -10
tan_values.append(tan_val)
return x_values, sin_values, cos_values, tan_values
# 0から2πまでのデータ生成
x_data, sin_data, cos_data, tan_data = generate_trig_data(0, 2*math.pi, 100)
print(f"データポイント数: {len(x_data)}")
print(f"x範囲: {x_data[0]:.2f} ~ {x_data[-1]:.2f}")
エラーハンドリングと注意点
定義域外の処理
import math
def safe_arcsin(x):
if -1 <= x <= 1:
return math.asin(x)
else:
raise ValueError(f"arcsinの定義域外: {x} (範囲: -1 ≤ x ≤ 1)")
def safe_arccos(x):
if -1 <= x <= 1:
return math.acos(x)
else:
raise ValueError(f"arccosの定義域外: {x} (範囲: -1 ≤ x ≤ 1)")
# テスト
test_values = [-1.5, -1, 0, 0.5, 1, 1.5]
for val in test_values:
try:
result = safe_arcsin(val)
print(f"arcsin({val}) = {math.degrees(result):.1f}°")
except ValueError as e:
print(f"エラー: {e}")
浮動小数点の精度問題
import math
def compare_trig_precision():
# 精度の問題例
angle = math.pi / 2 # 90度
sin_90 = math.sin(angle)
cos_90 = math.cos(angle)
print(f"sin(π/2) = {sin_90}") # 1.0(期待値)
print(f"cos(π/2) = {cos_90}") # 0.0(期待値)だが実際は微小な値
# 許容誤差での比較
tolerance = 1e-10
print(f"cos(π/2) ≈ 0? {abs(cos_90) < tolerance}")
compare_trig_precision()
性能最適化のヒント
計算の最適化
import math
import time
def benchmark_trig_calculations():
n = 100000
# 事前に角度を計算
angles = [i * 2 * math.pi / n for i in range(n)]
# sin計算の時間測定
start = time.time()
sin_results = [math.sin(angle) for angle in angles]
sin_time = time.time() - start
# cos計算の時間測定
start = time.time()
cos_results = [math.cos(angle) for angle in angles]
cos_time = time.time() - start
print(f"sin計算 {n}回: {sin_time:.4f}秒")
print(f"cos計算 {n}回: {cos_time:.4f}秒")
benchmark_trig_calculations()
ルックアップテーブルの作成
import math
class TrigLookupTable:
def __init__(self, precision_deg=1):
self.precision = precision_deg
self.sin_table = {}
self.cos_table = {}
# テーブルの事前計算
for deg in range(0, 361, precision_deg):
rad = math.radians(deg)
self.sin_table[deg] = math.sin(rad)
self.cos_table[deg] = math.cos(rad)
def sin(self, degrees):
# 正規化
degrees = degrees % 360
# 最も近い値を取得
rounded_deg = round(degrees / self.precision) * self.precision
return self.sin_table.get(rounded_deg, math.sin(math.radians(degrees)))
def cos(self, degrees):
degrees = degrees % 360
rounded_deg = round(degrees / self.precision) * self.precision
return self.cos_table.get(rounded_deg, math.cos(math.radians(degrees)))
# 使用例
trig_table = TrigLookupTable(precision_deg=5)
print(f"テーブルsin(45°): {trig_table.sin(45):.6f}")
print(f"直接計算sin(45°): {math.sin(math.radians(45)):.6f}")
まとめ
Pythonの三角関数機能は以下の特徴を持ちます:
- mathモジュールによる高精度計算
- 逆三角関数の完全サポート
- ラジアン・度の柔軟な変換
- エラーハンドリングの重要性
三角関数は工学、物理学、グラフィックス、信号処理など様々な分野で重要な役割を果たします。適切な精度管理とエラーハンドリングを行いながら、Pythonの三角関数機能を効果的に活用しましょう。
■「らくらくPython塾」が切り開く「呪文コーディング」とは?
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座
![]() | 20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード |
| | 週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ |
| | 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks |


