1. 概述

二次方程是单变量的二阶多项式方程,标准形式为:

ax² + bx + c = 0

这类方程在金融建模、计算机图形学、学术研究等领域都有广泛应用。掌握求解二次方程的根,是数学建模和工程问题中的一项基础技能。

本文将通过 Kotlin 实现多种求解二次方程根的方法,涵盖实数根与复数根的处理。


2. 算法原理

我们以 a、b、c 表示二次项、一次项和常数项的系数:

a*x² + b*x + c = 0

首先计算判别式 D:

D = b² - 4ac

判别式的值决定了方程根的性质:

  • D > 0:两个不同的实数根
  • D = 0:一个重根(两个相等的实数根)
  • D < 0:两个共轭复数根

根的通用公式为:

root1 = (-b + √D) / (2a)
root2 = (-b - √D) / (2a)

注意:a ≠ 0 是二次方程的前提条件,因此可以安全地用 2a 做除法。


3. 实数根的求解

本节聚焦于实数根的实现,适用于 D ≥ 0 的情况。

3.1. 定义 QuadraticEquationSolver

我们先定义一个类,用于封装方程的系数 a、b、c:

class QuadraticEquationSolver(val a: Double, val b: Double, val c: Double) {
    // 实现求根方法
}

3.2. 实现 solveForRealRoots() 方法

该方法返回 Pair<Double, Double>?,表示两个实数根,若无实数根则返回 null:

fun solveForRealRoots(): Pair<Double, Double>? {
    val discriminant = b * b - 4 * a * c
    if (discriminant < 0) return null // 无实数根
    
    val root1 = (-b + Math.sqrt(discriminant)) / (2 * a)
    val root2 = (-b - Math.sqrt(discriminant)) / (2 * a)
    return Pair(root1, root2)
}

3.3. 示例测试

测试方程:x² + 2x + 1 = 0,预期根为 (-1.0, -1.0)

val solver = QuadraticEquationSolver(1.0, 2.0, 1.0)
val expected = Pair(-1.0, -1.0)
val actual = solver.solveForRealRoots()
assertEquals(expected, actual)

✅ 测试通过,说明方法实现正确。


4. 复数根的求解

当 D < 0 时,我们需要处理复数根。为此,我们可以借助 Apache Commons Math 提供的 Complex 类。

4.1. 添加依赖

pom.xml 中添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

4.2. 实现 solveForComplexRoots() 方法

返回 Pair<Complex, Complex> 类型:

import org.apache.commons.math3.complex.Complex

fun solveForComplexRoots(): Pair<Complex, Complex>? {
    val discriminant = Complex(b * b - 4 * a * c)
    val sqrtDiscriminant = discriminant.sqrt()

    val root1 = Complex(-b).add(sqrtDiscriminant).divide(Complex(2 * a))
    val root2 = Complex(-b).subtract(sqrtDiscriminant).divide(Complex(2 * a))

    return Pair(root1, root2)
}

4.3. 测试用例

实数根测试

val solver = QuadraticEquationSolver(1.0, 2.0, 1.0)
val expected = Pair(Complex(-1.0), Complex(-1.0))
val actual = solver.solveForComplexRoots()
assertEquals(expected, actual)

复数根测试(无实根)

测试方程:x² + x + 1 = 0,预期根为:

val solver = QuadraticEquationSolver(1.0, 1.0, 1.0)
val expected = Pair(
    Complex(-0.5, Math.sqrt(3.0) * 0.5),
    Complex(-0.5, -Math.sqrt(3.0) * 0.5)
)
val actual = solver.solveForComplexRoots()
assertEquals(expected, actual)

✅ 测试通过,说明复数根也能正确处理。


5. 总结

本文介绍了如何使用 Kotlin 实现求解二次方程的根,包括:

  • ✅ 判别式 D 的计算
  • ✅ 实数根的求解逻辑与实现
  • ✅ 使用 commons-math3 处理复数运算
  • ✅ 复数根的求解与测试

通过上述实现,我们可以灵活应对各种类型的二次方程求解场景。

完整代码可在 GitHub 获取。


原始标题:Guide to Finding the Roots of a Quadratic Equation in Kotlin