2012-10-08 73 views
2

sympy.solve()似乎給我一個錯誤的結果。已知存在不等式的問題,例如http://code.google.com/p/sympy/issues/detail?id=3244但是這是非常簡單,它應該工作:sympy解決給出錯誤結果

import sympy 
    from sympy.abc import x, u, s 
    t1 = x*(1 - x)/(1 - s*x) 
    t2 = u*x + (1-s)*(1 - u)*x*(1 - x)/(1 - s*x) 
    sympy.solve(t1-t2,x) 

是給我3個解決方案。應該只有兩個,第一個是錯的。這是一個錯誤還是我在某個地方犯了錯誤?

回答

2

這已在SymPy的開發版本中解決(並在0.7.2版本中發佈,將在一週內發佈)。現在它給出[0, s*(u - 1)/(2*s*u - s - u)]

所以,要回答你的問題,是的,這是一個錯誤,它被修復了。

關於之前出了什麼問題,我用git bisect來縮小commit that fixed the problem的範圍。該提交改變了SymPy中的一個基本簡化算法as_numer_denom的工作方式。所以我猜想發生了什麼事情是,一些中間操作的結果非常簡單,以至於solve()能夠認識到不好的解決方案只是1/s(假設平方根被破壞)。 solve()確實通過插入它們來檢查它找到的解決方案,但是如果它們太複雜,將無法分辨它們是否是假的。

可能實際上發生了什麼事,現在我仔細看一點點,只是(t1 - t2).as_numer_denom()[0],這解決了使用(因爲一個表達式的零分子的只是零),在0.7.2只有在x度2 ,而在0.7.1中它具有3級。假的解決方案來自這個「虛假零」(意味着它也是分母的零),正如我所指出的,解決這個問題太複雜了。

這是我可以說的最好的,而不是深入挖掘代碼。

+0

謝謝,很高興知道。出於好奇,你會介意解釋早期版本中出了什麼問題嗎? – jacob

+0

我編輯瞭解釋的答案。 – asmeurer