Pythonで三角関数のグラフを描こう!

プログラミングを数学の学習に活用してみましょう。今回はプログラミング言語 Pythonで三角関数のグラフを描いてみます。sin(正弦)、cos(余弦)、tan(正接)の基本的なグラフから、三角関数を組み合わせた複雑なグラフまで描いてみます。

必要なライブラリ

Python で三角関数(trigonometric function)を描くには以下のライブラリが必要になるので、あらかじめインストールしておきましょう。

インストールされているかわからない場合は、とりあえずプログラムを実行してみましょう。インストールされていないと、エラーが出るのですぐにわかります。

三角関数のグラフを描く方法

y = sin ⁡ x のグラフを描いてみることにします。三角関数のグラフに共通する描き方を学びましょう。

最小限のコード

Python で一次関数のグラフを描こう!と同じように、x が -10 から 10 の範囲でグラフを描いてみましょう。ソースコードはとても簡単!わずか8行(実質6行)です。

import numpy as np  # NumPy を読み込む
import matplotlib.pyplot as plt  # Matplotlib を読み込む

x = np.arange(-10, 10, 0.1)  # x座標を-10 から 10 まで 0.1 きざみで取得
y = np.sin(x)  # 正弦関数の式を記述

plt.plot(x, y)  # x, y をプロット
plt.show()  # グラフを表示

Numpy の数学関数 numpy.sin(x) により sin ⁡ x の値を取得できます。 cos ⁡ x は numpy.cos(x) 、 tan ⁡ x は numpy.tan(x) です。

図1. sin 正弦関数のグラフ(最小限のコード)

数学の学習に役立つよう改良

図1のグラフは間違ってはいませんが、三角関数の学習ではx軸に円周率 π を用いた範囲にするのが実用的でしょう。そこで、x軸の範囲を -2 π から2 π までに変更してみましょう。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)  # x座標を -2π から 2π まで 0.1 きざみで取得
y = np.sin(x)  # 正弦関数の式を記述

plt.plot(x, y)
plt.show()

np.pi(numpy.pi)は NumPy ライブラリに用意されている円周率の近似値(3.1415926535897932384626433…)をセットした定数です。ここでは numpy.pi を使用しますが、Python の標準モジュールの円周率 math.pi でも問題ありません。

実行すると以下のグラフが描かれます。

図2. sin 正弦関数のグラフ(xの範囲を変更)

π はおよそ 3.14 、 2 π は 6.28 なので、たしかに -6.28 から 6.28 の範囲で描かれています。ただ、x軸上の値を(図2の 0, 2, 4, 6 といった数でなく) π を使った値に変更したいところです。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.sin(x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π']) # x軸上に表示する値を変更
plt.plot(x, y)
plt.show()

7行目〜8行目のように matplotlib.pyplot.xticks()関数を使うと、以下のグラフが描かれます。x軸に表示される値が意図したものになりました。

図3. sin 正弦関数のグラフ

最後の仕上げ

  • x軸とy軸のスケールを揃える
  • x軸とy軸のラベルを表示する
  • グリッド(目盛り軸)を表示する

を行ってグラフを仕上ます。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.sin(x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')  # x軸とy軸のスケールを揃える
plt.grid()  # グリッド(目盛軸)を表示
plt.xlabel('x')  # x軸のラベルを表示する
plt.ylabel('y',  rotation=0)  # y軸のラベルを表示する
plt.plot(x, y)
plt.show()

実行すると以下のグラフが描かれます。

図4. sin 正弦関数のグラフ

sin, cos, tan のグラフ

三角関数の基本的なグラフの描き方をまとめてみます。

正弦関数 y = sin x

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.sin(x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')
plt.grid()
plt.xlabel('x')
plt.ylabel('y',  rotation=0)
plt.plot(x, y)
plt.show()
図5. sin 正弦関数のグラフ

余弦関数 y = cos x

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.cos(x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')
plt.grid()
plt.xlabel('x')
plt.ylabel('y',  rotation=0)
plt.plot(x, y)
plt.show()
図6. cos 余弦関数のグラフ

正接関数 y = tan x

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.tan(x)
plt.ylim([-5, 5])  # tanはyの値が無限大になるので表示範囲を適当に制限

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')
plt.grid()
plt.xlabel('x')
plt.ylabel('y',  rotation=0)
plt.plot(x, y)
plt.show()
図7. tan 正接関数のグラフ

tanはyの値が無限になるため、yの表示範囲を制限するのがポイントです。無限になる箇所では、上図のように縦線が描かれてしまうことにも注意しましょう。

※この縦線を取り除くには特殊なテクニックが必要になるようです。python – Graphing tan in matplotlib – Stack Overflow(英語)を参照ください。

三角関数の合成・複雑なグラフ

基本的なグラフは教科書にある通りで、わざわざプログラミングをする必要性を感じないかもしれません。しかし、Python を使うと、複数の関数を合成した複雑なグラフも簡単に描けるようになります。

応用例として、sin と cos を組み合わせた複雑な関数のグラフを描いてみましょう。ここで紹介するような応用例こそが、プログラミングの真価といえるかもしれません。

y = sin x 2 cos x

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.sin(x) - 2 * np.cos(x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')
plt.grid()
plt.xlabel('x')
plt.ylabel('y',  rotation=0)
plt.plot(x, y)
plt.show()
図8.  y = sin ⁡ x 2 cos ⁡ x のグラフ

y = sin x + cos 2 x

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2 * np.pi, 2 * np.pi, 0.1)
y = np.sin(x) + np.cos(2 * x)

plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           ['-2π', '-π', '0', 'π', '2π'])
plt.gca().set_aspect('equal')
plt.grid()
plt.xlabel('x')
plt.ylabel('y',  rotation=0)
plt.plot(x, y)
plt.show()
図9.  y = sin ⁡ x + cos ⁡ 2 x のグラフ

このように手書きでは難しい複雑な関数でも、自在に描けてしまいます。手元のパソコンで、うんざりするような複雑な関数を描いてみましょう・・・。

以上、三角関数のグラフの描き方でした。次は指数関数・対数関数を予定しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です