1. 개요
이 기사에서는 Java에서 이차 방정식의 해를 계산하는 방법을 살펴봅니다. 우리는 이차 방정식이 무엇인지 정의하는 것으로 시작하고, 실수 또는 복소수 시스템에서 작업하는지 여부에 관계없이 해를 계산할 것입니다.
2. 이차방정식의 해
실수 a ≠ 0, b 및 c가 주어지면 다음 이차 방정식을 고려해 보겠습니다. ax² + bx + c = 0 .
2.1. 다항식의 근
이 방정식의 해는 다항식 ax² + bx + c 의 근이라고도 합니다 . 따라서 Polynom 클래스를 정의해 보겠습니다. 계수 가 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에는 복소수에 대한 기본 표현이 없으므로 직접 만들겠습니다. 실수를 쉽게 변환하기 위해 Real 의 정적 메서드 를 제공하겠습니다 . 이는 다음 단계에서 도움이 됩니다.
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인 경우
판별식이 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 에서 찾을 수 있습니다 .