SymPy – 求解器

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。使用solveset()函数,我们可以解决一个代数方程,如下所示

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

得到的输出结果如下 —

{-3, 3}

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

执行上述代码片断后,得到的输出结果如下 –

{1,2}

solveset的输出是一个解决方案的有限集。如果没有解决方案,将返回一个空集(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()函数。Equations for this example −

a2 +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,创建一个未定义函数。要解决微分方程,请使用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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程