python - Sympy Solve( ) 给出不正确的答案

标签 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)

它工作得很好。多项式分母是否会引发 sympy?

更新更新

在弄乱它之后,我发现 sympy 给出了正确的答案,但是把它们留在了一个奇怪的扩展形式中,比如

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

这简化为 a/(B+a) 这是正确的,但 sympy 在呈现平衡时或在明确要求单独简化此等式时都不会简化它。所以它看起来更像是一个简化而不是解决的问题。毕竟它正确解决了。 sympy 会留下像

这样的东西,这似乎很奇怪
sqrt(B**2) or sqrt( (WAA - WAa)**2) 

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

最佳答案

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

关于python - Sympy Solve( ) 给出不正确的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16096164/

相关文章:

javascript - 如何使用selenium选择没有id的下拉菜单

math - 谁能解释一下这个 GLSL 片段着色器在做什么?

python - SymPy:将字符串解析为流形上的函数

python - sympy 分段函数的羔羊化计算每个表达式

python - 如何用sympy求解矩阵方程?

python - Pandas 在数组中查找子数组的索引

python - 如何将多层嵌套的json转换为sql表

python - 通过 Python 2.7 在 .xls 上写入多列

java - 了解 strictMath java 库

algorithm - 如何修复此浮点平方根算法