見出し画像

高校数学をプログラミングで解く(数学II編)「1-2 2次方程式の解と判別式」


はじめに

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

なお、今回は記事『高校数学をプログラミングで解く(数学I編)「1-5 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. 異なる2つの虚数解を持つ $${ \Longleftrightarrow  D < 0 }$$

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

この判別式の性質を利用して、まず2次方程式の解の個数を分類するプログラムを作成していきます。ここでは、例題(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 ){
    println("異なる2つの実数解をもつ");
  } else if( D == 0 ){
    println("ただ1つの実数解(重解)をもつ");
  } else {
    println("異なる2つの虚数解をもつ");
  }   
}

ソースコード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 例題(2)の結果
図3 例題(3)の結果

2次方程式と解の公式

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

解の公式

2次方程式$${ax^2+bx+c=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 {
    float x_r, x_i;
    x_r = -b/2.0/a;
    x_i = sqrt(-D)/2.0/a;
    print("異なる2つの虚数解をもつ: ");
    println(x_r + "+" + abs(x_i) + "i",x_r + "-" + abs(x_i) + "i"); 
  }   
}

ソースコード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)の解として「異なる2つの虚数解をもつ: 1.0+1.0i 1.0-1.0i」と表示されます。

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

なお、2つの異なる虚数解の計算では、2次方程式の解の公式において

$$
-\frac{b}{2a}+\frac{\sqrt{|D|}}{2a}i, -\frac{b}{2a}-\frac{\sqrt{|D|}}{2a}i
$$

となることを考慮して、実部$${-b/2a}$$と虚部$${\sqrt{|D|}/2a}$$とをそれぞれ計算してから表示する際に実部と虚部とを組合せて利用するようにしています。

まとめ

今回は、数学IIで学ぶ「2次方程式の解と判別式」について、判別式による2次方程式の解の個数を求めた後、その個数に応じて2次方程式の解を求めるプログラムを作成しました。
なお、今回は記事『高校数学をプログラミングで解く(数学I編)「1-5 2次方程式」』で紹介した実数解までの2次方程式の解法を虚数解へ拡張したものになります。判別式が$${D<0}$$に相当する部分以外は全く同じものになっています。
また、虚数解は実部と虚部とを別々に計算しましたが、記事『高校数学をプログラミングで解く(数学II編)「1-1 複素数」』で紹介したように、複素数をPVectorクラスで代用し、複素数の四則演算を行う関数を利用して計算することもできます。是非一度プログラムを作成してみてください。

参考文献

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

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