sympy solve()无法找到解决方案

时间:2014-04-18 03:20:18

标签: python python-2.7 sympy

我现在有一个相当基本的代码,它应该解决下面显示的等式,但它没有收敛到解决方案。它只是挂在一个脉冲的" _"

from sympy import *

gamma = 1.4
M_a = 1.0

y = Symbol('y', real=True) 
eqn = Eq((1.0/((gamma/2.0)*(y**2.0))) * ((((1.0 + ((gamma - 1.0)/2.0)*(y**2.0))/(1.0 + ((gamma - 1.0)/2.0)*(M_a**2.0)))**(gamma/(gamma - 1.0))) - 1.0) ,(-0.5704/((1.0 - (y**2.0))**(1.0/2.0))))
print solve(eqn, y)

只需打印等式产生

1.42857142857143*y**(-2.0)*((0.166666666666667*y**2.0 + 0.833333333333333)**3.5- 1.0) == -0.5704*(-y**2.0 + 1.0)**(-0.5)

当插入wolfram或maple时产生正确的解决方案。 〜= 0.696256

所以我试图弄清楚为什么同情不能解决这个问题。

等式应该如下Picture

如果不能用sympy来解决这个等式,我可以使用什么?

由于

菲尔

1 个答案:

答案 0 :(得分:3)

如果您只关心数字解决方案,请不要使用solve。它正在努力寻找一种符号解决方案。但是多项式的符号解通常会非常复杂,并且通常它们不存在。

如果您只想要数字解决方案,请使用nsolve

In [60]: nsolve(eqn, 0)
Out[60]: mpc(real='0.69625557901731519', imag='-3.4211388289180104e-49')

(0是对解决方案的猜测)。那里的虚部很小,可以忽略不计。您可以使用N(solution, chop=True)删除它。

如果您关心符号解决方案,另一条建议是避免浮点指数。使用有理或整数指数。为了象征性地找到多项式的根,必须首先将其转换为实际多项式,即具有整数系数。这意味着必须将浮点系数转换为有理数。但这通常会导致数量巨大,因此影响程度非常大(我怀疑这就是为什么这最终会让你失望,考虑一下:

In [61]: gamma
Out[61]: 1.4

In [62]: Rational(gamma)
Out[62]:
3152519739159347
────────────────
2251799813685248