from sympy import *
from sympy.abc import x

f = x**3 - 3*x + 1
res = solve(f)
print(res)

然而,对于虚数单位,它给出了不正确的答案.判断VIA subs也不会返回0.

最新版本:

回复:

[-3/((-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)) - (-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)/3,
 -(-1/2 + sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)/3 - 3/((-1/2 + sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)),
 -(27/2 + 27*sqrt(3)*I/2)**(1/3)/3 - 3/(27/2 + 27*sqrt(3)*I/2)**(1/3)]

Subs判断:

>>> print(f.subs(x, res[0]))
1 + (-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3) + (-3/((-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)) - (-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)/3)**3 + 9/((-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3))

剧情:

>>> plot(f, xlim=(-2, 2), ylim=(-2, 2))

plot

推荐答案

让我们try 将由渐近计算的符号解转换为浮点数:

from sympy import *
var("x")
f = x**3 - 3*x + 1
sol = solve(f)
print([s.n() for s in sol])
# [0.347296355333861 - 0.e-23*I, 1.53208888623796 + 0.e-20*I, -1.87938524157182 + 0.e-23*I]

这里你可以看到很小的虚部.这些是舍入误差.我们可以用这个来删除它们:

print([s.n(chop=True) for s in sol])
# [0.347296355333861, 1.53208888623796, -1.87938524157182]

现在,我将把第一个符号解重新代回到方程式中:

print(f.subs(x, sol[0]))
# 1 + (-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3) + (-3/((-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)) - (-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3)/3)**3 + 9/((-1/2 - sqrt(3)*I/2)*(27/2 + 27*sqrt(3)*I/2)**(1/3))

它看起来不是零,但我们可以要求SINGNY将其简化,如下所示:

print(f.subs(x, sol[0]).simplify())
# 0

如你所见,由渐近度计算的符号解是正确的.

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

将pandas Dataframe转换为3D numpy矩阵

django禁止直接分配到多对多集合的前端.使用user.set()

我如何使法国在 map 中完全透明的代码?

如何在Python脚本中附加一个Google tab(已经打开)

Python—从np.array中 Select 复杂的列子集

SQLAlchemy Like ALL ORM analog

使用密钥字典重新配置嵌套字典密钥名

转换为浮点,pandas字符串列,混合千和十进制分隔符

Python Pandas获取层次路径直到顶层管理

合并与拼接并举

基于Scipy插值法的三次样条系数

如何按row_id/row_number过滤数据帧

pandas fill和bfill基于另一列中的条件

如何删除重复的文字翻拍?

用两个字符串构建回文

提取最内层嵌套链接

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

正在try 让Python读取特定的CSV文件

迭代工具组合不会输出大于3的序列