見出し画像

高校数学をプログラミングで解く(数学I編)「1-5 2次方程式」

マガジンリスト > 数学Ⅰ編 1.2次関数 > 1-5 2次方程式


はじめに

今回は、数学Iで学ぶ「2次方程式」について、判別式による2次方程式の実数解の個数を求めた後、その個数に応じて2次方程式の実数解を求めるプログラムを作成していきます。

2次方程式

今回は、2次方程式

$$
a x^2 + bx + c = 0 \ (a \neq 0)
$$

について考えていきます。

例題
次の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}$$の解の個数を求めるために、判別式$${D=b^2-4ac}$$を利用します。判別式を利用すると、2次方程式の解の個数は次のように分類できます。
1. 異なる2つの実数解を持つ $${ \Longleftrightarrow  D > 0 }$$
2. ただ1つの実数解(重解)をもつ $${ \Longleftrightarrow  D = 0 }$$
3. 実数解をもたない $${ \Longleftrightarrow  D < 0 }$$

判別式による2次方程式の解の個数の分類

この判別式の性質を利用して、まず2次方程式の解の個数を分類するプログラムを作成していきます。ここでは、例題(1)の2次方程式の解の個数を求めるようにしています。

// 2次方程式の解の個数を判別式で分類する
void setup(){

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

ソースコード1 判別式による2次方程式の解の個数を求めるプログラム

このソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「discriminantQuadraticEquation」としています)、テキストエディタ部分に書いて実行すると、$${D=4}$$となるので、図1のように、コンソールに例題(1)の解の個数の算出結果として「異なる2つの実数解をもつ」と表示されます。

図1 例題(1)の結果

また、ソースコード1の2次方程式の係数の部分を例題(2)に合わせて、$${a=1, b=-2, c=1}$$として実行すると、$${D=0}$$となるので、図2のように、コンソールに例題(2)の解の個数の算出結果として「ただ1つの実数解(重解)をもつ」と表示され、例題(3)に合わせて、$${a=1, b=-2, c=2}$$として実行すると、$${D=-4}$$となるので、図3のように、コンソールに例題(3)の解の個数の算出結果として「実数解を持たない」と表示されます。

図2 例題(2)の結果
図3 例題(3)の結果

2次方程式と解の公式

次は、2次方程式の解を求めるプログラムを作成していきます。今回は2次方程式の解を求めるために解の公式を利用します。

解の公式

2次方程式$${ax^2+bx+c=0}$$の解は、$${D=b^2-4ac \geq 0}$$ならば、

$$
x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}
$$

で求めることができる。

2次方程式の解を求めるプログラム

それでは、2次方程式の解を求めるプログラムを作成していきます。ソースコード1に、解の公式を用いて実数解を求めてそれをコンソールに出力するプログラムを追記していきます。また、最初は、例題(1)の2次方程式の解を求めるようにしています。

// 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("実数解を持たない");
  }   
}

ソースコード2 解の公式による2次方程式の解を求めるプログラム

このソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「solveQuadraticEquation」としています)、テキストエディタ部分に書いて実行すると、図4のように、コンソールに例題(1)の解として「異なる2つの実数解をもつ: 2.0 0.0」と表示されます。

図4 例題(1)の解

また、ソースコード2の2次方程式の係数の部分を例題(2)に合わせて、$${a=1, b=-2, c=1}$$として実行すると、図5のように、コンソールに例題(2)の解として「ただ1つの実数解(重解)をもつ: 1.0」と表示され、例題(3)に合わせて、$${a=1, b=-2, c=2}$$として実行すると、図6のように、コンソールに例題(3)の解(実数解はなし)として「実数解を持たない」と表示されます。

図5 例題(2)の解
図6 例題(3)の解

まとめ

今回は、数学Iで学ぶ「2次方程式」について、判別式による2次方程式の実数解の個数を求めた後、その個数に応じて2次方程式の実数解を求めるプログラムを作成しました。
今回、2次方程式の実数解を求めるプログラムの作成において、多少工夫したことは、解の公式のルートの中身がちょうど判別式と同じになっていますので、実数解を求める際に、

   x1 = (-b + sqrt(b*b-4.0*a*c))/2.0/a;

とはせず、判別式の値を利用して

   x1 = (-b + sqrt(D))/2.0/a;

としたことです。
プログラミングでは同じ計算を何度もさせることはできるだけ避けます。このようにすることで間違いを減らすことができますので、ぜひ心掛けておいてください。

参考文献

改訂版 教科書傍用 スタンダード 数学I(数研出版、ISBN9784410209178)

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