代码之家  ›  专栏  ›  技术社区  ›  Frank Wang

使用Symphy求解方程时的运行时错误

  •  0
  • Frank Wang  · 技术社区  · 7 年前

    enter image description here

    我要解一个方程。该方程可以用上述公式描述。N和S是常数,例如N=201和S=0.5。我在python中使用Symphy来解决它。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))*+x x+-+2**(-0.5)+%3D+0

    enter image description here

    欢迎提出任何建议。谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   Izaak van Dongen Andy Hubbard    7 年前

    假设您不需要符号解,只需要一个可以使用的值(如WA的0.964),您可以使用 mpmath 为了这个。我不确定是否真的有可能用部首来表达这个解——WA当然没有尝试过。您应该已经将其安装为Symphy

    Requires: mpmath
    

    明确地 mpmath.findroot 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')
    

    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 .