📅  最后修改于: 2023-12-03 15:21:27.756000             🧑  作者: Mango
三次方程也叫做三次多项式,通常有如下的一般式:
ax^3+bx^2+cx+d=0
其中 a, b, c, d 都是实数且 a 不等于零。
研究三次方程求解的一般方法可知,它的解析式非常复杂,不便直接求出,所以通常使用待定系数法,即通过人为设定未知常量的值,从而解出方程的解。
设 $x_1, x_2, x_3$ 是三次方程的三个实根,则:
a(x - x1)(x - x2)(x - x3) = a(x^3 - (x1+x2+x3)x^2 + (x1x2+x2x3+x1x3)x - x1x2x3)
将多项式展开得到
ax^3 - a(x1 + x2 + x3)x^2 + a(x1x2 + x2x3 + x1x3)x - a(x1x2x3) = 0
由系数对应原理可知,三次方程中 $x^3$ 的系数为 a, $x^2$ 系数为 -a(x1 + x2 + x3),$x$ 系数为 a(x1x2 + x2x3 + x1x3),常数项系数为 -a(x1x2x3)。因此,我们可以通过设定 $x_1, x_2, x_3$ 后,通过待定系数法,解出三次方程的解。
三次方程解法的代码实现如下:
import math
def solve_cubic_eqn(a, b, c, d):
'''
求解三次方程
:param a: x^3的系数
:param b: x^2的系数
:param c: x的系数
:param d: 常数项系数
:return: 方程的三个实根
'''
p = (3*a*c - b**2) / (3*a**2)
q = (2*b**3 - 9*a*b*c + 27*a**2*d) / (27*a**3)
delta = (q/2)**2 + (p/3)**3
if delta > 0: # 一个实根,两个虚根
u = math.pow(-q/2 + math.sqrt(delta), 1/3)
v = math.pow(-q/2 - math.sqrt(delta), 1/3)
x1 = u + v - b/(3*a)
x2 = -(u + v)/2 - b/(3*a) + (u - v)*math.sqrt(3)/2j
x3 = -(u + v)/2 - b/(3*a) - (u - v)*math.sqrt(3)/2j
return x1, x2, x3
elif delta == 0: # 三个实根,有两个相等
x1 = 3*q / (2*p) - b / (3*a)
x2 = -3*q / (p) - b / (3*a)
return x1, x2, x2
else: # 三个实根
theta = math.acos(-q/2*math.sqrt(-27/(p**3)))
x1 = 2*math.sqrt(-p/3)*math.cos(theta/3) - b/(3*a)
x2 = 2*math.sqrt(-p/3)*math.cos((theta+2*math.pi)/3) - b/(3*a)
x3 = 2*math.sqrt(-p/3)*math.cos((theta+4*math.pi)/3) - b/(3*a)
return x1, x2, x3
代码使用了三次方程的求解公式,其中 $p = \frac{3ac-b^2}{3a^2}, q = \frac{2b^3 - 9abc + 27a^2d}{27a^3}$。如果 $ p^3 + \frac{q^2}{4} > 0$,则三次方程有一个实根和两个复根,否则三次方程有三个实根,其中当 $p^3 + \frac{q^2}{4} = 0$ 时有两个实根相等。
通过本文,我们学习了三次方程的一般式与求解方法。由于三次方程的解析式非常复杂,我们通常使用待定系数法解出方程的解。本文还提供了 Python 代码的实现。