我已经编写了一个程序来使用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是我要解决的方程式
答案 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
就像您的代码中一样,我们可以替换值:M=1
,d=0.2
to_solve = eq.subs({M:1, d:0.2})
to_solve
现在,我们可以尝试直接解决
solve(to_solve, x)
不幸的是,在这种情况下solve
无法找到解决方案。如果我们仔细看一下方程,则平方根部分应返回负数以使该方程有效。
-2 * (-1/10) - 0.2 = 0
由于数字的平方根不能为负,如果我错了,请纠正我,sympy无法找到x的值,使得sqrt(1 + 2 / x)== -1/10
此问题是由于我们为d
和M
选择了值。如果M和d具有相反的符号,则存在解。
to_solve = eq.subs({M:-1, d:0.2})
to_solve
solve(to_solve, x)
[2.02020202020202]
在sympy live上运行此代码,并尝试其他值。