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

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

目標3: 周期や周波数を変えてsin関数のグラフを描く

 次の目標は、sin関数(正弦関数)のグラフを描くことです。θを変数と見なして、値を変えていったときのsinθがsin関数です。

 ここでの目標は周期や周波数(後述します)を変えてグラフを描くことです。単純にsinθのグラフを描く例を最初に見ておき、それを書き換えることによって進めていくことにしましょう。θの値を変えながら(θ,sinθ)をプロットしていけば、簡単にsin関数のグラフが描けます。コードはリスト4の通りで、結果は図5のようになります。

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(0, 2*np.pi, 100)
data = np.sin(theta)

plt.plot(theta, data)
plt.show()

リスト4 θ=0までのsin関数のグラフを描くコード
numpyモジュールのlinspace関数を使って0の間を100個に分け、θの配列を作る。それらの値に対するsinθの値を求めてグラフにする。

sin関数のグラフ 図5 sin関数のグラフ
リスト4で作成したグラフ。θ=0に対するsinθの値をプロットしたもの。横軸の最大値が2π=6.283...となる。

 ここからが本題です。図6のようにtの値を01の間を100個に分け、sin関数が「一周」するようにしてみてください。これが目標3でまず取り組むことになります。

周期1のsin関数のグラフ 図6 周期を1としたsin関数のグラフ
t=01でsin関数の値が「一周」するようにプロットしたもの。このグラフを作るのがここでの目標。

 cos関数やsin関数は、ごとに同じ形のグラフが繰り返されます。円周の長さがなので、一周回ったら元に戻るというわけです。この「一周の長さ」を周期と呼びます。グラフで表すと山から山まで(あるいは谷から谷まで)の長さが周期です。cos関数もsin関数も周期はですが、上の例では周期が1になるようにするというわけです。

(ヒント)t=1のときに、角度がになるようにすればよい

 さらに、全体の長さ(tの最大値)を1としたまま、周期が1/3になるようにしてみてください。周期が1/3になると、図7のように同じ形の「波」が3回現れます。この個数のことを周波数と呼びます。

周波数3のsin関数のグラフ 図7 周期を1/3、周波数を3としたsin関数のグラフ

 このグラフを描くことがここでのもう1つの目標です。

(ヒント)t=1/3のときに、角度がになるようにすればよい

 なお、サウンドを表す波などではtが時間(秒)に当たります。周波数の単位はHz(ヘルツ)です。周期をTとし、周波数をfとすると、

という関係になっています。

3. 周期や周波数を変えてsin関数のグラフを描くためのコードを書く

 まず、周期を1としたグラフを描いてみましょう。tはグラフの横軸にあたる値で、01の範囲です。それを100個に分けます。そして、sin関数の引数は、t=1のときにになればいいので、2*np.pi * tを指定すればよさそうですね。これ以降のお話については、動画でも解説してあります。ぜひご視聴ください。

動画3 周期や周波数を変えて三角関数のグラフを描く


import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0, 1, 100)
data = np.sin(2*np.pi * t)

plt.plot(t, data)
plt.show()

リスト5 周期を1とした正弦関数のグラフを描く
sin関数の引数に注目。t=0のときに2*np.pi * tの値が0となり、t=1のときに2*np.pi * tの値がとなるので、np.sinの引数は0の値となる。結果は前掲の図6で見た通り。

 次に、周期を1/3にして3つの波が表示されるようにしましょう。linspace関数の第2引数(末項の値)を3にすればいいと思われるかもしれませんが、それだと、周期1の波がt=0〜3の間に3つ表示されるだけです。周期が1/3の波をt=0〜1の間に3つ表示するので、01/30に対応させます。従って、sin関数の引数を2*np.pi * 3 * tにすればいいですね。ここでは周波数をfreqという変数で表すことにします。

import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0, 1, 100)
freq = 3  # 周波数
data = np.sin(2*np.pi * freq * t)

plt.plot(t, data)
plt.show()

リスト6 周期を1/3、周波数を3とした正弦関数のグラフを描く
t=0のときに2*np.pi * freq * tの値が0となり、t=1/3のときに2*np.pi * freq * tの値がとなる。ここまでが1つ目の波になる。次に、t=2/3のときに2*np.pi * freq * tの値がになる。ここまでが2つ目の波。t=1になれば2*np.pi * freq * tとなる。ここまでが3つ目の波。結果は前掲の図7で見た通り。

コラム 複素数平面でcosθとsinθをプロットする

 複素数平面複素平面ガウス平面とも呼ばれます)とは、複素数の実数部を横軸に、虚数部を縦軸にとった平面です。横軸は実軸、縦軸は虚軸と呼ばれます。cosθを実軸での値、sinθを虚軸の値として複素数平面上にプロットすると、図8の左のようになります。

複素数平面と三角関数 図8 複素数平面上でcosθsinθを表す
複素数平面の点(cosθ,sinθ)は、1つの複素数cosθ+isinθとして、まとめて表すことができる。右側の図はθsinθをプロットしたもの。

 (cosθ,sinθ)を1つの複素数にまとめて表すと、オイラーの公式により、

と簡単に表現できます。この式の中のiは虚数単位です(ただし、Pythonのコードでは虚数単位を`j`と表します)。なお、図8の右側に示したように、振幅は波の高さを表します。これは、左側の円の半径に当たります。複素数a+biの大きさ|a+bi|は、

で表されるので、上の場合だと、

となります。半径がrであれば、当然のことながら、

ですね。図8の右側で、周期が波の山から次の山までの時間(谷から谷まででも同じ)であること、波長は1周期の波の長さであることも確認しておきましょう。なお、単位時間(通常1秒)当たりの周期の数が周波数です。


 三角関数には、cossinのほかにもtanなどさまざまなものがあり、公式も数多くあります。しかし、基本の基本はこれだけです。幾つかの関連事項や応用例に触れるために、練習問題に取り組んでみましょう。

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のメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。