Python 辛解函数给出了错误的结果

Python 辛解函数给出了错误的结果,python,sympy,Python,Sympy,根据这张图: 打印(求解('x**2+x-1/x')) #1/1/3+1/3 1/1/2-1/2-1/2-1/2-1/2-1/1/2-1/2-1/2-1/2-1/2-3/3-1/3-1/3-1/3-1/3-3-3-1/3-3-1/3-3-1/3-3-1/3-3-1/3-3-3-1/3-3-1/3-3-3-3-3-3-3-3-3-1/1/3-3-1/1/3-3-3-3-3-1/1/1/1/1/1/1/3-3-3-3-1/3-3-3-3-3-3-3-3-3-1/1/1/1/1/1/1/1/3-3-3

根据这张图:

打印(求解('x**2+x-1/x'))
#1/1/3+1/3 1/1/2-1/2-1/2-1/2-1/2-1/1/2-1/2-1/2-1/2-1/2-3/3-1/3-1/3-1/3-1/3-3-3-1/3-3-1/3-3-1/3-3-1/3-3-1/3-3-3-1/3-3-1/3-3-3-3-3-3-3-3-3-1/1/3-3-1/1/3-3-3-3-3-1/1/1/1/1/1/1/3-3-3-3-1/3-3-3-3-3-3-3-3-3-1/1/1/1/1/1/1/1/3-3-3-3-3-3-3-3-3-3-3-3-3-//18+25/54)**(1/3)]
我期待着
[0.755,0.57]
,但是,我得到了一些在我未来的程序中无法使用的东西我希望得到一个浮动列表作为结果,因此参考,我做了以下操作,但我得到了一些更奇怪的结果:

def解算器(已解算,rit=3):
res=[]
对于已解决的val:
如果isinstance(val、core.numbers.Add):
flt=val.as_两个术语()[0]
flt=圆形(flt,rit)
其他:
flt=圆形(val,rit)
如果不存在(flt、核心编号、添加):
附加资源(flt)
返回res
打印(解算器(解算('x**2+x-1/x'))
# [-0.333, -0.333, -0.333]

现在我真的对sympy很失望,我想知道是否有一种精确的方法可以得到一个浮点数列表,或者我将编写自己的梯度下降算法来找到根和交点。

sym.solve
为自变量解方程。如果您提供一个表达式,它将假定方程
sym.Eq(expr,0)
。但这只给出了x值。你必须用所说的解来代替y值

你的方程有3个解。复解和实解的共轭对。后者是两个图相交的地方

import sympy as sym

x = sym.Symbol('x')
# better to represent it like the equation it is
eq = sym.Eq(x**2, 1/x - x)
sol = sym.solve(eq)

for s in sol:
    if s.is_real:
        s = s.evalf()
        print(s, eq.lhs.subs({x: s}))   # eq.rhs works too

sym.solve
求解自变量的方程。如果您提供一个表达式,它将假定方程
sym.Eq(expr,0)
。但这只给出了x值。你必须用所说的解来代替y值

你的方程有3个解。复解和实解的共轭对。后者是两个图相交的地方

import sympy as sym

x = sym.Symbol('x')
# better to represent it like the equation it is
eq = sym.Eq(x**2, 1/x - x)
sol = sym.solve(eq)

for s in sol:
    if s.is_real:
        s = s.evalf()
        print(s, eq.lhs.subs({x: s}))   # eq.rhs works too

您可以通过多种方式获得解决方案。如果您知道近似的根位置,并且希望得到数字答案,
nsolve
是最简单的,因为它对表达式类型没有要求:

>>> from sympy import nsolve, symbols
>>> x = symbols('x')
>>> eq = x**2 + x - 1/x
>>> nsolve(eq, 1)
0.754877666246693
您可以尝试在0.57附近进行猜测,但结果将是相同的。那么真的有第二个真正的根吗?不能在此表达式上使用
实\u根
,因为它不是多项式形式。但是如果你把它分成分子和分母,你可以检查分子的根:

>>> n, d = eq.as_numer_denom()
>>> from sympy import real_roots
>>> real_roots(n)
[CRootOf(x**3 + x**2 - 1, 0)]
所以这个表达式只有一个真正的根,
nroots
给你的根


注意:solve给出的答案是立方方程的精确解,它不能确定哪些是方程的解,所以它返回所有三个。如果你对它们进行评估,你会发现其中只有一个是真实的。但是,由于您不需要符号解决方案,只需坚持使用
nroots

就可以得到解决方案。如果您知道近似的根位置,并且希望得到数字答案,
nsolve
是最简单的,因为它对表达式类型没有要求:

>>> from sympy import nsolve, symbols
>>> x = symbols('x')
>>> eq = x**2 + x - 1/x
>>> nsolve(eq, 1)
0.754877666246693
您可以尝试在0.57附近进行猜测,但结果将是相同的。那么真的有第二个真正的根吗?不能在此表达式上使用
实\u根
,因为它不是多项式形式。但是如果你把它分成分子和分母,你可以检查分子的根:

>>> n, d = eq.as_numer_denom()
>>> from sympy import real_roots
>>> real_roots(n)
[CRootOf(x**3 + x**2 - 1, 0)]
所以这个表达式只有一个真正的根,
nroots
给你的根

注意:solve给出的答案是立方方程的精确解,它不能确定哪些是方程的解,所以它返回所有三个。如果你对它们进行评估,你会发现其中只有一个是真实的。但是,由于您不需要符号解决方案,只需坚持使用
nroots