見出し画像

高校数学10分プログラミング(数学Ⅰ編)13日目「2次関数のグラフと2次方程式の実数解の関係」

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

おはようございます。

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

本日の課題は、2次関数のグラフの$${x}$$軸との共有点と2次方程式の実数解との関係を確かめるプログラムを作成することです。

2次関数のグラフの$${x}$$軸との共有点と2次方程式の実数解との関係
2次関数$${y=ax^2+bx+c}$$のグラフと$${x}$$軸に共有点があるとき、その共有点の$${x}$$座標は、2次方程式$${ax^2+bx+c=0}$$の実数解である。


課題

2次関数$${y=ax^2+bx+c}$$のグラフを描き、一方で2次方程式$${ax^2+bx+c=0}$$の実数解を求めて$${x}$$軸上にプロットするプログラムを作成してください。そして、以下の2次方程式について実際に共有点と実数解の関係が成り立っているかを確認してください。

(1) $${x^2-2x = 0 \ ( \ \Rightarrow \ a=1, b=-2, c=0 \ )}$$ 
(2) $${x^2-2x+1 = 0 \ ( \ \Rightarrow \ a=1, b=-2, c=1 \ )}$$
(3) $${x^2-2x+2 = 0 \ ( \ \Rightarrow \ a=1, b=-2, c=2 \ )}$$


ヒント

まず、2次方程式$${ax^2+bx+c=0}$$の実数解については、前回の課題『高校数学10分プログラミング(数学Ⅰ編 1.2次関数)12日目「2次方程式の実数解を求める」』で作成したプログラムを利用できます(ソースコード1)。

// 2次方程式の実数解を求める
void setup(){

  // 2次方程式ax^2+bx+c=0の係数
  float a = 1.0;
  float b = -2.0;
  float c = 0.0;  
  
  // 判別式
  float D = b*b-4.0*a*c;
  
  // 2次方程式の解の個数を求め、その解も求める
  if( D > 0 ){
    float x1, x2;
    x1 = (-b + sqrt(D))/2.0/a;
    x2 = (-b - sqrt(D))/2.0/a;
    print("異なる2つの実数解をもつ: ");
    println(x1, x2);
  } else if( D == 0 ){
    float x1;
    x1 = -b/2.0/a;
    print("ただ1つの実数解(重解)をもつ: ");
    println(x1);
  } else {
    println("実数解を持たない");
  }   
}

ソースコード1 2次方程式の実数解を求めるプログラム(再掲)

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

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

// 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次関数(一般形)のグラフを描くプログラム(再掲)

このソースコード2にソースコード1を追加し、コンソールに出力していた実数解をキャンバス上の$${x}$$軸上にプロットするように修正してください。なお、実数解を$${x}$$軸上にプロットする際には、キャンバス上の座標位置に換算することを忘れないようにしてください。


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

MK's papa

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