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 获取。