Sympy解决返回类型错误?

时间:2018-07-25 10:43:31

标签: python-2.7 sympy solver

我已经编写了一个程序来使用Sympy Solvers求解超越方程,但是我一直遇到TypeError。我编写的代码如下:

from sympy.solvers import solve
from sympy import Symbol
import sympy as sp
import numpy as np

x = Symbol('x',positive=True)

def converts(d):
    M = 1.0
    res = solve(-2*M*sp.sqrt(1+2*M/x)-d,x)[0]
    return res
print converts(0.2)

返回以下错误:

raise TypeError('invalid input: %s' % p)
TypeError: invalid input: -2.0*sqrt(1 + 2/x)

我以前已经以这种方式解决了超越方程,但这是我第一次遇到这个错误。

从我收集到的信息来看,Sympy似乎将我的输入视为字符串而不是有理数,但是我不确定是否是或为什么这样。有人可以告诉我为什么我得到这个错误和/或如何解决它?

编辑:我已经重写了代码以使其更清晰,但结果仍然相同

This是我要解决的方程式

1 个答案:

答案 0 :(得分:0)

让我们首先重新创建实际的方程式。

from sympy import *
init_printing()
M, x, d = symbols("M, x, d")
eq = Eq(-2*M * sqrt(1 + 2*M/x) - d, 0)
eq

equation before substitutions

就像您的代码中一样,我们可以替换值:M=1d=0.2

to_solve = eq.subs({M:1, d:0.2})
to_solve

equation after M, d substitutions

现在,我们可以尝试直接解决

solve(to_solve, x)

不幸的是,在这种情况下solve无法找到解决方案。如果我们仔细看一下方程,则平方根部分应返回负数以使该方程有效。

-2 * (-1/10) - 0.2 = 0

由于数字的平方根不能为负,如果我错了,请纠正我,sympy无法找到x的值,使得sqrt(1 + 2 / x)== -1/10

此问题是由于我们为dM选择了值。如果M和d具有相反的符号,则存在解。

to_solve = eq.subs({M:-1, d:0.2})
to_solve

equation after different substitutions

solve(to_solve, x)
  

[2.02020202020202]


sympy live上运行此代码,并尝试其他值。