高校数学をプログラミングで解く(数学III編)「2-6 2次曲線と領域」
マガジンリスト > 数学Ⅲ編 2.式と曲線 > 2-6 2次曲線と領域
はじめに
今回は、数学IIIで学ぶ「2次曲線と領域」について、与えられた2次曲線の不等式の条件を満たす点をプロットしていくことで不等式の表す領域を描いていくプログラムを作成します。
2次曲線と領域
まず、2次曲線と領域について解説しておきます。
① 不等式
$$
\frac{x^2}{a^2} \pm \frac{y^2}{b^2} < 1
$$
の表す領域は、曲線
$$
\frac{x^2}{a^2} \pm \frac{y^2}{b^2} = 1
$$
を境界線とする領域の、原点を含む部分。
② 不等式
$$
\frac{x^2}{a^2} \pm \frac{y^2}{b^2} > 1
$$
の表す領域は、曲線
$$
\frac{x^2}{a^2} \pm \frac{y^2}{b^2} = 1
$$
を境界線とする領域の、原点を含まない部分。
注意
不等式の表す領域が原点を含むかどうかは、不等式に$${x=0, y=0}$$を代入してみればわかる。
2次曲線の不等式の表す領域を描く
今回は、2次曲線の不等式の表す領域を描くプログラムを作成していきます。
問題
次の不等式の表す領域を図示せよ。
$$
\mathrm{(1)} \ \ \frac{x^2}{9} + \frac{y^2}{4} > 1 \ \ \ \ \ \ \ \
\mathrm{(2)} \ \ \frac{x^2}{9} + \frac{y^2}{4} \leq 1
$$
$$
\mathrm{(3)} \ \ \frac{x^2}{9} - \frac{y^2}{4} > 1 \ \ \ \ \ \ \ \
\mathrm{(4)} \ \ \frac{x^2}{9} - \frac{y^2}{4} \leq 1
$$
アルゴリズム設計
2次曲線の不等式の表す領域を描くための手順は、記事『高校数学をプログラミングで解く(数学II編)「2-6 不等式の表す領域」』で解説した方法を利用します。
問題(1)のプログラム
それでは、問題(1)の不等式の表す領域を描くプログラムを作成します。今回は、記事『高校数学をプログラミングで解く(数学II編)「2-6 不等式の表す領域」』で作成したスケッチ「drawAreaOfInequation1」を再利用します。以下の zip ファイルをダウンロードして展開または解凍してください。
そして、スケッチの名前(フォルダ名)を「drawAreaOfquadratic_curve1」と変更し、またスケッチ「drawAreaOfquadratic_curve1」内の「drawAreaOfInequation1.pde」ファイルの名前を「drawAreaOfquadratic_curve1.pde」に変更します。そして、pdeファイル「drawAreaOfquadratic_curve1.pde」をダブルクリックしてスケッチ「drawAreaOfquadratic_curve1」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawAreaOfquadratic_curve1」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。
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();
stroke(255,0,0,5);
// 刻み幅
float pitch = 0.01;
// plot数
int plot_num = (int)(2 * x_range / pitch);
float x, y; // 任意の点の座標
for(int i=0; i<=plot_num; i++){
for(int j=0; j<=plot_num; j++){
x = -x_range + i * pitch;
y = -y_range + j * pitch;
if( quadratic_curve1(x,y) > 0.0 ){
plot_point(x,y);
}
}
}
}
// 不等式に利用する2次曲線(楕円)を表す関数
float quadratic_curve1(
float x,
float y
){
return x*x/9.0 + y*y/4.0 - 1.0;
}
// 座標(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 問題(1)の不等式の表す領域を描くプログラム
ソースコード1は、元のスケッチ「drawAreaOfInequation1」の「drawAreaOfInequation1」タブのテキストエディタ部分に記載していたソースコードとほぼ同じで、不等式に利用する2次曲線(楕円)を表す関数 quadratic_curve1 に書き換えただけです。
ソースコード1を、スケッチ「drawAreaOfquadratic_curve1」の「drawAreaOfquadratic_curve1」タブのテキストエディタ部分に書いて実行すると、図1のように、実行ウィンドウのキャンバス上に問題(1)の不等式の表す領域が赤色の点群で描かれます。
問題(2)のプログラム
次に、問題(2)の不等式の表す領域を描くプログラムを作成します。先ほど作成したスケッチ「drawAreaOfquadratic_curve1」を再利用します。
スケッチ「drawAreaOfquadratic_curve1」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「drawAreaOfquadratic_curve2」と変更し、またスケッチ「drawAreaOfquadratic_curve2」内の「drawAreaOfquadratic_curve1.pde」ファイルの名前を「drawAreaOfquadratic_curve2.pde」に変更します。そして、pdeファイル「drawAreaOfquadratic_curve2.pde」をダブルクリックしてスケッチ「drawAreaOfquadratic_curve2」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawAreaOfquadratic_curve2」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。
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();
stroke(255,0,0,5);
// 刻み幅
float pitch = 0.01;
// plot数
int plot_num = (int)(2 * x_range / pitch);
float x, y; // 任意の点の座標
for(int i=0; i<=plot_num; i++){
for(int j=0; j<=plot_num; j++){
x = -x_range + i * pitch;
y = -y_range + j * pitch;
if( quadratic_curve1(x,y) <= 0.0 ){
plot_point(x,y);
}
}
}
}
// 不等式に利用する2次曲線(楕円)を表す関数
float quadratic_curve1(
float x,
float y
){
return x*x/9.0 + y*y/4.0 - 1.0;
}
// 座標(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);
}
ソースコード2 問題(2)の不等式の表す領域を描くプログラム
ソースコード1との違いは、問題(2)に合わせて点をプロットする条件を表す部分を
if( quadratic_curve1(x,y) <= 0.0 ){
plot_point(x,y);
}
に変更したことになります。
ソースコード2を、スケッチ「drawAreaOfquadratic_curve2」の「drawAreaOfquadratic_curve2」タブのテキストエディタ部分に書いて実行すると、図2のように、実行ウィンドウのキャンバス上に問題(2)の不等式の表す領域が赤色の点群で描かれます。
問題(3)のプログラム
問題(3)の不等式の表す領域を描くプログラムを作成します。こちらも先ほど作成したスケッチ「drawAreaOfquadratic_curve1」を再利用します。
スケッチ「drawAreaOfquadratic_curve1」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「drawAreaOfquadratic_curve3」と変更し、またスケッチ「drawAreaOfquadratic_curve3」内の「drawAreaOfquadratic_curve1.pde」ファイルの名前を「drawAreaOfquadratic_curve3.pde」に変更します。そして、pdeファイル「drawAreaOfquadratic_curve3.pde」をダブルクリックしてスケッチ「drawAreaOfquadratic_curve3」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawAreaOfquadratic_curve3」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。
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();
stroke(255,0,0,5);
// 刻み幅
float pitch = 0.01;
// plot数
int plot_num = (int)(2 * x_range / pitch);
float x, y; // 任意の点の座標
for(int i=0; i<=plot_num; i++){
for(int j=0; j<=plot_num; j++){
x = -x_range + i * pitch;
y = -y_range + j * pitch;
if( quadratic_curve2(x,y) > 0.0 ){
plot_point(x,y);
}
}
}
}
// 不等式に利用する2次曲線(双曲線)を表す関数
float quadratic_curve2(
float x,
float y
){
return x*x/9.0 - y*y/4.0 - 1.0;
}
// 座標(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);
}
ソースコード3 問題(3)の不等式の表す領域を描くプログラム
ソースコード1との違いは、問題(3)に合わせて不等式に利用する2次曲線(双曲線)を表す関数 quadratic_curve2 を新たに定義したことと、点をプロットする条件を表す部分を
if( quadratic_curve2(x,y) > 0.0 ){
plot_point(x,y);
}
に変更したことになります。
ソースコード3を、スケッチ「drawAreaOfquadratic_curve3」の「drawAreaOfquadratic_curve3」タブのテキストエディタ部分に書いて実行すると、図3のように、実行ウィンドウのキャンバス上に問題(3)の不等式の表す領域が赤色の点群で描かれます。
問題(4)のプログラム
最後に、問題(4)の不等式の表す領域を描くプログラムを作成します。先ほど作成したスケッチ「drawAreaOfquadratic_curve3」を再利用します。
スケッチ「drawAreaOfquadratic_curve3」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「drawAreaOfquadratic_curve4」と変更し、またスケッチ「drawAreaOfquadratic_curve4」内の「drawAreaOfquadratic_curve3.pde」ファイルの名前を「drawAreaOfquadratic_curve4.pde」に変更します。そして、pdeファイル「drawAreaOfquadratic_curve4.pde」をダブルクリックしてスケッチ「drawAreaOfquadratic_curve4」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawAreaOfquadratic_curve4」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。
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();
stroke(255,0,0,5);
// 刻み幅
float pitch = 0.01;
// plot数
int plot_num = (int)(2 * x_range / pitch);
float x, y; // 任意の点の座標
for(int i=0; i<=plot_num; i++){
for(int j=0; j<=plot_num; j++){
x = -x_range + i * pitch;
y = -y_range + j * pitch;
if( quadratic_curve2(x,y) <= 0.0 ){
plot_point(x,y);
}
}
}
}
// 不等式に利用する2次曲線(双曲線)を表す関数
float quadratic_curve2(
float x,
float y
){
return x*x/9.0 - y*y/4.0 - 1.0;
}
// 座標(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);
}
ソースコード4 問題(4)の不等式の表す領域を描くプログラム
ソースコード3との違いは、問題(4)に合わせて点をプロットする条件を表す部分を
if( quadratic_curve2(x,y) <= 0.0 ){
plot_point(x,y);
}
に変更したことになります。
ソースコード4を、スケッチ「drawAreaOfquadratic_curve4」の「drawAreaOfquadratic_curve4」タブのテキストエディタ部分に書いて実行すると、図4のように、実行ウィンドウのキャンバス上に問題(4)の不等式の表す領域が赤色の点群で描かれます。
まとめ
今回は、数学IIIで学ぶ「2次曲線と領域」について、与えられた2次曲線の不等式の条件を満たす点をプロットしていくことで不等式の表す領域を描いていくプログラムを作成しました。
不等式の表す領域を描く方法については、記事『高校数学をプログラミングで解く(数学II編)「2-6 不等式の表す領域」』で解説した方法を利用し、またそのとき作成したスケッチを再利用しました。そのため、領域の図示は比較的簡単にできたと思いますが、再度描く方法について見直しておいてください。
読んだ感想などをお寄せください
本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。感想、質問をいただいた方には本記事の演習問題の解答をプレゼントします。(お問合せフォームの本文に、本記事のタイトルを入れてください。)
参考文献
改訂版 教科書傍用 スタンダード 数学II(数研出版、ISBN9784410209369)
演習問題
実数$${x,y}$$が$${4x^2+9y^2 \leq 36}$$を満たすとき、$${2x+3y}$$の最大値$${M}$$、最小値$${m}$$を求めて、最大値をとる座標位置と直線$${2x+3y=M}$$を緑色、最小値をとる座標位置と直線$${2x+3y=m}$$を青色でキャンバス上に描くプログラムを作成してください。
演習問題の解答例
ここから先は
この記事が気に入ったらサポートをしてみませんか?