【问题标题】:Sympy solveset showing imaginary solutionsSympy 求解集显示想象的解决方案
【发布时间】:2025-12-26 08:15:16
【问题描述】:

我正在尝试解方程 -

f(x) = x^3 - 4x^2 + 1

使用 sympy,尽管绘图显示了实根,但我的代码输出了虚根

我尝试将变量的域更改为实数,但这似乎不起作用

from sympy import *
init_printing(use_latex=True)
x, y, z = symbols('x y z')
solveset((x**3 - 4*(x**2) + 1),x, domain=S.Reals)

使用 wolfram alpha 的预期输出是 x≈ -0.47283, 0.53740, 3.9345,上述 sympy 代码的输出是 https://ibb.co/bbwzYRb

【问题讨论】:

    标签: python-3.x sympy


    【解决方案1】:

    我看不到您引用的页面,但获得了一个集合和一个交集的并集。看起来Intersection 不知道它应该忽略根上的虚部。使用chop=True 评估solve 结果将起作用:

    >>> [i.n(2, chop=True) for i in solve(x**3 - 4*(x**2) + 1)]
    [0.54, -0.47, 3.9]
    

    【讨论】:

    • 谢谢,提供的解决方案有效,需要阅读更多文档才能找出原因
    • 虽然可以知道给定三次方有多少个实根,但如果不使用虚数可能无法表示这些实根(参见 casusirredicibilis)。当 Intersection 计算根的数值以查看它们是否为实数时,我的猜测是它计算值,看到虚部 没有精度,但得出的结论是虚部是实数并且拒绝他们。没有存储在 Intersection 中的信息来告诉它有多少根是真实的,所以我认为它所能做的最好的事情就是不评估结果。