見出し画像

高校数学をプログラミングで解く(数学A編)「2-8 方べきの定理」


はじめに

今回は、数学Aで学ぶ「方べきの定理」について、方べきの定理が成り立っていることを確認するためのプログラムを作成します。

方べきの定理

まず、方べきの定理をまとめておきます。

方べきの定理
円の2つの弦AB、CDの交点(図1)、またはそれらの延長の交点(図2)をPとすると

$$
PA \cdot PB = PC \cdot PD
$$

が成り立つ。

図1 方べきの定理(弦の交点)


図2 方べきの定理(弦の延長の交点)

今回は、この方べきの定理が成り立っていることをプログラムを作成して確かめます。

アルゴリズム設計(確かめるための準備)

この方べきの定理を確かめるための手順を考えてみます。
①円Oとその円周上の点A,B,C,Dを準備する
②点Pの座標を求める
③PA, PB, PC, PDの長さを求める
④PA・PBとPC・PDを計算する
最後の手順④で計算したPA・PBとPC・PDの値が一致していれば、方べきの定理が成り立っていることになります。
以下で、この手順を順番に解説していきます。

円Oとその円周上の点A,B,C,Dを準備する

座標軸を用意して半径$${r}$$の円Oを中心が座標軸の原点と一致するように準備し、円Oの円周上に点A,B,C,Dを図3のようにとります。

図3 座標軸の設定、円と円周上の点の準備

今回は、特に円Oの半径を$${r=150}$$とします。

点A,B,C,Dの座標位置を決めておきます。いずれの点も円O上にあるので、座標位置の$${x}$$成分を決めると、$${y}$$成分は$${\pm \sqrt{r^2-x^2}}$$のいずれかに決まります。今回は

$$
x_A=-100,  y_A=\sqrt{r^2-x_A^2} \\
x_B=140,  y_B=-\sqrt{r^2-x_B^2} \\
x_C=-80,  y_C=-\sqrt{r^2-x_C^2} \\
x_D=145,  y_D=\sqrt{r^2-x_D^2}
$$

と座標位置を設定しました。

点Pの座標を求める

点A,B,C,Dの座標位置を決めたので、点Pの座標位置を求めることができます(図1参照)。

点Pの座標$${(x_P, y_P)}$$は直線ABと直線CDとの交点になります。直線ABの方程式は

$$
y=m_1x+n_1, \\ m_1=\frac{y_B-y_A}{x_B-x_A}, n_1=\frac{x_By_A-x_Ay_B}{x_B-x_A}
$$

となり、直線CDの方程式は、

$$
y=m_2x+n_2, \\ m_2=\frac{y_D-y_C}{x_D-x_C}, n_2=\frac{x_Dy_C-x_Cy_D}{x_D-x_C}
$$

となるので、これらを連立方程式として解くと、

$$
x_P=-\frac{n_2-n_1}{m_2-m_1}, \ y_P=\frac{m_2n_1-m_1n_2}{m_2-m_1}
$$

と求めることができます。

PA, PB, PC, PDの長さを求める

頂点A,B,C,D及び点Pの座標位置がわかりましたので、方べきの定理に出てくる線分の長さを求めます。

$$
PA=\sqrt{(x_A-x_P)^2+(y_A-y_P)^2} \\
PB=\sqrt{(x_B-x_P)^2+(y_B-y_P)^2} \\
PC=\sqrt{(x_C-x_P)^2+(y_C-y_P)^2} \\
PD=\sqrt{(x_D-x_P)^2+(y_D-y_P)^2}
$$

PA・PBとPC・PDを計算する

最後に、方べきの定理の式に出てくるPA・PBとPC・PDを計算します。これら2つの値が一致していれば、方べきの定理が成り立っていることになります。

方べきの定理を確かめるためのプログラム

ここまで説明してきたことをプログラミングしてみます。

// 方べきの定理が成り立っているか確かめる
void setup(){
  size(500, 500); // キャンバスの大きさを指定する
  translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
  scale(1,-1); // y軸正の向きを下向きから上向きに反転する
  background(255,255,255); // 背景を白色にする
  noFill(); // 図形の塗りつぶしなし
  noLoop(); // 繰り返し処理をしない
  
  // 円Oの中心座標と半径
  float O_x, O_y, O_r; 
  O_x = 0.0;
  O_y = 0.0;
  O_r = 150.0;
  
  // 点Aの座標
  float A_x, A_y;
  A_x = -100.0;
  A_y = O_y + sqrt(O_r * O_r - (A_x - O_x) * (A_x - O_x));  

  // 点Bの座標
  float B_x, B_y;
  B_x = 140.0;
  B_y = O_y - sqrt(O_r * O_r - (B_x - O_x) * (B_x - O_x));  

  // 点Cの座標
  float C_x, C_y;
  C_x = -80.0;
  C_y = O_y - sqrt(O_r * O_r - (C_x - O_x) * (C_x - O_x));  

  // 点Dの座標
  float D_x, D_y;
  D_x = 145.0;
  D_y = O_y + sqrt(O_r * O_r - (D_x - O_x) * (D_x - O_x));  

  // 直線ABの傾きと切片
  float m1, n1;
  m1 = (B_y - A_y)/(B_x - A_x);
  n1 = (B_x*A_y - A_x*B_y)/(B_x - A_x);

  // 直線CDの傾きと切片
  float m2, n2;
  m2 = (D_y - C_y)/(D_x - C_x);
  n2 = (D_x*C_y - C_x*D_y)/(D_x - C_x);

  // 点Pの座標
  float P_x, P_y;
  P_x = -(n2 - n1)/(m2 - m1);
  P_y = (m2*n1 - m1*n2)/(m2 - m1);

  //  円Oを描く
  circle(O_x, O_y, 2.0*O_r);
  // 円の中心を描く
  strokeWeight(5.0);
  point(O_x, O_y);
  // 点A,B,C,Dを描く
  stroke(0,0,255);
  point(A_x, A_y);
  point(B_x, B_y);
  point(C_x, C_y);
  point(D_x, D_y);
  // 点Pを描く
  stroke(255,0,0);
  point(P_x, P_y);  
  // 線分PA, PB, PC, PDを描く
  stroke(0,0,255);
  strokeWeight(1.0);
  line(P_x, P_y, A_x, A_y);  
  line(P_x, P_y, B_x, B_y);
  line(P_x, P_y, C_x, C_y);
  line(P_x, P_y, D_x, D_y);

  // PA, PB, PC, PDの長さ
  float PA, PB, PC, PD;
  PA = sqrt( (A_x - P_x)*(A_x - P_x)+(A_y - P_y)*(A_y - P_y) );
  PB = sqrt( (B_x - P_x)*(B_x - P_x)+(B_y - P_y)*(B_y - P_y) );
  PC = sqrt( (C_x - P_x)*(C_x - P_x)+(C_y - P_y)*(C_y - P_y) );
  PD = sqrt( (D_x - P_x)*(D_x - P_x)+(D_y - P_y)*(D_y - P_y) );
  println("PA", PA);
  println("PB", PB);
  println("PC", PC);
  println("PD", PD);
  
  // 方べきの定理が成り立っているか確認
  println("PA*PB", PA * PB);
  println("PC*PD", PC * PD);
  
}

ソースコード1 方べきの定理を確かめるためのプログラム

ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「power_of_a_point_theorem」としています)、テキストエディタ部分に書いて実行すると、PA、PB、PC、PDの長さとPA・PB、PC・PDの値が開発環境ウィンドウのコンソールに出力されます。

図4 スケッチ「power_of_a_point_theorem」の結果がコンソールに出力される

この結果をみると、PA・PBとPC・PDの値がそれぞれ「16322.901」と「16322.9」となっています。結果の値が「0.001」だけの違いがありますが、これは浮動小数点数の丸め誤差ですので、これらの値は一致していると判断できます。

なお、今回のソースコード1のプログラムを実行すると、実行ウィンドウのキャンバスに方べきの定理を示す図形を描くようにしています。

図5 方べきの定理を示す図形

方べきの定理の考察

今回は、2つの弦の交点の場合(図1)に方べきの定理が成り立っていることをプログラムを作成して確かめてみました。同様に、2つの弦の延長の交点となる場合(図2)についても確かめることができます。たとえば、点Bと点Dを入れ替えて

$$
x_B=145, y_B=\sqrt{r^2-x_B^2} \\
x_D=140, y_D=-\sqrt{r^2-x_D^2}
$$

と座標位置を取り直すと、2つの弦の延長の交点となる場合に対応するプログラムを作ることができますので、一度試してみてください。

まとめ

今回は、数学Aで学ぶ「方べきの定理」について、この定理が実際に成り立っているのかをプログラムを作って確かめてみました。具体的に、線分PA, PB, PC, PDの長さを求めた結果を見ると、それらの長さにあまり関連がなさそうに見えますが、PA・PBとPC・PDの値を見てみるとそれらの値が一致しています。
あと最後に念のため言っておくと、今回行ったことは成り立つことをいくつかの例を使って確かめただけで、この定理が成り立つことを証明したわけではないことに注意してください。証明はそんなに難しくないので、一度チャレンジしてみてください。

参考文献

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

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