使用 SymPy 求解方程时出现 RuntimeError
RuntimeError in solving equation using SymPy
我有一个方程式要解。该等式可以描述为上面的公式。 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: maximum recursion depth exceeded in __instancecheck__
我也试过用Mathematica,可以输出0.963的结果
http://www.wolframalpha.com/input/?i=(((1-x)%2F200)+(1-x))*+xx+-+2**(-0.5)+%3D+0
欢迎任何建议。谢谢。
假设您不需要符号解,只需要一个您可以使用的值(如 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 is a Python library for arbitrary-precision floating-point arithmetic",如果您愿意,您应该能够从中获得非常高精度的答案。它的输出为
(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')
到 "extract" 格式为 mpf
的单个浮点数。
我有一个方程式要解。该等式可以描述为上面的公式。 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: maximum recursion depth exceeded in __instancecheck__
我也试过用Mathematica,可以输出0.963的结果
http://www.wolframalpha.com/input/?i=(((1-x)%2F200)+(1-x))*+xx+-+2**(-0.5)+%3D+0
欢迎任何建议。谢谢。
假设您不需要符号解,只需要一个您可以使用的值(如 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 is a Python library for arbitrary-precision floating-point arithmetic",如果您愿意,您应该能够从中获得非常高精度的答案。它的输出为
(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')
到 "extract" 格式为 mpf
的单个浮点数。