【发布时间】:2013-04-12 08:20:44
【问题描述】:
我正在使用 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)。
【问题讨论】:
-
我不熟悉 sympy,但在我看来,您需要以某种方式声明 2WAa - WAA - Waa != 0 以便计算代数系统给出该答案。跨度>
-
虽然运算符的优先级是明确定义的,但请考虑在
p**2*WAA中添加括号。这将使代码更具可读性。
标签: python math sympy symbolic-math