如何在 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}
假设我有以下方程组:
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}