見出し画像

高校数学をプログラミングで解く(数学II編)「3-7 加法定理の応用」


はじめに

今回は、数学IIで学ぶ「加法定理の応用」について、2倍角の公式や半角の公式を確かめるプログラムを作成します。また、応用例として、三角形の内心の座標を2倍角の公式を利用して計算し直してみます。

2倍角の公式、半角の公式

まず、加法定理の応用として、2倍角の公式、半角の公式について解説しておきます。

2倍角の公式

記事『高校数学をプログラミングで解く(数学II編)「3-6 加法定理」』で説明した加法定理において$${\beta = \alpha}$$とすることで、次の公式が得られます。

$$
\sin 2 \alpha = 2 \sin \alpha \cos \alpha
$$

$$
\cos 2 \alpha = \cos^2 \alpha - \sin^2  \alpha = 1 - 2 \sin^2 \alpha = 2 \cos^2 \alpha - 1
$$

$$
\tan 2\alpha = \frac{ 2 \tan \alpha }{1 - \tan^2 \alpha }
$$

参考 3倍角の公式

$$
\sin 3\alpha = 3 \sin \alpha - 4 \sin^3 \alpha, \ \cos 3 \alpha = -3 \cos \alpha + 4 \cos^3 \alpha
$$

半角の公式

$${\cos 2 \alpha}$$に対する2倍角の公式において$${2 \alpha \to \alpha}$$とした上で変形することで、次の公式が得られます。

$$
\sin^2 \frac{\alpha}{2} = \frac{1-\cos \alpha}{2}, \ \cos^2 \frac{\alpha}{2} = \frac{1+\cos \alpha}{2}, \ \tan^2 \frac{\alpha}{2} = \frac{1-\cos \alpha}{1+\cos \alpha}
$$

2倍角の公式を確かめる

今回は、記事『高校数学をプログラミングで解く(数学I編)「2-2 三角比の相互関係」』で行った方法と同じように、$${\alpha}$$の値を$${10^{\circ}}$$から$${80^{\circ}}$$まで$${10^{\circ}}$$ずつ動かしていき、左辺の値と右辺の値をそれぞれ出力して一致しているかどうか確かめることで、2倍角の公式が成り立っているであろうことをプログラムを書いて確かめてみます。

プログラム

では、2倍角の公式を確かめるためのプログラムを作成します。

// 2倍角の公式を確認する
void setup(){
  float alpha; // 角度(°)
  float lhs, rhs; // 左辺と右辺の値
  
  // sinの2倍角の公式
  println("sinの2倍角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = sin( 2.0 * radians(alpha) );
    rhs = 2.0 * sin( radians(alpha) ) * cos( radians(alpha) );
    println( alpha, lhs, rhs );
  }
  println();
  
  // cosの2倍角の公式
  float rhs2, rhs3;
  println("cosの2倍角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = cos( 2.0 * radians(alpha) );
    rhs = cos( radians(alpha) ) * cos( radians(alpha) ) 
          - sin( radians(alpha) ) * sin( radians(alpha) );
    rhs2 = 1.0 - 2.0 * sin( radians(alpha) ) * sin( radians(alpha) );
    rhs3 = 2.0 * cos( radians(alpha) ) * cos( radians(alpha) ) - 1.0;
    println( alpha, lhs, rhs, rhs2, rhs3 );
  }
  println();
  
  // tanの2倍角の公式
  println("tanの2倍角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = tan( 2.0 * radians(alpha) );
    rhs = 2.0 * tan( radians(alpha) ) 
          / (1.0 - tan( radians(alpha) ) * tan( radians(alpha) ) );
    println( alpha, lhs, rhs );
  }
  
}

ソースコード1 2倍角の公式を確かめるプログラム

ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「check_double_angle_formula」としています)、テキストエディタ部分に書いて実行します。

図1 スケッチ「check_double_angle_formula」の実行結果

図1のように、コンソールに3つの2倍角の公式それぞれに対して、角度($${\alpha}$$)の値(単位は「°」)、左辺の値、右辺の値($${\cos}$$の2倍角の公式については3つ)、の順で$${\alpha}$$の値を$${10^{\circ}}$$から$${80^{\circ}}$$まで$${10^{\circ}}$$ずつの間隔で出力しています。出力された値を以下に書き出してみます。

sinの2倍角の公式
10.0 0.34202012 0.34202012
20.0 0.6427876 0.6427876
30.0 0.86602545 0.8660254
40.0 0.9848077 0.98480767
50.0 0.9848077 0.9848078
60.0 0.8660254 0.8660254
70.0 0.64278764 0.64278764
80.0 0.3420202 0.3420202

cosの2倍角の公式
10.0 0.9396926 0.93969256 0.9396926 0.9396925
20.0 0.76604444 0.76604444 0.7660445 0.7660444
30.0 0.49999997 0.5 0.5 0.5
40.0 0.17364822 0.17364818 0.17364824 0.17364812
50.0 -0.1736482 -0.17364812 -0.17364812 -0.17364812
60.0 -0.50000006 -0.5000001 -0.5000001 -0.50000006
70.0 -0.76604444 -0.7660444 -0.7660444 -0.76604444
80.0 -0.9396926 -0.93969256 -0.9396925 -0.9396926

tanの2倍角の公式
10.0 0.36397022 0.36397022
20.0 0.8390996 0.8390996
30.0 1.7320509 1.7320508
40.0 5.6712804 5.6712794
50.0 -5.6712813 -5.6712804
60.0 -1.7320505 -1.7320507
70.0 -0.83909965 -0.83909965
80.0 -0.36397034 -0.36397034

これらの結果を見ると、左辺の値と右辺の値は丸め誤差の範囲内で一致していることがわかります。つまり、2倍角の公式は成り立っているだろうということが確認できます。

半角の公式を確かめる

同様にして、半角の公式が成り立っているであろうことをプログラムを書いて確かめてみます。

プログラム

では、半角の公式を確かめるためのプログラムを作成します。

// 半角の公式を確認する
void setup(){
  float alpha; // 角度(°)
  float lhs, rhs; // 左辺と右辺の値
  
  // sinの半角の公式
  println("sinの半角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = sin( radians(alpha) / 2.0 ) * sin( radians(alpha) / 2.0 );
    rhs = (1.0 - cos( radians(alpha) )) / 2.0;
    println( alpha, lhs, rhs );
  }
  println();
  
  // cosの半角の公式
  println("cosの半角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = cos( radians(alpha) / 2.0 ) * cos( radians(alpha) / 2.0 );
    rhs = (1.0 + cos( radians(alpha) )) / 2.0;
    println( alpha, lhs, rhs );
  }
  println();
  
  // tanの半角の公式
  println("tanの半角の公式");
  for(int i=1; i<=8; i++){ // 10°から80°まで動かす
    alpha = 10.0 * i;
    lhs = tan( radians(alpha) / 2.0 ) * tan( radians(alpha) / 2.0 );
    rhs = (1.0 - cos( radians(alpha) )) / (1.0 + cos( radians(alpha) ));
    println( alpha, lhs, rhs );
  }
  
}

ソースコード2 半角の公式を確かめるプログラム

ソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「check_half_angle_formula」としています)、テキストエディタ部分に書いて実行します。

図2 スケッチ「check_half_angle_formula」の実行結果

図2のように、コンソールに3つの半角の公式それぞれに対して、角度($${\alpha}$$)の値(単位は「°」)、左辺の値、右辺の値、の順で$${\alpha}$$の値を$${10^{\circ}}$$から$${80^{\circ}}$$まで$${10^{\circ}}$$ずつの間隔で出力しています。出力された値を以下に書き出してみます。

sinの半角の公式
10.0 0.0075961226 0.007596135
20.0 0.03015369 0.030153692
30.0 0.0669873 0.066987306
40.0 0.116977766 0.11697778
50.0 0.1786062 0.17860618
60.0 0.25 0.25
70.0 0.32898995 0.32898992
80.0 0.41317588 0.41317588

cosの半角の公式
10.0 0.9924039 0.99240386
20.0 0.96984625 0.9698463
30.0 0.93301266 0.9330127
40.0 0.8830222 0.8830222
50.0 0.8213937 0.82139385
60.0 0.75 0.75
70.0 0.6710101 0.6710101
80.0 0.58682406 0.5868241

tanの半角の公式
10.0 0.0076542655 0.007654278
20.0 0.031091202 0.031091206
30.0 0.07179677 0.071796775
40.0 0.13247432 0.13247433
50.0 0.21744284 0.21744281
60.0 0.3333333 0.33333334
70.0 0.49029058 0.49029058
80.0 0.7040881 0.7040881

これらの結果を見ると、左辺の値と右辺の値は丸め誤差の範囲内で一致していることがわかります。つまり、半角の公式は成り立っているだろうということが確認できます。

内心と内接円(再考)

記事『高校数学をプログラミングで解く(数学A編)「2-3 三角形の五心」』において、三角形ABC(図3)に対してその内心と内接円を描くプログラムを作成しました。

図3 三角形ABC

そして、三角形ABCの内心と内接円を描いた結果は図4のようになりました。

図4 内心と内接円をキャンバスに描画(再掲)

内心の座標を求めるために三角形の内角の二等分線の方程式を算出する必要がありますが、このときは「△ABCの内角Aの二等分線と辺BCとの交点が辺BCをAB:AC=$${c:b}$$に内分する」ことを利用して算出しました。今回は、学んだ2倍角の公式を利用して三角形の内角の二等分線の方程式を求めてみます。

頂点の座標位置

記事『高校数学をプログラミングで解く(数学A編)「2-3 三角形の五心」』で外心や内心を描いたときと同じ座標軸を設定します。

図5 頂点の座標位置

このように座標軸を設定すると、頂点Aの座標を$${(0,0)}$$、頂点Bの座標を$${(c,0)}$$と置くことができ、また、頂点Cの座標$${(x_C,y_C)}$$は

$$
x_C=\frac{b^2+c^2-a^2}{2c}, \ \ y_C=\frac{\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)}}{2c}
$$

となります。

内心を求める

では、内心を求めます。内心は「三角形の3つの内角の二等分線が交わる点」になりますが、3つの内角のうちの2つの内角の二等分線の交点を求めればよいので、今回は、内角Aと内角Bの二等分線を求めます。

図6 内角Aと内角Bの二等分線

内角Aの二等分線

内角Aの半分の角度を$${\alpha}$$とします。このとき、タンジェントに対する2倍角の公式を利用すると、

$$
\tan A = \frac{2 \tan \alpha}{1-\tan^2 \alpha}
$$

となるので、この式から、

$$
\tan \alpha= \frac{\sqrt{1+\tan^2 A} -1}{\tan A}
$$

が得られます。一方、頂点Cの座標$${(x_C, y_C)}$$を利用すると、

$$
\tan A = \frac{y_C}{x_C}
$$

と表すことができます。したがって、

$$
\tan \alpha = \frac{\sqrt{x_C^2+y_C^2}-x_C}{y_C}=\frac{b-x_C}{y_C}
$$

となります。この$${\tan \alpha}$$は、内角Aの二等分線の傾きとなります。点Aを原点としているので、内角Aの二等分線の方程式は

$$
y=\tan \alpha x = \frac{b-x_C}{y_C}x
$$

となります。

内角Bの二等分線

内角Bの半分の角度を$${\beta}$$とします。内角Aの二等分線を求めたときと同様に、タンジェントに対する2倍角の公式を利用すると、

$$
\tan B = \frac{2 \tan \beta}{1-\tan^2 \beta}
$$

となるので、この式から、

$$
\tan \beta= \frac{\sqrt{1+\tan^2 B} -1}{\tan B}
$$

が得られます。一方、頂点Cの座標$${(x_C,y_C)}$$の値を利用して、

$$
\tan B = \frac{y_C}{c-x_C}
$$

と表すことができます。したがって、

$$
\tan \beta = \frac{\sqrt{(c-x_C)^2+y_C^2} -c+x_C}{y_C}=\frac{a-c+x_C}{y_C}
$$

となります。この$${\tan \beta}$$を利用すると、内角Bの二等分線の傾きは$${-\tan \beta}$$と表すことができます。内角Bの二等分線が点$${(c,0)}$$を通ることを考慮すると、内角Bの二等分線の方程式は

$$
y=-\tan \beta(x-c) = \frac{a-c+x_C}{y_C}(c-x)
$$

となります。

内心Iの座標位置

内角Aの二等分線の方程式と内角Bの二等分線の方程式を求めることができたので、それらの直線の交点である内心Iの座標$${(x_I, y_I)}$$を求めることができます。

$$
x_I = \frac{c \tan \beta}{\tan \alpha + \tan \beta}, \ \ y_I = \frac{c \tan \alpha \tan \beta}{\tan \alpha + \tan \beta}
$$

内接円の半径

内接円の半径は辺ABから内心Iへの高さになります。特に、今回辺ABを$${x}$$軸と一致させているので、内接円の半径$${r_I}$$は

$$
r_I=y_I = \frac{c \tan \alpha \tan \beta}{\tan \alpha + \tan \beta}
$$

となります。

内心と内接円を描くプログラム

内心Iの座標$${(x_I,y_I)}$$と内接円の半径$${r_I}$$がわかりましたので、あとは円を描く関数circleを用いれば内接円を描くことができます。では、三角形の内心と内接円を描くプログラムを作成します。

// 辺の長さの比が4,5,6の三角形に内心と内接円を描く
void setup(){
  size(650,650); // キャンバスの大きさを指定する
  translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
  scale(1,-1); // y軸正の向きを下向きから上向きに反転する
  background(255,255,255); // 背景を白色にする
  noFill(); // 図形の塗りつぶしなし
  noLoop(); // 繰り返し処理をしない
  
  // 三角形の辺の長さ
  float a, b, c; 
  a = 200.0;
  b = 250.0;
  c = 300.0;
  
  // 三角形の頂点の座標
  float A_x, A_y, B_x, B_y, C_x, C_y;
  A_x = 0.0;
  A_y = 0.0;
  B_x = c;
  B_y = 0.0;
  C_x = (c*c + b*b - a*a) / 2.0 / c;
  C_y = sqrt( (a+b+c) * (-a+b+c) * (a-b+c) * (a+b-c) ) / 2.0 / c;
  
  // 三角形を描く
  triangle(A_x, A_y, B_x, B_y, C_x, C_y);
 
  // 内角Aの半分の角度αと内角Bの半分の角度βのタンジェントの値
  float tan_alpha, tan_beta;
  tan_alpha = (b-C_x)/C_y;
  tan_beta = (a-c+C_x)/C_y;
  
  // 内心の座標
  float I_x, I_y;
  I_x = c * tan_beta / ( tan_alpha + tan_beta );
  I_y = c * tan_alpha * tan_beta / ( tan_alpha + tan_beta );
  
  // 内接円の半径
  float I_r;
  I_r = I_y;

  // 内接円を描画する
  stroke(0,0,255);
  circle(I_x, I_y, 2.0*I_r);
  // 内心を描画する
  strokeWeight(5.0);
  point(I_x, I_y);

}

ソースコード3 内心と内接円を描くプログラム

このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawInscribedCircle2」としています)、テキストエディタ部分に書いて実行すると、実行ウィンドウのキャンバスに三角形とその内心と内接円が描かれます。

図7 内心と内接円をキャンバスに描画(図4と変わらない)

まとめ

今回は、数学IIで学ぶ「加法定理の応用」について、2倍角の公式や半角の公式を確かめるプログラムを作成しました。また、応用例として、三角形の内心の座標を2倍角の公式を利用して計算し直してみました。記事『高校数学をプログラミングで解く(数学A編)「2-3 三角形の五心」』では、「△ABCの内角Aの二等分線と辺BCとの交点が辺BCをAB:AC=$${c:b}$$に内分する」ことを利用しましたが、どちらかやりやすい方で考えられればいいと思います。
2倍角の公式や半角の公式は三角関数を扱う上で重要な公式です。ただ、これらの公式を覚える必要はあまりありません。というのも、加法定理からこれら2倍角の公式や半角の公式を簡単に導くことができるからです。
ただ、何度も導いているうちに結果として覚えてしまうかもしれません。

参考文献

改訂版 教科書傍用 スタンダード 数学II(数研出版、ISBN9784410209369)

この記事が気に入ったらサポートをしてみませんか?