Sympy Solve()给出了错误的答案

时间:2013-04-19 02:17:48

标签: python math sympy symbolic-math

我正在使用sympy来处理一些数学模型,我发现由于某种原因,sympy.solve()给了我错误的答案。

import sympy as sm
p, WAA, WAa, Waa = sm.symbols( 'p, WAA, WAa, Waa' )

num = p**2*WAA + p*(1-p)*WAa
denom = p**2*WAA + 2*p*(1-p)*WAa + (1-p)**2*Waa

dipMod = sm.Eq( num / denom , p )
eq = sm.solve(dipMod, p)
print eq

结果应为0,1和(WAa-Waa)/(2WAa-WAA-Waa)。我在MATLAB中解决了我的公式,得到了正确答案。

有趣的是,sympy正确地解决了这个等式的更简单版本:

hapMod = sm.Eq(  WAA*p / (WAA*p + Waa*(1-p)), p )
print sm.solve(hapMod, p)

给出了0和1的解决方案。我做错了什么或者解决了什么错误?如果可能的话,我想坚持使用Python,而不是切换到MATLAB。

更新

我再次遇到了这个问题:

p, WA, Wa = sm.symbols('p, WA, Wa')

hapMod = sm.Eq( p*WA / (p*WA + (1-p)*Wa) , p )
hapModEq = sm.solve( hapMod, p )

给出正确的答案。但代入WA和Wa

hapMod2 = hapMod.subs( [(WA, 1+a*(1-p)), (Wa, 1+B*p)], simultaneous=True  )
hapMod3 = sm.simplify(hapMod2)
print hapMod3
hapMod3Eq = sm.solve(hapMod3, p)

再次给出错误的答案。 MATLAB给出了正确答案0,1,a /(B + a)。我发现如果我从分母中取出多项式并求解

test = sm.Eq( p*(a*p - a - 1)/(B*p - B*p + a*p - a*p - 1), p )
print sm.solve(test, p)

它运作得很好。是否有一些关于多项式分母会引发同情的事情?

更新更新

在搞乱之后,我发现同情给出正确的答案,但是将它们留在奇怪的扩展形式中,如

(B + 2*a)/(2*(B+a)) + sqrt(B**2)/(-2*B - 2*a). 

这简化为正确的a /(B + a),但是当呈现均衡时或当明确要求分别简化该等式时,同情不会简化它。所以它似乎更像是简化问题而不是解决问题。毕竟它正确解决了。同情似乎很奇怪,同情会留下像

这样的东西
sqrt(B**2) or sqrt( (WAA - WAa)**2) 

不将它们简化为B或(WAA - WAa)。

1 个答案:

答案 0 :(得分:8)

如果您想将sqrt(x**2)简化为x,则需要将x设置为正数,否则不是这样。这可以通过设置x = Symbol("x", positive=True)来完成。