見出し画像

高校数学をプログラミングで解く(数学III編)「2-7 2次曲線の性質」

割引あり

マガジンリスト > 数学Ⅲ編 2.式と曲線 > 2-7 2次曲線の性質


はじめに

今回は、数学IIIで学ぶ「2次曲線の性質」について、焦点、準線、離心率をベースに定義した2次曲線を描くプログラムを作成します。

2次曲線の性質

まず、2次曲線の性質(焦点、準線、離心率)について解説します。

焦点、準線、離心率

定点$${\mathrm{F}}$$と、$${\mathrm{F}}$$を通らない定直線$${l}$$からの距離の比が$${e:1}$$である点$${\mathrm{P}}$$の軌跡は
 $${0 < e < 1}$$のとき楕円
 $${e = 1}$$のとき放物線
 $${e > 1}$$のとき双曲線
( $${\mathrm{F}}$$:焦点、$${l}$$:焦点$${\mathrm{F}}$$に対する準線、$${e}$$:離心率)

参考 楕円では$${a > b >0}$$、双曲線では$${a > 0, b > 0}$$とする。
楕円

$$
\frac{x^2}{a^2}+\frac{y^2}{b^2} = 1 \ \ \ \ \mathrm{F}:(\pm ae, 0) \ \ \ \ l:x=\pm\frac{a}{e} \ \ \ \ e = \frac{\sqrt{a^2-b^2}}{a} < 1
$$

双曲線

$$
\frac{x^2}{a^2}-\frac{y^2}{b^2} = 1 \ \ \ \ \mathrm{F}:(\pm ae, 0) \ \ \ \ l:x=\pm\frac{a}{e} \ \ \ \ e = \frac{\sqrt{a^2+b^2}}{a} > 1
$$

放物線

$$
y^2 = 4px \ \ \ \ \mathrm{F}:(p, 0) \ \ \ \ l:x=-p \ \ \ \ e = 1
$$

一般的な2次曲線の軌跡を描く

今回は、上記で解説した焦点、準線、離心率をベースに定義した、一般的な2次曲線を描くプログラムを作成します。つまり、焦点を$${\mathrm{F}(p,q)}$$、準線$${l}$$を直線$${ax+by+c=0}$$としたときに、離心率$${e}$$を変えたときの2次曲線の軌跡を考えます。

問題
焦点$${\mathrm{F}(1,1)}$$からの距離と、準線$${l:x+y+4=0}$$からの距離の比が次のような点$${\mathrm{P}}$$の軌跡を描け。

$$
\mathrm{(1)} \ \ 1:1 \ \ \ \ \ \ \ \ \mathrm{(2)} \ \ 2:1 \ \ \ \ \ \ \ \ \mathrm{(3)} \ \ 1:2 
$$

アルゴリズム設計

一般的な2次曲線の方程式
一般的な2次曲線の定義から一般的な2次曲線の方程式を導きます。
焦点$${\mathrm{F}(p,q)}$$からの距離$${r_1}$$と、$${\mathrm{F}}$$を通らない準線$${l:ax+by+c=0}$$からの距離$${r_2}$$との比が$${e:1}$$である点$${\mathrm{P}(x,y)}$$の軌跡を考えます。
点$${\mathrm{F}}$$と点$${\mathrm{P}}$$との距離$${r_1}$$は

$$
r_1 = \sqrt{ (x-p)^2+(y-q)^2 }
$$

となります。一方、点$${\mathrm{P}}$$と準線$${l}$$との距離$${r_2}$$は、

$$
r_2 = \frac{|ax+by+c|}{\sqrt{a^2+b^2}}
$$

となります。したがって、一般的な2次曲線の方程式は

$$
r_1 : r_2 = e:1 \ \ \Rightarrow \ \ r_1-er_2 = 0
$$

となります。

一般的な2次曲線の軌跡を描く
この一般的な2次曲線の軌跡を描くにあたり、記事『高校数学をプログラミングで解く(数学II編)「2-5 軌跡と方程式」』や記事『高校数学をプログラミングで解く(数学III編)「2-1 放物線」』などで解説した方法を利用します。
つまり、$${xy}$$平面の描画範囲内の任意の点$${(x,y)}$$を取ってきて、その点が一般的な2次曲線の方程式を満たすかどうかを確かめ、方程式を満たしていればその点をキャンバス上の$${xy}$$平面にプロットし、方程式を満たしていなければプロットしないというルールで行います。そして、プロットされた点が描く軌跡が求めたい2次曲線になっているかを確認します。なお、記事『高校数学をプログラミングで解く(数学III編)「1-4 複素数と図形(1)」』で作成したスケッチ「drawTrajectory_complex」でも同様の方法を利用しているので、そちらの解説も確認してみてください。

プログラム

今回は、記事『高校数学をプログラミングで解く(数学III編)「2-1 放物線」』で作成したスケッチ「draw_parabola_general」を再利用します。以下の zip ファイルをダウンロードして展開または解凍してください。

そして、スケッチの名前(フォルダ名)を「draw_quadratic_curve_general」と変更し、またスケッチ「draw_quadratic_curve_general」内の「draw_parabola_general.pde」ファイルの名前を「draw_quadratic_curve_general.pde」に変更します。そして、pdeファイル「draw_quadratic_curve_general.pde」をダブルクリックしてスケッチ「draw_quadratic_curve_general」の開発環境ウィンドウを立ち上げます。

問題の一般的な2次曲線の軌跡を描くプログラムを作成していきます。

// 一般的な2次曲線の方程式を満たす点が描く図形
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,P2D); // widthとheightは同じにしておく
  noLoop();

  setAxes(x_range, y_range); // 座標軸の準備
  
  noFill(); // グラフの中身を塗りつぶさない
  stroke(0,0,0); // グラフの線の色を黒色に設定
  
  // 点の生成回数
  int n = 1000000;
  // マージン
  float margin = 0.001;
 
  // 焦点の座標
  float p = 1.0;
  float q = 1.0;
  
  // 準線を表す直線の方程式の係数
  float a = 1.0;
  float b = 1.0;
  float c = 4.0;
  
  float x, y; // 任意の点の座標
  float r1; // 焦点からの距離
  float r2; // 準線からの距離
  // 離心率
  float e1 = 1.0; // (1) 比が1:1
  float e2 = 2.0; // (2) 比が2:1
  float e3 = 0.5; // (3) 比が1:2
  
  for(int i=0; i<n; i++){
    // 任意の複素数を生成
    x = random(-x_range, x_range);
    y = random(-y_range, y_range);
    
    // 距離を計算
    r1 = sqrt((x-p)*(x-p)+(y-q)*(y-q));
    r2 = abs(a*x+b*y+c)/sqrt(a*a+b*b);
    // (1) の条件を満たせば赤色でプロット
    if( abs(r1-e1*r2) < margin ){
      stroke(255,0,0);
      plot_point(x,y);
    }
    // (2) の条件を満たせば緑色でプロット
    if( abs(r1-e2*r2) < margin ){
      stroke(0,255,0);
      plot_point(x,y);
    }    
    // (3) の条件を満たせば緑色でプロット
    if( abs(r1-e3*r2) < margin ){
      stroke(0,0,255);
      plot_point(x,y);
    }    
  }
  
  // 焦点をプロット
  stroke(0,0,0);
  plot_point(p,q);
  
  // 準線を描く
  float y_l = -a/b * (-x_range) -c/b;
  float Y_l = height / 2.0 / y_range * y_l;
  float y_r = -a/b * (x_range) -c/b;
  float Y_r = height / 2.0 / y_range * y_r;
  line(-width/2.0, Y_l, width/2.0, Y_r);
  
}

// 座標(x,y)に点をプロットする関数
void plot_point(
  float x, // 点のx座標
  float y  // 点のy座標
){
  float X, Y; // キャンバス上の座標
  // キャンバス上の座標位置に換算
  X = width / 2.0 / x_range * x;
  Y = height / 2.0 / y_range * y;
  strokeWeight(5);
  point(X, Y);
  strokeWeight(1);
}

ソースコード1 一般的な2次曲線の軌跡を描くプログラム

スケッチ「draw_quadratic_curve_general」の「draw_quadratic_curve_general」タブを選択してそのテキストエディタ部分をソースコード1で書き換えて実行すると、図1のように、実行ウィンドウのキャンバスの$${xy}$$平面上に、問題(1)の軌跡が赤色、問題(2)の軌跡が緑色、問題(3)の軌跡が青色、そして焦点と準線が黒色でそれぞれ描かれます。

図1 一般的な2次曲線の軌跡

図1を見ると、離心率$${e}$$が$${e = 1}$$のとき放物線(赤色)、$${e>1}$$のとき双曲線(緑色)、$${0 < e < 1}$$のとき楕円(青色)となっていることがわかります。これは、最初に解説した離心率と2次曲線(放物線、楕円、双曲線)との関係と一致しています。

まとめ

今回は、数学IIIで学ぶ「2次曲線の性質」について、焦点、準線、離心率をベースに定義した2次曲線を描くプログラムを作成しました。
今回のプログラムでは、記事『高校数学をプログラミングで解く(数学III編)「2-1 放物線」』などでも利用した、$${xy}$$平面上の任意の点を取ってきて方程式を満たせば、$${xy}$$平面上にプロットするという方法を取りました。その結果、焦点、準線、離心率をベースに定義した2次曲線の方程式から放物線、楕円、双曲線の軌跡がきちんと描かれていることが確認できました。
最後に、今回プログラムで2次曲線の軌跡が得られることを確認しましたが、焦点が$${x}$$軸上に乗っており、準線$${l}$$が$${y}$$軸と平行となっているような比較的簡単な場合について離心率$${e}$$に対する2次曲線の方程式を解析的に導いておくことはやっておいた方がよいと思います。つまり、上記の焦点、準線、離心率の節の参考に示したことについて、右側に記載した焦点、準線、離心率から、左側に記載した方程式を導いておくことをお勧めします。これができれば、一般的な2次曲線についても記事『高校数学をプログラミングで解く(数学III編)「2-4 2次曲線の移動」』で解説したことを利用してその方程式を導くことができます。


読んだ感想などをお寄せください

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。感想、質問をいただいた方には本記事の演習問題の解答をプレゼントします。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


参考文献

改訂版 教科書傍用 スタンダード・オリジナル 数学III(数研出版、ISBN9784410209567)


演習問題

焦点を$${(p,0)}$$、準線を$${x=-p}$$、離心率を$${e}$$とする曲線上の点$${\mathrm{P}(x,y)}$$としたとき、楕円($${e < 1}$$)、放物線($${e = 1}$$)、双曲線($${e > 1}$$)の方程式を$${x,y}$$の式で表してください。そして、$${p=2}$$として、$${e=0.5, e=1, e=2}$$のときの方程式のグラフを描くプログラムを作成してください。

ヒント

焦点$${(p,0)}$$から点$${\mathrm{P}(x,y)}$$までの距離は、

$$
\sqrt{(x-p)^2+y^2}
$$

となり、準線$${x=-p}$$から点$${\mathrm{P}(x,y)}$$までの距離は、

$$
|x+p|
$$

となるので、点$${\mathrm{P}}$$の軌跡の方程式は

$$
\sqrt{(x-p)^2+y^2}:|x+p| = e:1
$$

となります。この方程式を$${e < 1}$$のとき、$${e = 1}$$のとき、$${e > 1}$$のときで場合分けして式を整理してください。

また、グラフの描画について、楕円($${e < 1}$$)は記事『高校数学をプログラミングで解く(数学III編)「2-2 楕円」』で作成した関数 draw_ellipse_w_focuses 、放物線($${e = 1}$$)は記事『高校数学をプログラミングで解く(数学III編)「2-1 放物線」』で作成した関数 draw_parabola_x_axis 、楕円($${e < 1}$$)は記事『高校数学をプログラミングで解く(数学III編)「2-3 双曲線」』で作成した関数 draw_hyperbola_x_axis を利用すると便利です。ただし、楕円と双曲線の関数は少し修正が必要になります。


演習問題の解答例

ここから先は

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

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