見出し画像

高校数学10分プログラミング(数学Ⅰ編 1.2次関数)10日目「2次関数の最大値と最小値をグラフ表示する」

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

おはようございます。

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

本日の課題は、2次関数の最大値と最小値をグラフ表示するプログラムを作成することです。


課題

次の関数の最大値と最小値を計算した上で、指定の定義域で2次関数のグラフを描き、そのグラフ上に最大値と最小値をプロットするプログラムを作成してください。

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


ヒント

今回の課題の2次関数の最大値と最小値を計算するプログラムは、課題『高校数学10分プログラミング(数学Ⅰ編 1.2次関数)8日目「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次関数の最大値と最小値を計算するプログラム(再掲)

また、2次関数のグラフは課題『高校数学10分プログラミング(数学Ⅰ編)3日目「2次関数(一般形)のグラフを描く」』で作成した2次関数(一般形)のグラフを描くプログラム(スケッチ)「drawQuadraticFunctionStandardForm」をベースに作成します。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「drawQuadraticFunction_with_max_min」の中のpdeファイル「drawQuadraticFunction_with_max_min.pde」をダブルクリックしてスケッチ「drawQuadraticFunction_with_max_min」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawQuadraticFunction_with_max_min」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。

// 2次関数の一般形y=ax^2+bx+cのグラフを描く
void setup(){
  size(500,500);
  noLoop();
  float x_range = 10.0; // x軸の表示範囲 -x_rangeからx_rangeまで
  float y_range = 10.0; // y軸の表示範囲 -y_rangeからy_rangeまで 
  setAxes(x_range, y_range); // 座標軸の準備
  
  noFill();
  stroke(0,0,0);
  
  // グラフの定義域
  float x_l = -x_range; // 定義域の左端
  float x_r = x_range; // 定義域の右端
  int plot_num = 200; // グラフを描くための頂点の個数  
  
  // 2次関数の係数
  float a = 1.0;
  float b = -4.0;
  float c = 6.0;
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標
  beginShape();
  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); // 関数の値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();
  
}

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

ソースコード2 2次関数(一般形)のグラフを描くプログラム(再掲)

ソースコード1の最大値と最小値を計算するプログラムを参考にして、ソースコード2を2次関数のグラフ上に最大値と最小値をプロットするプログラムに書き換えていってください。


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

MK's papa

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