見出し画像

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

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

本日の課題、おつかれさまでした。

2次関数の最大値と最小値をグラフ表示するプログラムを作成することができたでしょうか。

解答例

2次関数の最大値と最小値をグラフ表示するプログラムは以下のソースコード3のようになります。

// 2次関数の最大値と最小値をグラフ表示するプログラム
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 = -2.0; // 定義域の左端
  float x_r = 3.0; // 定義域の右端
  int plot_num = 200; // グラフを描くための頂点の個数  
  
  // 2次関数の係数
  float a = 1.0;
  float b = 0.0;
  float c = 0.0;
  
    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;
    }    
  }
    
  // グラフを描画
//  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();
  
  // 最大値を取るグラフ上の点をキャンバス上の座標位置に換算してプロット
  stroke(255,0,0);
  strokeWeight(5);
  float X_max, Y_max;
  X_max = width / 2.0 / x_range * x_max;
  Y_max = height / 2.0 / y_range * y_max;
  point(X_max, Y_max);

  // 最小値を取るグラフ上の点をキャンバス上の座標位置に換算してプロット
  stroke(0,255,0);
  float X_min, Y_min;
  X_min = width / 2.0 / x_range * x_min;
  Y_min = height / 2.0 / y_range * y_min;
  point(X_min, Y_min);
  
}

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

ソースコード3 2次関数の最大値と最小値をグラフ表示するプログラム

スケッチ「drawQuadraticFunction_with_max_min」の開発環境ウィンドウを立ち上げ、そのタブ欄で「drawQuadraticFunction_with_max_min」タブを選択し、そのテキストエリアをソースコード3で書き換えます(図1)。

図1 スケッチ「drawQuadraticFunction_with_max_min」の準備

実行ボタン(左上の ▶ ボタン)を押すと、実行ウィンドウのキャンバス上に定義域が$${-2 \leq x \leq 3}$$の範囲内の2次関数とともに、その最大値(赤色)と最小値(青色)がそれぞれプロットされたグラフが描かれます(図2)。

図2 最大値(赤色)と最小値(青色)がそれぞれプロットされたグラフ


プログラムの解説

ソースコード1、ソースコード2とソースコード3と見比べてみてください。

まず、今回の課題では、対象の2次関数が$${y=x^2}$$となっていますので、ソースコード2の

  // 2次関数の係数
  float a = 1.0;
  float b = -4.0;
  float c = 6.0;

ではなく、ソースコード1の

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

を利用します。また、定義域が$${-2 \leq x \leq 3}$$となっていますので、ソースコード2の

  // グラフの定義域
  float x_l = -x_range; // 定義域の左端
  float x_r = x_range; // 定義域の右端
  int plot_num = 200; // グラフを描くための頂点の個数  

の部分は、ソースコード1の

  // 定義域
  float x_l = -2.0; // 定義域の左端
  float x_r = 3.0; // 定義域の右端
  int plot_num = 200; // 定義域を分割するための個数  

で置き換えています。その上で、ソースコード2にソースコード1の最大値と最小値を計算する部分

  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にはもともと

  float x, y; // 関数の座標

が定義されていますので、そのままだと重複した定義となり、エラーとなります。ですので、ソースコード2の方は、削除するか、コメントアウトするかのどちらかを行います。

あとは、最大値と最小値をグラフ上にプロットするコードを追記しています。

  // 最大値を取るグラフ上の点をキャンバス上の座標位置に換算してプロット
  stroke(255,0,0);
  strokeWeight(5);
  float X_max, Y_max;
  X_max = width / 2.0 / x_range * x_max;
  Y_max = height / 2.0 / y_range * y_max;
  point(X_max, Y_max);

  // 最小値を取るグラフ上の点をキャンバス上の座標位置に換算してプロット
  stroke(0,255,0);
  float X_min, Y_min;
  X_min = width / 2.0 / x_range * x_min;
  Y_min = height / 2.0 / y_range * y_min;
  point(X_min, Y_min);

・最大値を赤色で、最小値を青色でそれぞれプロットしていること
・点の大きさは、strokeWeight 関数を利用して直径 5 pixel にしていること
・キャンバス上の座標位置に換算してプロットしていること
などをチェックしておいてください。


本日は以上です。
明日は、2次方程式を解くプログラムを考えていきます。

明日もよろしくお願いします。

※今回の課題とその解答例について質問や疑問がある方は、本記事の下部にあるコメント欄からお願いします。

MK’s papa

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