Python 用辛方法解方程

Python 用辛方法解方程,python,sympy,Python,Sympy,给定U(x)=((x^2-1)^2-x^2)/(x*(x^2-1)),我试图解这个方程: U(x)-1/U(x)=x使用sympy,这是我的代码: from sympy import * x=symbols('x') P,Q=x**2-1,x t=(P**2-Q**2)/(P*Q) print(solve(Eq(t-1/t,x),x)) 我得到了一个很长的列表(压缩了1394行的文本),这与我在wolfram alpha上得到的正确解决方案相比是错误的(这是正确的列表:l3=[-0.50771

给定U(x)=((x^2-1)^2-x^2)/(x*(x^2-1)),我试图解这个方程:

U(x)-1/U(x)=x使用sympy,这是我的代码:

from sympy import *
x=symbols('x')
P,Q=x**2-1,x
t=(P**2-Q**2)/(P*Q)
print(solve(Eq(t-1/t,x),x))
我得到了一个很长的列表(压缩了1394行的文本),这与我在wolfram alpha上得到的正确解决方案相比是错误的(这是正确的列表:l3=[-0.507713305942872,0.507713305942872,-0.777861913430206,0.777861913430206,-1.46190220008154,1.46190220008154]


如何在Python中使用Syry?

< P>得到相同的结果,如果你考虑数值解< /P>
[-0.507713305942872,0.507713305942872,-0.777861913430206,0.777861913430206,-1.46190220008154,1.46190220008154]
正确地说,
solve
可能不是正确的工具。这些解决方案实际上并不“正确”,它们只是非常接近。
solve
试图找到一个分析性的解决方案,即100%完美的解决方案。如果你有一点小错误,你应该使用
solve
(数值求解)而不是
solve

另外,你的方程代码似乎有错误。我让sympy
nsolve
他们得到了一个不在WA中的解。因此我重写了方程,得到了
nsolve
给我一个WA的解:

from sympy import *
x=symbols('x')
U = ((x**2-1)**2- x**2) / (x*(x**2-1))
eqn = U - 1/U - x
nsolve(eqn,x,0.1)
这将产生
0.507713305942872
。这是最接近
0.1
起始值的解决方案

正如奥斯卡·本杰明(Oscar Benjamin)在评论中指出的那样,你可以用它得到所有的数值解

from sympy import *
x=symbols('x')
U = ((x**2-1)**2- x**2) / (x*(x**2-1))
eqn = U - 1/U - x
Poly(eqn.as_numer_denom()[0]).nroots()

默认情况下,nroots计算50个小数位,但您可以通过提供一个关键字参数,如so
。nroots(n=小数位)

您可以使用
多边形((t-1/t-x)以数字形式获取它们的所有根。如_numer\u denom()[0])。nroots()
每个解决方案有可能获得更多的小数位数吗?@meh98是的,我在答案中添加了如何获得小数位数的信息。