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

How to define and solve mutually referencing expressions in 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 的正确方法是什么?扩展一下,如何对其进行评估?

=表达的不是你想的那样。 在常规 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}

您可以使用 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}