使用SymPy求解方程的RuntimeError

时间:2017-10-24 07:53:44

标签: python runtime-error sympy equation

enter image description here

我有一个方程可以解决。该等式可以描述为上面的公式。 N和S是常数,例如N = 201和S = 0.5。我在python中使用sympy来解决它。 python脚本如下:

from sympy import *

x=Symbol('x')
print solve( (((1-x)/200) **(1-x))* x**x - 2**(-0.5), x)

但是, RuntimeError:__instancecheck __

超出了最大递归深度

我也试过使用Mathematica,它可以输出0.963的结果

http://www.wolframalpha.com/input/?i=(((1-x)%2F200)+(1-x))*+xx+-+2**(-0.5)+%3D+0

enter image description here

欢迎任何建议。谢谢。

1 个答案:

答案 0 :(得分:3)

假设您不想要符号解决方案,只需要一个可以使用的值(如WA的0.964),就可以使用mpmath。我不确定它是否真的可以用激进来表达解决方案 - 西澳确实没有尝试过。您应该已将其安装为SymPy

Requires: mpmath

具体来说,mpmath.findroot似乎可以做你想要的。它需要一个实际可调用的Python对象,它是查找根的函数,以及x的起始值。它还接受一些更多参数,例如最小错误tol和你可以使用的解算器,尽管它们似乎并不是真的有必要。你可以像这样简单地使用它:

import mpmath

f = lambda x: (((1-x)/200) **(1-x))* x**x - 2**(-0.5)
print mpmath.findroot(f, 1)

我只是用1作为起始值 - 你可能会想到一个更好的。根据图形的形状来判断,只有一个根可以找到,它可以很容易地接近,而不需要花哨的求解器,所以这应该足够了。另外,考虑到“mpmath是一个用于任意精度浮点运算的Python库”,如果你愿意的话,你应该能够得到一个非常高精度的答案。它有

的输出
(0.963904761592753 + 0.0j)

这实际上是一个mpmath复合体或mpc对象,

mpc(real='0.96390476159275343', imag='0.0')

如果您知道它的虚数值为0,则可以使用以下任一方法:

In [6]: abs(mpmath.mpc(23, 0))
Out[6]: mpf('23.0')

In [7]: mpmath.mpc(23, 0).real
Out[7]: mpf('23.0')

mpf的格式“提取”单个浮点数。