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

2024-09-28 05:39:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我用sympy来研究一些数学模型,我发现这是出于某种原因共解()给了我错误的答案。在

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正确地解决了方程的一个简单版本:

^{pr2}$

得到了0和1的解。我是做错了什么事,还是在解决问题中有一个bug?如果可能的话,我希望继续使用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 )

给出正确答案。而是代替佤族和佤族

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给出了正确的答案,但却以一种奇怪的扩展形式留下来,比如

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

这简化为a/(B+a),这是正确的,但是sympy并没有简化它,无论是在提出平衡,还是明确要求单独简化这个方程时。所以这看起来更像是一个简化的问题,而不是解决问题的问题。它终究是正确的。似乎很奇怪,辛普森会留下

sqrt(B**2) or sqrt( (WAA - WAa)**2) 

无需简化(或WAB)。在


Tags: 答案sqrteqsmprintsympymatlabsolve
1条回答
网友
1楼 · 发布于 2024-09-28 05:39:03

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

相关问题 更多 >

    热门问题