同情解决给出了错误的结果

时间:2012-10-08 10:18:52

标签: sympy

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个解决方案。应该只有两个,第一个是错的。这是一个错误还是我在某个地方犯了错误?

1 个答案:

答案 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个。虚假解决方案来自这个“假零”(意思是它也是分母的零),正如我所指出的那样,它太复杂了解决这个问题。

这是我能说的最好,而不是深入挖掘代码。