求二次方程的根的 Java 程序
一、概述
在本文中,我們將了解如何在 Java 中計算二次方程的解。我們將從定義什麼是二次方程開始,然後我們將計算它的解,無論我們是在實數係統還是複數係統中工作。
2. 二次方程的解
給定實數 a ≠ 0、b 和 c,讓我們考慮以下二次方程: ax² + bx + c = 0
。
2.1。多項式的根
該方程的解也稱為多項式ax² + bx + c
的根。因此,讓我們定義一個Polynom
類。如果a
係數等於 0,我們將拋出IllegalArgumentException
:
public class Polynom {
private double a;
private double b;
private double c;
public Polynom(double a, double b, double c) {
if (a==0) {
throw new IllegalArgumentException("a can not be equal to 0");
}
this.a = a;
this.b = b;
this.c = c;
}
// getters and setters
}
我們將在實數係統中求解這個方程:為此,我們將尋找一些Double
解。
2.2.複數系統
我們還將展示如何在復數係統中求解這個方程。 Java 中沒有復數的默認表示,因此我們將創建自己的。讓我們給它一個ofReal
的static
方法來輕鬆轉換實數。這將有助於以下步驟:
public class Complex {
private double realPart;
private double imaginaryPart;
public Complex(double realPart, double imaginaryPart) {
this.realPart = realPart;
this.imaginaryPart = imaginaryPart;
}
public static Complex ofReal(double realPart) {
return new Complex(realPart, 0);
}
// getters and setters
}
3. 計算判別式
量 Δ = b² – 4ac 稱為二次方程的判別式。在java中計算b的平方,我們有兩種解決方案:
- 將 b 自身相乘
- 使用
Math.pow
將其提高到 2 的冪
讓我們堅持第一種方法,在Polynom
類中添加一個getDiscriminant
方法:
public double getDiscriminant() {
return b*b - 4*a*c;
}
4. 獲得解決方案
根據判別式的值,我們能夠知道存在多少解決方案併計算它們。
4.1。具有嚴格正判別式
如果判別式嚴格為正,則方程有兩個實解,(-b – √Δ) / 2a 和 (-b + √Δ) / 2a:
Double solution1 = (-polynom.getB() - Math.sqrt(polynom.getDiscriminant())) / (2 * polynom.getA());
Double solution2 = (-polynom.getB() + Math.sqrt(polynom.getDiscriminant())) / (2 * polynom.getA());
如果我們在復數係統中工作,那麼我們只需要進行轉換:
Complex solution1 = Complex.ofReal((-polynom.getB() - Math.sqrt(polynom.getDiscriminant())) / (2 * polynom.getA()));
Complex solution2 = Complex.ofReal((-polynom.getB() + Math.sqrt(polynom.getDiscriminant())) / (2 * polynom.getA()));
4.2.判別式為零
如果判別式等於 0,則方程有唯一的實解 -b / 2a:
Double solution = (double) -polynom.getB() / (2 * polynom.getA());
同樣,如果我們在復數係統中工作,我們將通過以下方式轉換解決方案:
Complex solution = Complex.ofReal(-polynom.getB() / (2 * polynom.getA()));
4.3.具有嚴格的負判別式
如果判別式嚴格為負,則方程在實數係統中無解。但是,它可以在復數係統中求解:解為 (-b – i√Δ) / 2a 及其共軛 (-b + i√Δ) / 2a:
Complex solution1 = new Complex(-polynom.getB() / (2* polynom.getA()), -Math.sqrt(-polynom.getDiscriminant()) / 2* polynom.getA());
Complex solution2 = new Complex(-polynom.getB() / (2* polynom.getA()), Math.sqrt(-polynom.getDiscriminant()) / 2* polynom.getA());
4.4.收集結果
總而言之,讓我們構建一個方法,當方程的解存在時,它將用方程的解填充List
。在實數係統中,此方法如下所示:
public static List<Double> getPolynomRoots(Polynom polynom) {
List<Double> roots = new ArrayList<>();
double discriminant = polynom.getDiscriminant();
if (discriminant > 0) {
roots.add((-polynom.getB() - Math.sqrt(discriminant)) / (2 * polynom.getA()));
roots.add((-polynom.getB() + Math.sqrt(discriminant)) / (2 * polynom.getA()));
} else if (discriminant == 0) {
roots.add(-polynom.getB() / (2 * polynom.getA()));
}
return roots;
}
如果我們在復數係統中工作,我們寧願這樣寫:
public static List<Complex> getPolynomRoots(Polynom polynom) {
List<Complex> roots = new ArrayList<>();
double discriminant = polynom.getDiscriminant();
if (discriminant > 0) {
roots.add(Complex.ofReal((-polynom.getB() - Math.sqrt(discriminant)) / (2 * polynom.getA())));
roots.add(Complex.ofReal((-polynom.getB() + Math.sqrt(discriminant)) / (2 * polynom.getA())));
} else if (discriminant == 0) {
roots.add(Complex.ofReal(-polynom.getB() / (2 * polynom.getA())));
} else {
roots.add(new Complex(-polynom.getB() / (2* polynom.getA()), -Math.sqrt(-discriminant) / 2* polynom.getA()));
roots.add(new Complex(-polynom.getB() / (2* polynom.getA()), Math.sqrt(-discriminant) / 2* polynom.getA()));
}
return roots;
}
5. 結論
在本教程中,我們了解瞭如何在 Java 中求解二次方程,無論我們使用實數還是複數。
與往常一樣,可以 在 GitHub 上找到代碼。