Pythonで三角関数を完全マスター【sin・cos・tan・arcsin・arccos・arctan】

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 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スカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks