sympy.solve()
似乎给了我一个错误的结果。存在已知的不等式问题,例如http://code.google.com/p/sympy/issues/detail?id=3244但这很简单,它应该有效:
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个解决方案。应该只有两个,第一个是错的。这是一个错误还是我在某个地方犯了错误?
答案 0 :(得分: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个。虚假解决方案来自这个“假零”(意思是它也是分母的零),正如我所指出的那样,它太复杂了解决这个问题。
这是我能说的最好,而不是深入挖掘代码。