見出し画像

高校数学10分プログラミング(数学Ⅰ編 1.2次関数)14日目「2次関数のグラフと2次不等式」解説

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

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

2次関数のグラフを描くプログラムを作成することができたでしょうか。

解答例

今回の課題であった図1の2次関数のグラフを描くプログラムは、ソースコード2のようになります。

// 2次不等式を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 = -x_range; // 定義域の左端
  float x_r = x_range; // 定義域の右端
  int plot_num = 200; // グラフを描くための頂点の個数  
  
  // 2次関数の係数
  float a = 1.0;
  float b = -2.0;
  float c = 0.0;
  
  // 2次方程式の解を求める
  float x1, x2;
  x1 = (-b - sqrt(b*b-4.0*a*c))/2.0/a;
  x2 = (-b + sqrt(b*b-4.0*a*c))/2.0/a;
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標

  // f(x)>0の領域は赤色で描く
  stroke(255,0,0);
  // 定義域 x_l < x < x1 のグラフを描く
  beginShape();
  for(int i=0; i<=plot_num; i++){
    x = x_l + (x1 - 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();
  
  // 定義域 x2 < x < x_r のグラフを描く
  beginShape();
  for(int i=0; i<=plot_num; i++){
    x = x2 + (x_r - x2) / 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();
  
  // f(x)<0の領域は青色で描く
  stroke(0,0,255);
  // 定義域 x1 < x < x2 のグラフを描く
  beginShape();
  for(int i=0; i<=plot_num; i++){
    x = x1 + (x2 - x1) / 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();
  
  // f(x)=0の点は緑色で描く
  stroke(0,255,0);
  strokeWeight(5);
  // キャンバス上の座標位置に換算
  float X1, X2;
  X1 = width / 2.0 / x_range * x1;
  X2 = width / 2.0 / x_range * x2;
  point(X1, 0.0);
  point(X2, 0.0);
  
//  save("2次関数のグラフ.jpg");
}

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

ソースコード2 2次関数のグラフを描くプログラム(完成版)

プログラムの解説

ソースコード2とスケッチ「drawQuadraticFunctionwithCommonPoint」のソースコードとを比較してみてください。

たとえば、ソースコード2の

  // 定義域 x_l < x < x1 のグラフを描く
  beginShape();
  for(int i=0; i<=plot_num; i++){
    x = x_l + (x1 - 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();

の部分は、スケッチ「drawQuadraticFunctionwithCommonPoint」のソースコードの

  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を実行してみましょう。スケッチ「solveQuadraticInequality」の開発環境ウィンドウを立ち上げ、「solveQuadraticInequality」タブのテキストエディタ部分をソースコード2で書き換えて実行してみます。その結果、図1と同じグラフが描かれます(図2)。

図2 図1と同じグラフが描かれる


なお、2次関数のグラフと2次不等式については、記事『高校数学をプログラミングで解く(数学I編)「1-7 グラフと2次不等式」』でより詳しく扱っていますので、そちらも一度読んでおいてください。


本日は以上です。
明日は、絶対値を含む関数のグラフを描くことについて考えていきたいと思います。

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

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

MK’s papa

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