2013-11-04 71 views
3

我想找到滿足特定方程的所有實數。我有爲什麼SymPy的求解器只返回一個簡單的解決方案?

Solve[n*9^5 == 10^n-1, n] 

gives both 0 and 5.51257沒有麻煩找到這些值數學;但是當我使用SymPy的(0.7.3,2.7.5的Python)solve

n = sympy.symbols('n') 
sympy.solve(n*9**5 - 10**n-1, n) 

我似乎只得到的東西看起來像0,而不是第二個價值,這是我真正追求。

我如何獲得SymPy來生成我正在尋找的非平凡解決方案?是否有我應該使用的不同功能或包?

回答

3

solve只給出了符號解決方案,所以如果它找不到解決方案的封閉形式,它不會返回它。如果你只關心數字解決方案,你想在SymPy中使用nsolve,或者你可以使用更多的面向數字的Python庫。例如

sympy.nsolve(n*9**5 - 10**n-1, n, 5) 

會給你你正在尋找的解決方案。


使用solve的問題是,存在無窮多個溶液,每個對應於LambertW功能的一個分支。有關完整的解決方案集,請參閱WolframAlpha。不幸的是,only the principal branch of LambertW is implemented in SymPy

在修復此問題之前,另一種解決問題的方法是使用mpmath.lambertw手動評估在另一分支上由solve返回的LambertW。要做到這一點,最簡單的方法是使用lambdify

s = sympy.solve(n*9**5 - 10**n-1, n)  
import sympy.mpmath 
# Replace -1 with any integer. -1 gives the other real solution, the one you want 
lambdify([], s, [{'LambertW': lambda x: sympy.mpmath.lambertw(x, -1)}, "mpmath"])() 

這給[mpf('5.5125649309411875')]

該字典告訴lambdify使用mpmath使用-1分支來評估LambertW函數。 "mpmath"告訴它將mpmath用於解決方案中的任何其他功能。

+0

不知道爲什麼它不會呈現該URL。 – asmeurer

+0

顯然,您不必像我最初認爲的那樣使用私有API。如果您碰巧讀到我最初寫的內容,請參閱編輯的解決方案。 – asmeurer

相關問題