SymPy 求解器


由于符号 = 和 == 在 Python 中被定义为赋值和相等运算符,因此它们不能用于制定符号方程。 SymPy 提供 Eq() 函数来建立方程。

>>> from sympy import * 
>>> x,y=symbols('x y') 
>>> Eq(x,y)

上面的代码片段给出的输出等价于下面的表达式:

x = y

由于当且仅当 x-y=0 时 x=y 是可能的,所以上式可以写成:

>>> Eq(x-y,0)

上面的代码片段给出的输出等价于下面的表达式:

x: y = 0

SymPy 中的求解器模块提供了 soveset() 函数,其原型如下:

solveset(equation, variable, domain)

默认情况下,域是 S.Complexes。使用solvset()函数,我们可以解出一个代数方程如下:

>>> solveset(Eq(x**2-9,0), x)

得到如下输出:

{−3, 3}

>>> solveset(Eq(x**2-3*x, -2),x)

执行上述代码片段后得到如下输出:

{1,2}

solveset 的输出是解的 FiniteSet。如果没有解决方案,则返回 EmptySet

>>> solveset(exp(x),x)

执行上述代码片段后得到如下输出:

$\varnothing$

线性方程


我们必须使用 linsolve() 函数来求解线性方程组。

例如,方程如下:

x-y=4

x+y=1

>>> from sympy import * 
>>> x,y=symbols('x y') 
>>> linsolve([Eq(x-y,4),Eq( x + y ,1) ], (x, y))

执行上述代码片段后得到如下输出:

$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$

linsolve() 函数还可以求解以矩阵形式表示的线性方程。

>>> a,b=symbols('a b') 
>>> a=Matrix([[1,-1],[1,1]]) 
>>> b=Matrix([4,1]) 
>>> linsolve([a,b], (x,y))

如果我们执行上面的代码片段,我们会得到以下输出:

$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$

非线性方程


为此,我们使用 nonlinsolve() 函数。本例的方程式:

a 2 +a=0 a-b=0

>>> a,b=symbols('a b') 
>>> nonlinsolve([a**2 + a, a - b], [a, b])

如果我们执行上面的代码片段,我们会得到以下输出:

$\lbrace(-1, -1),(0,0)\rbrace$

微分方程


首先,通过将 cls=Function 传递给 symbols 函数来创建一个未定义的函数。要求解微分方程,请使用 dsolve。

>>> x=Symbol('x') 
>>> f=symbols('f', cls=Function) 
>>> f(x)

执行上述代码片段后得到如下输出:

f(x)

这里 f(x) 是一个未计算的函数。其导数如下:

>>> f(x).diff(x)

上面的代码片段给出的输出等价于下面的表达式:

$\frac{d}{dx}f(x)$

我们首先创建对应于以下微分方程的 Eq 对象

>>> eqn=Eq(f(x).diff(x)-f(x), sin(x)) 
>>> eqn

上面的代码片段给出的输出等价于下面的表达式:

$-f(x) + \frac{d}{dx}f(x)= \sin(x)$

>>> dsolve(eqn, f(x))

上面的代码片段给出的输出等价于下面的表达式:

$f(x)=(c^1-\frac{e^-xsin(x)}{2}-\frac{e^-xcos(x)}{2})e^x$