3

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

4

1 回答 1

2

这已在 SymPy 的开发版本(以及 0.7.2,将在大约一周后发布)中得到修复。它现在给出[0, s*(u - 1)/(2*s*u - s - u)].

因此,要回答您的问题,是的,这是一个错误,并且已修复。

关于之前出了什么问题,我过去常常git bisect缩小解决问题的提交范围。该提交只是改变了 SymPy 中一种基本简化算法的as_numer_denom工作方式。所以我猜发生的事情是一些中间操作的结果很简单,solve()能够识别出错误的解决方案只是1/s(假设平方根嵌套)。 solve()确实通过重新插入来检查找到的解决方案,但是如果它们太复杂,它将无法判断它们是否是伪造的。

可能实际上发生了什么,现在我看起来更近了一点(t1 - t2).as_numer_denom()[0],它解决了使用(因为表达式的零点只是分子的零点),在 0.7.2 中只有 2 度x,而在 0.7.1它的度数为 3。虚假的解决方案来自这个“假零”(这意味着它也是分母的零),正如我所指出的,解决方案太复杂以至于无法注意到它。

在没有深入研究代码的情况下,这是我能说的最好的。

于 2012-10-09T03:57:29.497 回答