Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで二次方程式のすべての解を求める方法【実数・複素数対応】

本記事では、Javaを使って二次方程式のすべての解(根)を計算する方法をわかりやすく解説します。二次方程式とは2次の代数式のことで、その解は実数になる場合もあれば、虚数(複素数)になる場合もあります。どちらになるかは「判別式」と呼ばれる値によって決まります。

二次方程式の解と判別式

一般形が ax² + bx + c = 0 で表される二次方程式を考えます。このとき、判別式 D = b² − 4ac の符号によって、解の性質は次の3つの場合に分類されます。

b² < 4ac … 解は実数ではなく複素数(虚数)になる
b² = 4ac … 解は実数で、2つの解は等しい(重解)
b² > 4ac … 解は実数で、2つの解は互いに異なる

入力例

a = 1, b = 2, c = 3

出力例

二次方程式の解は以下の通りです
root_1 = -1.00+1.41i
root_2 = -1.00-1.41i

アルゴリズム

  1. 処理を開始する
  2. double型の変数 a、b、c、root_1、root_2、quadratic_equation を宣言する
  3. ユーザーに a、b、c の入力を促す(またはあらかじめ値を定義しておく)
  4. 入力された値を読み込む
  5. quadratic_equation(判別式)の値が0より大きいかどうかを判定し、当てはまる場合は解の公式を使って解を求めて変数に代入する
  6. 結果を表示する
  7. 処理を終了する

例1:Scannerでユーザー入力を受け取る場合

この例では、java.util.Scannerクラスを使って、ユーザーがコンソールから入力した係数 a、b、c をもとに解を求めます。任意の値をキーボードから入力して動作を確認できます。

import java.util.Scanner;
public class QuadraticEquation {
   public static void main(String[] args) {
      double a, b, c, root_1, root_2, quadratic_equation;
      double real_number, imaginary_number;
      System.out.println("必要なパッケージがインポートされました");
      Scanner my_scanner = new Scanner(System.in);
      System.out.println("Scannerオブジェクトが定義されました");
      System.out.print("aの値を入力してください : ");
      a = my_scanner.nextDouble();
      System.out.print("bの値を入力してください : ");
      b = my_scanner.nextDouble();
      System.out.print("cの値を入力してください : ");
      c = my_scanner.nextDouble();
      quadratic_equation = b*b - 4*a*c ;
      if (quadratic_equation > 0) {
         root_1 = (-b + Math.sqrt(quadratic_equation)) / (2 * a);
         root_2 = (-b - Math.sqrt(quadratic_equation)) / (2 * a);
         System.out.format("root_1 = %.2f と root_2 = %.2f", root_1, root_2);
      }
      else if (quadratic_equation == 0) {
         root_1 = root_2 = -b / (2 * a);
         System.out.format("root_1 = root_2 = %.2f;", root_1);
      }
      else {
         real_number = -b / (2 * a);
         imaginary_number = Math.sqrt(-quadratic_equation) / (2 * a);
         System.out.println("二次方程式の解は以下の通りです");
         System.out.printf("root_1 = %.2f+%.2fi", real_number, imaginary_number);
         System.out.printf("\nroot_2 = %.2f-%.2fi", real_number, imaginary_number);
      }
   }
}

実行結果

必要なパッケージがインポートされました
Scannerオブジェクトが定義されました
aの値を入力してください : 1
bの値を入力してください : 2
cの値を入力してください : 3
二次方程式の解は以下の通りです
root_1 = -1.00+1.41i
root_2 = -1.00-1.41i

例2:係数をあらかじめ定義しておく場合

こちらの例では、係数 a、b、c の値をプログラム内で直接定義し、その値を使って解を計算してコンソールに表示します。入力処理が不要なため、動作確認を手軽に行えます。

public class QuadraticEquation {
   public static void main(String[] args) {
      double a, b, c, root_1, root_2, quadratic_equation;
      double real_number, imaginary_number;
      a = 1;
      b = 2;
      c = 3;
      System.out.println("3つの数値は " + a + ", " + b + ", " + c + " と定義されています");
      quadratic_equation = b*b - 4*a*c ;
      if (quadratic_equation > 0) {
         root_1 = (-b + Math.sqrt(quadratic_equation)) / (2 * a);
         root_2 = (-b - Math.sqrt(quadratic_equation)) / (2 * a);
         System.out.format("root_1 = %.2f と root_2 = %.2f", root_1, root_2);
      }
      else if (quadratic_equation == 0) {
         root_1 = root_2 = -b / (2 * a);
         System.out.format("root_1 = root_2 = %.2f;", root_1);
      }
      else {
         real_number = -b / (2 * a);
         imaginary_number = Math.sqrt(-quadratic_equation) / (2 * a);
         System.out.println("二次方程式の解は以下の通りです");
         System.out.printf("root_1 = %.2f+%.2fi", real_number, imaginary_number);
         System.out.printf("\nroot_2 = %.2f-%.2fi", real_number, imaginary_number);
      }
   }
}

実行結果

3つの数値は 1.0, 2.0, 3.0 と定義されています
二次方程式の解は以下の通りです
root_1 = -1.00+1.41i
root_2 = -1.00-1.41i

ポイント解説

  • Math.sqrt():平方根を求めるためのMathクラスのメソッドです。判別式が負の場合は、符号を反転させてから平方根を取ることで虚数部を計算しています。
  • %.2f:小数点以下2桁まで表示する書式指定子です。System.out.format() や System.out.printf() で使用しています。
  • 複素数の表示:解を実部と虚数部に分けて計算し、「実部±虚数部i」の形式で出力することで、複素数の解を見やすく表現しています。

まとめ

Javaでは、判別式 b² − 4ac の値で場合分けを行うことで、二次方程式の解が「異なる2つの実数」「重解」「複素数」のいずれになるかを正確に判定できます。Math.sqrt() メソッドと書式指定子 %.2f を組み合わせれば、実数・複素数どちらの解も読みやすい形式で出力可能です。ぜひ実際にコードを実行して、さまざまな係数の組み合わせで挙動を確かめてみてください。

  1. 正方形の面積を求めるJavaプログラムの書き方【初心者向け解説】

    この記事では、Javaを使って正方形の面積を求める方法をわかりやすく解説します。正方形の面積は、次の公式で計算できます。辺 × 辺つまり s2正方形の面積の計算式正方形の1辺の長さを s とすると、その面積は s2(辺の2乗)で表されます。下図のように、縦と横が同じ長さの図形であるため、辺同士を掛け合わせるだけで面積が求まります。入力例1辺の長さ : 4出力例正方形の面積 : 16アルゴリズム処理の流れは以下の手順になります。Step 1 - 開始Step 2 - 整数型の変数 my_side(辺の長さ)と my_area(面積)を宣言するStep 3 - ユーザーから値を読み込む、または値を

  2. 【Java入門】長方形の周囲(外周)を求めるプログラムの作り方

    長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま