You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy求解三次方程结果含虚数且验证不成立,问题出在哪?

三次方程x³-3x+1=0 Sympy求解异常原因分析

问题核心

你遇到的情况是:三次方程x³-3x+1=0明明有三个实根(从图像可看出),但Sympy返回的解包含虚数单位I,且直接代入原方程后没有得到0。

原因解析

  1. 不可约三次方程的根式解特性
    对于三次方程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,符合不可约三次方程的条件,所以解的表达式里会出现虚数。

  2. 代入后未自动化简
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:45:14