Sympy求解三次方程结果含虚数且验证不成立,问题出在哪?
三次方程x³-3x+1=0 Sympy求解异常原因分析
问题核心
你遇到的情况是:三次方程x³-3x+1=0明明有三个实根(从图像可看出),但Sympy返回的解包含虚数单位I,且直接代入原方程后没有得到0。
原因解析
不可约三次方程的根式解特性
对于三次方程x³ + px + q = 0,当判别式D = (q/2)² + (p/3)³ < 0时,方程属于不可约三次方程。此时用卡丹公式(Sympy默认的根式解法)得到的解会包含复数形式,但这些复数表达式的虚部最终会相互抵消,结果其实是实数。
对你的方程来说,p=-3,q=1,计算得D=(1/2)² + (-3/3)³ = 1/4 - 1 = -3/4 < 0,符合不可约三次方程的条件,所以解的表达式里会出现虚数。代入后未自动化简
Sympy直接代入后输出的是未化简的复杂表达式,并非真的不等于0,只是没有自动完成代数化简。这类包含复数立方根的表达式需要手动触发化简操作才能得到0。
验证与解决方法
要验证解的正确性,只需对代入后的结果调用Sympy的simplify()或nsimplify()函数:
from sympy import * from sympy.abc import x f = x**3 - 3*x + 1 res = solve(f) # 验证第一个解 print(simplify(f.subs(x, res[0]))) # 输出0 # 或者用数值验证 print(N(res[0])) # 输出约1.53209,代入原方程计算接近0
补充:获取显式实根
如果想要直接得到不含虚数的实根表达式,可以用real_roots()方法:
real_res = real_roots(f) print(real_res) # 输出:[CRootOf(x**3 - 3*x + 1, 0), CRootOf(x**3 - 3*x + 1, 1), CRootOf(x**3 - 3*x + 1, 2)] # 如需数值结果,用N()转换 print([N(r) for r in real_res]) # 输出:[1.53208888623796, -1.87938524157182, 0.347296355333861]
内容的提问来源于stack exchange,提问作者Lucy
相关产品推荐
相关产品推荐

