如何在SymPy中定义和解决相互引用的表达式

时间:2015-03-24 21:02:03

标签: python sympy

假设我有以下方程组:

x = 1/y + b
y = 2*x

遵循b = x-1/(2*x)

如果我尝试在SymPy中定义这些表达式,

from sympy import *
b = symbols('b')
x = 1/y + b
y = 2*x

它给了我

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-5a9b5f6b923e> in <module>()
      1 from sympy import *
      2 b = symbols('b')
----> 3 x = 1/y + b
      4 y = 2*x
      5 

NameError: name 'y' is not defined

设置这组方程式的正确方法是什么,以便我可以解决x?扩展一下,如何对它进行evalf?

2 个答案:

答案 0 :(得分:3)

您可以使用solve来解决方程式。

In [1]: from sympy import *

In [2]: from sympy.abc import x, y, b

In [3]: eq1 = Eq(x - 1/y - b, 0)

In [4]: eq2 = Eq(2*x - y, 0)

In [5]: solve([eq1, eq2], b)
Out[5]: {b: x - 1/y}

答案 1 :(得分:2)

=表达不符合你的想法。 在常规python语法中,=运算符用于变量赋值。 您应该在符号中定义所有内容,然后将等式转换为等于零并求解。 主要问题是缺乏一般的程序编程知识。

您应该使用solvers,要求公式表示如下。

x = 1/y + b
x - 1/y - b = 0

代码可以写成如下。

from sympy.solvers import solve
from sympy import symbols

b = symbols('b')
x = symbols('x')
y = 2 * x

solve(x - 1/y - b, b)

然后输出将是您想要看到的。

>>> [x - 1/(2*x)]

如果您想以y表示b,可以使用以下代码。

from sympy.solvers import solve
from sympy import symbols

b = symbols('b')
y = symbols('y')
x = y/2

solve(x - 1/y - b, b)

然后输出将是:

>>> [y/2 - 1/y]

如果你想用x和y来表达b,你可以使用以下(感谢Sudhanshu Mishra的答案):

from sympy.solvers import solve
from sympy import symbols, Eq

b = symbols('b')
y = symbols('y')
x = symbols('x')

eq1 = Eq(1/y + b, x)
eq2 = Eq(2 * x, y)

solve([eq1, eq2], b)

结果将是:

>>> {b: x - 1/y}