2015-06-02 46 views
-1

我sympy有一個函數,它是相當難看: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

這是很容易「手」通過以圖表它做它,看到它達到4約N = 400。然後,我試試這個值:

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應該能夠做到這一點。

回答

1

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') 
+0

謝謝,那太好了。我之前曾嘗試使用findroot(),但似乎我沒有正確使用它,因爲它一直運行,所以我不得不停止內核。我沒有指定「求解器='對分'」,你認爲這可能是原因嗎? –

+0

回答說,我自己:是的,沒有求解器='平分'它需要永遠。 –