見出し画像

高校数学10分プログラミング(数学Ⅱ編 3.三角関数)15日目「三角関数の合成を考える」

マガジンリスト > 数学Ⅱ編 3.三角関数 > 15日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学II編 3.三角関数)の15日目です。

本日の課題は、三角関数の合成を行ってそのグラフを描くプログラムを作成することです。


三角関数の合成

$$
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}}
$$


課題

次の三角関数を図示するプログラムを作成してください。ただし、(3)は三角関数の合成を行った結果の式を図示するようにしてください。
(1) $${y = \sin \theta}$$(赤色)
(2) $${y = - \sqrt{3} \cos \theta}$$(青色)
(3) $${y = \sin \theta - \sqrt{3} \cos \theta}$$(黒色)


ヒント

位相の算出

合成した三角関数のグラフを描くために、位相$${\alpha}$$を求める必要があります。今回の場合、atan2 関数を用いると便利です。

float atan2(y, x);

y:$${xy}$$平面上の任意の点の$${y}$$座標 float型
x:$${xy}$$平面上の任意の点の$${x}$$座標 float型
返り値:$${-\pi}$$より大きく$${\pi}$$以下の実数 float型

以下のようなコードを記述することで、図1に示す$${x}$$軸正方向からの角度$${\alpha}$$を求めることができます。

float alpha = atan2(y,x);
図1 atan2 関数

なお、引数の順番が、$${x, y}$$の順ではなく、$${y, x}$$の順になっていることに注意してください。

この atan2 関数を用いると、上記三角関数の合成の節で示した三角関数を合成したときの位相$${\alpha}$$を

float alpha = atan2(b,a);

で計算することができます。


プログラム

キャンバス上に座標軸を描く関数 setAxes を利用して課題の三角関数のグラフを描くためのスケッチ「draw_compositions」を準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「draw_compositions」の中の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 =  // 振幅
  k =  // θの係数
  alpha =  // 位相
  y1 =  // 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 スケッチ「draw_compositions」の 「draw_compositions」タブに書かれているコード

ソースコード1の下部に記載の draw_sin 関数と draw_cos 関数は以前作成した、それぞれ

$$
y = A \sin (k(\theta - \alpha)) + y_1
$$

$$
y = A \cos (k(\theta - \alpha)) + y_1
$$

のグラフを描く関数となっています。これらの関数を利用して課題(1)と(2)のグラフを描くコードをソースコード1の setup 関数内に記述していますので、それらを参考にして、課題(3)のコード

  // (3) 合成関数
  stroke(0,0,0);
  A =  // 振幅
  k =  // θの係数
  alpha =  // 位相
  y1 =  // y軸方向の移動量
  draw_sin(A,k,-alpha,y1); 

の部分を完成させてください。
その後、実行ボタンを押すと、キャンバス上に座標軸とともに課題の三角関数のグラフが描かれるはずです。


それでは、よろしくお願いします。

MK's papa


いいなと思ったら応援しよう!