Pythonで三角関数!〜サウンドも作成してみよう数学×Pythonプログラミング入門(2/4 ページ)

» 2022年11月28日 05時00分 公開
[羽山博]

目標2: 単位円を描いて余弦(cos)と正弦(sin)は何かを確認する

 次なる目標は、余弦(cos)と正弦(sin)が何を表すのかを確認することです。高校の数学で三角比を最初に学んだときには、図2のような鋭角の角度をθとする直角三角形を考えたとき、

だと習ったと思います*2


注2

*2 数学Iで取り扱う三角比では、角度は度数法で表されています。数学IIで取り扱う三角関数では弧度法が使われます。


三角比 図2 直角三角形と三角比
図の右側のように、斜辺から底辺に沿って「c」という文字を描いて「斜辺分の底辺」が「cos」、斜辺から高さに沿って筆記体の「s」の小文字を描いて「斜辺分の高さ」が「sin」と覚えた人も多いはず。

 しかし、ここでは単位円を使って一般的に考えていきます。そこで、単位円を描くためのコードを書いてみましょう。これが目標2です。

(ヒント)θの値を少しずつ変えながら(cosθ,sinθ)の値をプロットしていけば単位円が描けます。ここでは、θの値として、0の範囲を100個に分けた値を使うことにしましょう。

 単位円が描けたら、図形的な意味も考えてみましょう。cossinの意味が分かれば、以下の公式が成り立つことも確認できます。

 cos2θ(cosθ)2のことです。同様に、sin2θ(sinθ)2のことです。

2. 単位円を描くためのコード

 cossinの理解があいまいでも、目標2で述べた方法でコードは書けるはずです。numpyモジュールのcos関数やsin関数では、角度を配列として与えると、それらに対する関数の値を配列として返してくれるので、繰り返し処理を書かなくてもグラフ化のためのデータが作成できます(リスト2)。

import matplotlib.pyplot as plt
import numpy as np

thetas = np.linspace(0, 2*np.pi, 100)
x = np.cos(thetas)
y = np.sin(thetas)

plt.figure(figsize=(4, 4))
plt.plot(x, y)
plt.show()

リスト2 単位円のグラフを描く
numpyモジュールのlinspace関数を使って、0の範囲を100個に分けた等差数列の値を配列として求め、それらをcos関数とsin関数に渡してx座標の配列とy座標の配列を作る。

 linspace関数の引数に初項、末項、個数を指定すれば、初項以上、末項以下を、個数分に分けた場合の等差数列が配列として返されます。末項未満ではないことに注意してください。なお、endpoint=Falseを指定すれば、末項未満の数列となります。

 描画に当たっては、matplotlib.pyplotモジュールのfigure関数を使って図形の幅×高さを4×4(インチ)としました。サイズを指定しないと幅6.4インチ、高さ4.8インチと見なされるので、円を描いても横長の楕円になってしまいます。なお、plt.axis('off')plt.show()の前に書けば、x軸やy軸を非表示にできます。

 実行例は以下の通りです。

単位円のグラフ 図3 単位円のグラフ

 単位円が描けたので、少し図形的な意味も考えてみましょう。コードを書きながら気づいた方も(あるいはすでに熟知していた方も)いるかと思いますが、単位円の円周のx座標の値がcosθとなっており、y座標の値がsinθとなっています。このことは、単位円の円周上の点を頂点とする図4のような直角三角形を描いてみると一目瞭然(いちもくりょうぜん)です。これについても、動画での解説を用意してあるので、ぜひご視聴ください。

動画2 コサインとサインの意味


cosθとsinθの意味 図4 cosθsinθの意味
cosθは単位円の円周上の点のx座標、sinθはy座標。

 cosθの値は、直角三角形の底辺÷斜辺でしたね。単位円では、斜辺の長さは半径1と等しいので、sinθの値は、直角三角形の底辺の長さそのもの、つまり円周上の点のx座標です。

 同様に、sinθの値は、直角三角形の高さ÷斜辺で、斜辺の長さが1なので、結局のところ、高さそのものです。これは円周上の点のy座標です。

 このように、単位円を基にしてcosθsinθの意味を理解していれば、θが鋭角でない場合にもちゃんとcosθsinθの値が求められます。三角比での理解だと、θが鈍角(π/2ラジアン=90度以上の角度)の場合の取り扱いが面倒ですね。

 また、図4を見るとピタゴラスの定理から、cos2θ + sin2θ = 12であることも明らかです。12=1なので、

が成り立ちます。簡単なコードを書いて確認しておきましょう(リスト3)。

import numpy as np

theta = float(input("角度を入力してください:"))
# 入力例:
# 角度を入力してください:3.14  # 3.14と入力する

print(np.cos(theta)**2 + np.sin(theta)**2)

# 出力例:
# 0.9999999999999999  # わずかな誤差が出る

リスト3 cos2θ + sin2θ = 1を確認する
どんな値を入力しても、結果は1となるはず(ただし、わずかな誤差が出る場合もある)。

Copyright© Digital Advantage Corp. All Rights Reserved.

アイティメディアからのお知らせ

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2026
人に頼れない今こそ、本音で語るセキュリティ「モダナイズ」
4AI by @IT - AIを作り、動かし、守り、生かす
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。