Sympy 可以绘制函数但找不到明显的根
Sympy can graph the function but cannot find the obvious root
我在 sympy 中有一个非常丑陋的函数:
In [79]: print(expected_c)
Out[79]: 2**(n - 2)*n*(n - 1)*binomial(m, n)*factorial(m - 3/2)*factorial(m - n)/(binomial(2*m, n)*factorial(m - n/2)*factorial(m - n/2 - 1/2))
我想用 $m$(比如 10000)求解它,找到 $n$ 使得我的公式值,比如 4。
通过绘制它很容易'by hand',并且可以看到它在大约 n=400 时达到 4。然后我试试这个值:
In [64]: expected_c.subs([(m,10000), (n,400)]).evalf()
Out[64]: 3.9901995099755
但是数值求解器找不到这个值:
In [82]: sympy.nsolve(expected_c.subs(m,10000.0)-4.0,n,400)
Out[82]: mpf('nan')
有没有办法让它工作,还是我必须自己编写一个数值求解器?即使是一个愚蠢的人也可以完成这项工作,因为我不需要高精度,但我认为 Sympy 应该能够做到这一点。
nsolve 的文档字符串警告您使用了表达式的分子。在您的情况下,这是灾难性的,建议直接使用 mpmath.findroot:
>>> m = 10**4; c = 4
>>> f=lambda n,m,c:( 2**(n - 2)*n*(n - 1)*binomial(m, n)*factorial(m - S(3)/2)*
... factorial(m - n)/(binomial(2*m, n)*factorial(m - n/2)*factorial(m - n/2
... - S(1)/2))-c)
>>> mpmath.findroot(lambda x:f(x, m, c),(300,450),solver='bisect')
mpf('400.49031238268759')
我在 sympy 中有一个非常丑陋的函数:
In [79]: print(expected_c)
Out[79]: 2**(n - 2)*n*(n - 1)*binomial(m, n)*factorial(m - 3/2)*factorial(m - n)/(binomial(2*m, n)*factorial(m - n/2)*factorial(m - n/2 - 1/2))
我想用 $m$(比如 10000)求解它,找到 $n$ 使得我的公式值,比如 4。
通过绘制它很容易'by hand',并且可以看到它在大约 n=400 时达到 4。然后我试试这个值:
In [64]: expected_c.subs([(m,10000), (n,400)]).evalf()
Out[64]: 3.9901995099755
但是数值求解器找不到这个值:
In [82]: sympy.nsolve(expected_c.subs(m,10000.0)-4.0,n,400)
Out[82]: mpf('nan')
有没有办法让它工作,还是我必须自己编写一个数值求解器?即使是一个愚蠢的人也可以完成这项工作,因为我不需要高精度,但我认为 Sympy 应该能够做到这一点。
nsolve 的文档字符串警告您使用了表达式的分子。在您的情况下,这是灾难性的,建议直接使用 mpmath.findroot:
>>> m = 10**4; c = 4
>>> f=lambda n,m,c:( 2**(n - 2)*n*(n - 1)*binomial(m, n)*factorial(m - S(3)/2)*
... factorial(m - n)/(binomial(2*m, n)*factorial(m - n/2)*factorial(m - n/2
... - S(1)/2))-c)
>>> mpmath.findroot(lambda x:f(x, m, c),(300,450),solver='bisect')
mpf('400.49031238268759')