見出し画像

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

割引あり

マガジンリスト > 数学A編 2.図形の性質 > 2-8 方べきの定理


はじめに

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

方べきの定理

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

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

$$
\mathrm{PA} \cdot \mathrm{PB} = \mathrm{PC} \cdot \mathrm{PD}
$$

が成り立つ。

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


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

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

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

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

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

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

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

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

点$${\mathrm{A,B,C,D}}$$の座標位置を決めておきます。いずれの点も円$${\mathrm{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の座標を求める

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

点$${\mathrm{P}}$$の座標$${(x_P, y_P)}$$は直線$${\mathrm{AB}}$$と直線$${\mathrm{CD}}$$との交点になります。直線$${\mathrm{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}
$$

となり、直線$${\mathrm{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の長さを求める

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

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

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

最後に、方べきの定理の式に出てくる$${\mathrm{PA} \cdot \mathrm{PB}}$$と$${\mathrm{PC} \cdot \mathrm{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」としています)、テキストエディタ部分に書いて実行すると、$${\mathrm{PA, PB, PC, PD}}$$の長さと$${\mathrm{PA} \cdot \mathrm{PB}}$$、$${\mathrm{PC} \cdot \mathrm{PD}}$$の値が開発環境ウィンドウのコンソールに出力されます。

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

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

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

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

方べきの定理の考察

今回は、2つの弦の交点の場合(図1)に方べきの定理が成り立っていることをプログラムを作成して確かめてみました。同様に、2つの弦の延長の交点となる場合(図2)についても確かめることができます。たとえば、点$${\mathrm{B}}$$と点$${\mathrm{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で学ぶ「方べきの定理」について、この定理が実際に成り立っているのかをプログラムを作って確かめてみました。具体的に、線分$${\mathrm{PA, PB, PC, PD}}$$の長さを求めた結果を見ると、それらの長さにあまり関連がなさそうに見えますが、$${\mathrm{PA} \cdot \mathrm{PB}}$$と$${\mathrm{PC} \cdot \mathrm{PD}}$$の値を見てみるとそれらの値が一致しています。
あと最後に念のため言っておくと、今回行ったことは成り立つことをいくつかの例を使って確かめただけで、この定理が成り立つことを証明したわけではないことに注意してください。証明はそんなに難しくないので、一度チャレンジしてみてください。

参考文献

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


演習問題

2つの弦の延長の交点となる場合(図2)について方べきの定理が成り立っていることをプログラムを作成して確かめてください。


演習問題の解答例

ここから先は

481字 / 1画像 / 1ファイル

この記事が気に入ったらチップで応援してみませんか?