見出し画像

高校数学10分プログラミング(数学Ⅰ編 1.2次関数)9日目「開いた定義域での最大値と最小値を計算する」

マガジンリスト > 数学Ⅰ編 1.2次関数 > 9日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学I編 1.2次関数)の9日目です。

本日の課題は、開いた定義域で2次関数の最大値と最小値を計算するプログラムを作成することです。

開いた定義域

開いた定義域とは、定義域の両端または一方の端が定義域に含まれていないときにそのように言います。例えば、定義域$${-1 < x < 1}$$は両端の$${x=-1}$$と$${x=1}$$とが定義域に含まれていないので、開いた定義域と言えます。また、定義域$${-1 < x \leq 1}$$や定義域$${-1 \leq x < 1}$$も、一方の端が定義域に含まれていないので、開いた定義域と言います。


課題

次の関数の最大値と最小値を計算し、開発環境ウィンドウのコンソールに出力するプログラムを作成してください。

$$
y=x^2 \ (-2 < x < 3)
$$


ヒント

開いた定義域の場合も、2次関数の最大値と最小値を計算するための手順は課題『高校数学10分プログラミング(数学Ⅰ編 1.2次関数)8日目「2次関数の最大値、最小値を計算する」』で解説した、閉じた定義域でのアルゴリズムとほぼ同じものになります。違いは、開いた定義域の場合、算出された最大値や最小値の候補が定義域に入っているかを確認する必要があるということです。つまり、手順は以下のようになります。

① まず、開いた定義域ではなく、閉じた定義域$${x_l \leq x \leq x_r}$$で最大値と最小値の候補を求める。
② その後、最大値を取るときの$${x}$$の値$${x_{\mathrm{max}}}$$と最小値を取るときの$${x}$$の値$${x_{\mathrm{min}}}$$とが、開いた定義域$${x_l < x < x_r}$$に入っているかを確認し、入っていれば最大値や最小値の候補はそのまま最大値や最小値となり、入っていなければ最大値や最小値の候補は最大値や最小値ではない、とみなします。


開いた定義域での2次関数の最大値と最小値を計算するプログラム

以下のソースコード1は、2次関数の最大値と最小値を計算するプログラムは、課題『高校数学10分プログラミング(数学Ⅰ編 1.2次関数)8日目「2次関数の最大値、最小値を計算する」』で作成した、閉じた定義域での2次関数の最大値と最小値を計算するプログラムになります。

// 2次関数の最大値と最小値を計算する
void setup(){

  // 2次関数の係数
  float a = 1.0;
  float b = 0.0;
  float c = 0.0;  

  // 定義域
  float x_l = -2.0; // 定義域の左端
  float x_r = 3.0; // 定義域の右端
  int plot_num = 200; // 定義域を分割するための個数  
  
  float x, y; // 関数の座標
  float y_max = MIN_FLOAT; // 最大値 float型の最大値で初期化
  float x_max = 0.0; // 関数が最大値を取るときのxの値  
  float y_min = MAX_FLOAT; // 最小値 float型の最大値で初期化
  float x_min = 0.0; // 関数が最小値を取るときのxの値   

  // 2次関数の最大値と最小値を計算する処理
  for(int i=0; i<=plot_num; i++){
    x = x_l + (x_r - x_l) / plot_num * i; // 関数のx座標
    y = quadraticfunction(a,b,c,x); // 関数の値
    // 最大値を求める    
    if( y_max < y ){
      y_max = y;
      x_max = x;
    }
    // 最小値を求める
    if( y_min > y ){
      y_min = y;
      x_min = x;
    }    
  }
  
  // 2次関数の最大値と最小値をコンソールに出力する
  println("最大値 ", x_max, y_max);
  println("最小値 ", x_min, y_min);

}

// 2次関数の一般形
float quadraticfunction(
  float a, // 2次の係数
  float b, // 1次の係数
  float c, // 定数項
  float x
){
  return a*x*x + b*x + c;
}

ソースコード1 閉じた定義域での2次関数の最大値と最小値を計算するプログラム

このソースコード1の

  // 2次関数の最大値と最小値をコンソールに出力する
  println("最大値 ", x_max, y_max);
  println("最小値 ", x_min, y_min);

の部分を上記手順②の処理を参考に、最大値や最小値があればその値を、なければ「最大値なし」「最小値なし」とコンソールに出力するように書き換えて、開いた定義域での2次関数の最大値と最小値を計算するプログラムを作成してください。

その後、スケッチ名を「max_min_QuadraticFunction_OpenDomain」として開発環境ウィンドウを立ち上げて、実行してみてください。


それでは、よろしくお願いします。

MK's papa

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