高校数学をプログラミングで解く(数学II編)「3-9 三角関数の合成」
マガジンリスト > 数学Ⅱ編 3.三角関数 > 3-9 三角関数の合成
はじめに
今回は、数学IIで学ぶ「三角関数の合成」について、合成前の2つの三角関数のグラフと合成後の三角関数のグラフを描くプログラムを作成します。
三角関数の合成
まず、三角関数の合成について解説しておきます。
三角関数の合成
$$
a \sin \theta + b \cos \theta = \sqrt{a^2+b^2} \sin ( \theta + \alpha )
$$
ただし、
$$
\cos \alpha = \frac{a}{\sqrt{a^2+b^2}}, \ \sin \alpha = \frac{b}{\sqrt{a^2+b^2}}
$$
今回は、この三角関数の合成について合成前の2つの三角関数のグラフと合成後の三角関数のグラフを描いて比較してみます。
atan2関数
合成した三角関数のグラフを描くために、位相$${\alpha}$$を求める必要があります。記事『高校数学をプログラミングで解く(数学II編)「3-5 三角関数の応用」』で紹介した asin 関数、acos 関数、atan 関数は、$${\sin \alpha, \cos \alpha, \tan \alpha}$$の式から$${\alpha}$$の値を求めるために利用できます。例えば、
$$
\cos \alpha = \frac{a}{\sqrt{a^2+b^2}}
$$
から acos 関数を利用して$${\alpha}$$を求めます。このとき、acos 関数の返り値の範囲から$${0 \leq \alpha \leq \pi}$$となります。次に、
$$
\sin \alpha = \frac{b}{\sqrt{a^2+b^2}}
$$
の符号を確認します。$${\sin \alpha \geq 0}$$のとき、求めた$${\alpha}$$の値を位相としてそのまま利用し、$${\sin \alpha < 0}$$のとき、求めた$${\alpha}$$の値の符号を反転したものを位相として利用します。
このようにして位相$${\alpha}$$の値を求めることができますが、今回の場合、atan2 関数を用いるともう少し簡単に$${\alpha}$$を求めることができます。
float atan2(y, x);
y:$${xy}$$平面上の任意の点の$${y}$$座標 float型
x:$${xy}$$平面上の任意の点の$${x}$$座標 float型
返り値:$${-\pi}$$より大きく$${\pi}$$以下の実数 float型
この atan2 関数を利用すると、以下のようなコードを記述することで、図1に示す$${x}$$軸正方向からの角度$${\alpha}$$を求めることができます。
float alpha = atan2(y,x);
なお、引数の順番が、$${x, y}$$の順ではなく、$${y, x}$$の順になっていることに注意してください。
したがって、今回の位相$${\alpha}$$についても、例えば
float c = a / sqrt{a*a+b*b};
float s = b / sqrt{a*a+b*b};
float alpha = atan2(s,c);
のように記述することで$${\alpha}$$の値を求めることができます。ただし、位相$${\alpha}$$を求めるだけであれば、$${\cos \alpha}$$や$${\sin \alpha}$$の値を求める必要はなく、
float alpha = atan2(b,a);
で計算することができます。
合成した三角関数のグラフを描く
では、合成した三角関数のグラフを描く問題を考えてみます。
問題
次の三角関数を図示するプログラムを作成せよ。ただし、(3)は三角関数の合成を行った結果の式を図示すること。
(1) $${y = \sin \theta}$$(赤色)
(2) $${y = - \sqrt{3} \cos \theta}$$(青色)
(3) $${y = \sin \theta - \sqrt{3} \cos \theta}$$(黒色)
アルゴリズム設計
問題の(3)の式は、(1)と(2)の式を足し合わせたものになっています。そして、(3)の式は、三角関数の合成を行うと、
$$
y = 2 \sin ( \theta + \alpha )
$$
ただし、
$$
\cos \alpha = \frac{1}{2}, \ \ \sin \alpha = - \frac{\sqrt{3}}{2}
$$
となります。この関数のグラフを描いていきます。
プログラム
今回のプログラムでは、三角関数のグラフを描いていくので、記事『高校数学をプログラミングで解く(数学II編)「3-4 三角関数のグラフ」』で作成したスケッチ「draw_sin_curve」を再利用します。スケッチ「draw_sin_curve」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「draw_compositions」と変更し、またスケッチ「draw_compositions」内の「draw_sin_curve.pde」ファイルの名前を「draw_compositions.pde」に変更します。そして、pdeファイル「draw_compositions.pde」をダブルクリックしてスケッチ「draw_compositions」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「draw_compositions」タブを選択して、そのテキストエリアのソースコードを以下のような記述に変更します。
float x_range = 10.0; // x軸の表示範囲 -x_rangeからx_rangeまで
float y_range = 10.0; // y軸の表示範囲 -y_rangeからy_rangeまで
void setup(){
size(500,500);
noLoop();
setAxes(x_range, y_range); // 座標軸の準備
noFill();
float a = 1.0; // sin関数の係数
float b = -sqrt(3.0); // cos関数の係数
// (1) y = a sinθ
stroke(255,0,0);
float A = a; // 振幅
float k = 1.0; // θの係数
float alpha = 0.0; // 位相
float y1 = 0.0; // y軸方向の移動量
draw_sin(A,k,alpha,y1);
// (2) y = b cosθ
stroke(0,0,255);
A = b; // 振幅
k = 1.0; // θの係数
alpha = 0.0; // 位相
y1 = 0.0; // y軸方向の移動量
draw_cos(A,k,alpha,y1);
// (3) 合成関数
stroke(0,0,0);
A = sqrt(a*a+b*b); // 振幅
k = 1.0; // θの係数
alpha = atan2(b, a); // 位相
y1 = 0.0; // y軸方向の移動量
draw_sin(A,k,-alpha,y1);
}
// sinカーブ y=A sin(k(θ-alpha))+y1 を描く関数
void draw_sin(
float A, // 振幅
float k, // θの係数
float alpha, // 位相
float y1 // y軸方向の移動量
){
// グラフの定義域
float x_min = -x_range;
float x_max = x_range;
int plot_num = 200; // グラフを描くための頂点の個数
// グラフを描画
float x, y; // 関数の座標
float X, Y; // キャンバス上の座標
beginShape();
for(int i=0; i<=plot_num; i++){
x = x_min + (x_max - x_min) / plot_num * i; // sinカーブ上の点のx座標
y = A * sin( k*(x-alpha) ) + y1; // sinカーブ上の点のyの値
// キャンバス上の座標位置に換算
X = width / 2.0 / x_range * x;
Y = height / 2.0 / y_range * y;
vertex(X, Y);
}
endShape();
}
// cosカーブ y=A cos(k(θ-alpha))+y1 を描く関数
void draw_cos(
float A, // 振幅
float k, // θの係数
float alpha, // 位相
float y1 // y軸方向の移動量
){
// グラフの定義域
float x_min = -x_range;
float x_max = x_range;
int plot_num = 200; // グラフを描くための頂点の個数
// グラフを描画
float x, y; // 関数の座標
float X, Y; // キャンバス上の座標
beginShape();
for(int i=0; i<=plot_num; i++){
x = x_min + (x_max - x_min) / plot_num * i; // cosカーブ上の点のx座標
y = A * cos( k*(x-alpha) ) + y1; // cosカーブ上の点のyの値
// キャンバス上の座標位置に換算
X = width / 2.0 / x_range * x;
Y = height / 2.0 / y_range * y;
vertex(X, Y);
}
endShape();
}
ソースコード1 合成した三角関数を描くプログラム
ここで、ソースコード1について解説しておきます。
sin カーブを描く関数 draw_sin や cos カーブを描く関数 draw_cos は、『高校数学をプログラミングで解く(数学II編)「3-4 三角関数のグラフ」』で作成したスケッチ「draw_sin_curve」や「draw_cos_curve」内で作成したものを再利用していますが、1点注意が必要です。 sin カーブを描く関数 draw_sin は
$$
y = A \sin(k(\theta-\alpha))+y_1
$$
の形の三角関数のグラフを描くように定義しており、三角関数の合成時の$${\alpha}$$と異符号になっていることに注意してください。そのため、合成した三角関数を描く際には、
draw_sin(A,k,-alpha,y1);
と引数 alpha の値を -alpha として与えています。
ソースコード1を、スケッチ「draw_compositions」の「draw_compositions」タブのテキストエディタ部分に書いて実行すると、図2のように、合成前の2つの三角関数のグラフ(赤色と青色)と合成後の三角関数のグラフ(黒色)が実行ウィンドウのキャンバス上に描かれます。
図2を眺めてみると、合成前の2つの三角関数のグラフを足し合わせると、合成後の三角関数のグラフがきちんと描かれていることが見て取れます。
まとめ
今回は、数学IIで学ぶ「三角関数の合成」について、合成前の2つの三角関数のグラフと合成後の三角関数のグラフを描くプログラムを作成しました。
合成した三角関数の位相$${\alpha}$$は、$${\cos \alpha}$$の値に acos 関数を適応して算出された値を$${\sin \alpha}$$の値の符号をもとに調整することで求めることができますが、今回は、より簡単な方法として、atan2 関数を用いて計算しました。 atan 関数の返り値の範囲が$${-\pi/2 \leq \alpha \leq \pi/2}$$であったのに対し、atan2 関数の返り値の範囲は$${-\pi < \alpha \leq \pi}$$となり、円周全体をカバーできるので、角度を求める際には atan2 関数がよく利用されます。そのため、atan2 関数についてはこんな関数があることを頭の片隅に覚えておくとよいでしょう。
参考文献
改訂版 教科書傍用 スタンダード 数学II(数研出版、ISBN9784410209369)
この記事が気に入ったらサポートをしてみませんか?