# 9.2 SymPy基础

#### 9.3.1 化简

使用simplify()函数可以对表达式进行化简，simplify()函数以字符表达式类型作为传入参数，以SymPy表达式类型返回表达式的化简结果。

\[]:expr=(x\*\*3 + x\*\*2 - x - 1)/(x\*\*2 + 2\*x + 1)

simplify(expr)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-41bdb42e464cdf44b6b8c5e1495510a22dbeb4bc%2F693baf61e294e2d9520d2df53cb2b976.png?alt=media)\[]:

#### 9.3.2 展开

**多项式展开**

使用expand()函数可以对多项式进行展开，expand()函数以多项式类型作为传入参数，以SymPy表达式类型返回多项式的化简结果。

> \[]:expr=(1+2\*x+4\*y)\*\*3

> expand(expr)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-a72783e9df676de99df45d166825752e388a4b9c%2F9de4ee22e0c15e4395c6d7149b54c01e.png?alt=media) \[]:

**三角展开**

使用expand\_trig()函数可以对三角多项式进行展开，expand\_trig()函数以三角多项式类型作为传入参数，以SymPy表达式类型返回多项式的化简结果。

\[]:expr=sin(2\*x)+cos(2\*x)

expand\_trig(expr)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-1e01c74c502e113ce6af7b868e767d2b78098377%2F1430001b9347e2b0fd011e48c0059f47.png?alt=media)\[]:

#### 9.3.3 因式分解

使用factor()函数可以对符号表达式进行因式分解，factor()函数以字符表达式类型作为传入参数，以字符表达式类型返回因式分解结果。

\[]:expr=x\*\*3-x\*\*2+x-1

factor(expr)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-6e6ee0cb956366fdbf9e1eb4597c69503e8f0373%2F7361e165642913a71684d59982f83000.png?alt=media)\[]:

#### 9.3.4 合并同类项

使用collect()函数可以对符号表达式进行同类项合并，collect()函数以字符表达式类型作为传入参数，以字符表达式类型返回同类项合并结果结果。使用expr.collect.coeff(expr, n)可以返回前的系数。

\[]:expr = x\*y + x - 3 + 2\*x\*\*2 - z\*x\*\*2 + x\*\*3

collected\_expr=collect(expr, x)

collected\_expr

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-ee733d0f9d1ff5492e91680cb89471625d7cbc3d%2Fe22ba9652469cd5c12867ce04303cef1.png?alt=media)\[]:

\[]:collected\_expr.coeff(x,2)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-748868fee65dbf3848cd9d447e458bf239b956cc%2F358193e5c6281e8a23bee927e60948a7.png?alt=media)\[]:

#### 9.3.5 解一元方程

使用solveset()函数可以对一元方程进行求解，solveset()函数以字符表达式类型作为传入参数，以集合类型返回一元方程的解。

\[]:solveset((x+1)\*(x+3)-15, x)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-b1b30cc1ac724e6c66200c6b489a3eec5e3fe8f2%2F9745f1a9a3df4ae30a136e3591e55a3a.png?alt=media)\[]:

Eq()函数用来创建一个等式，eq()函数接受两个参数，分别为等号的左右两侧数学表达式。

\[]:Equ=Eq((x+1)\*(x+3), 15)

solveset(Equ, x)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-b1b30cc1ac724e6c66200c6b489a3eec5e3fe8f2%2F9745f1a9a3df4ae30a136e3591e55a3a.png?alt=media)\[]:

#### 9.3.6 解方程组

**线性系统**

使用linsolve()函数可以对线性系统方程组进行求解。

linsolve()函数的用法如下：

sympy.solvers.solveset.linsolve(system, \*symbols)

其中system代之线性系统也即需要解的线性方程组。\*symbols为需要求解的变量。求解结果以集合的形式给出。

例：求解线性系统

\[]:linsolve(\[3\*x+2\*y+z-39, 2\*x+3\*y+z-34, x+2\*y+3\*z-26], (x, y, z))

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-063a9a906d307f9d6fc1d46d1137a5efd4690450%2F7667729dc84ce930c6f3b0f36698ad25.png?alt=media)\[]:

**非线性系统**

使用nonlinsolve()函数可以对线性系统方程组进行求解。

nonlinsolve()函数的用法如下：

sympy.solvers.solveset.linsolve(system, \*symbols)

其中system代之线性系统也即需要解的非线性方程组。\*symbols为需要求解的变量。求解结果以集合的形式给出。

例：求解非线性系统

\[]:nonlinsolve(\[x\*\*2+4\*y\*\*2-5, x+2\*y-1], x, y)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-934fd05515c147b08d619d913d9a5f20bc46e8d8%2F7e3a25639cd09e0e676a25235e00424b.png?alt=media)\[]:

#### 9.3.7 解不等式

**解带有有理系数的有理不等式**

针对有带有有理系数的有理不等式，SymPy在sympy.solvers.inequalities模块中封装了solve\_poly\_inequality()函数来求解此类不等式。

使用如下语句导入solve\_poly\_inequality()函数：

from sympy.solvers.inequalities import solve\_rational\_inequality

例：解不等式组

\[]:solve\_rational\_inequalities(\[\[

... ((Poly(-x + 1), Poly(1, x)), '>='),

... ((Poly(-x + 1), Poly(1, x)), '<=')]])

例：解不等式组

\[]:solve\_rational\_inequalities(\[\[

... ((Poly(x), Poly(1, x)), '!='),

... ((Poly(-x + 1), Poly(1, x)), '>=')]])

**解带有理数系数的多项不等式**

在对使用SymPy解带有有理系数的多项不等式进行讲解之前，我们首先需要介绍一个特殊的函数——Ploy。

Ploy()用于表示多项式表达式并对其进行操作的泛型类，是Expr类的子类。

Ploy()函数的使用方式如下：

Poly\*\*(**rep**,\*\* **\***&#x67;ens\*\*,\*\* **\*\***&#x61;rgs\*\*)\*\*

使用如下语句导入Poly函数：

针对有带有有理系数的有理不等式，SymPy在sympy.solvers.inequalities模块中封装了solve\_poly\_inequality()函数来求解此类不等式。

使用如下语句导入solve\_poly\_inequality()函数：

from sympy.solvers.inequalities import solve\_poly\_inequality

例：解不等式组

\[]:>>> solve\_poly\_inequality(Poly(x\*\*2 - 1, x, domain='ZZ'), '!=')

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-92aac899c3f210f97bbdcbc1687f686f59a205cf%2Fd38ad1634f9caf5497070bac686c648a.png?alt=media)\[]:

例：解方程

\[]:solve\_rational\_inequalities(\[\[

... ((Poly(-x + 1), Poly(1, x)), '!='),

... ((Poly(-x + 1), Poly(1, x)), '<=')]])

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-53a7d10c827e60f00446965ba357c6b5be45a1f1%2F311cc66a57a62c6e28172a41f5d2423a.png?alt=media)

**解实数单变量不等式**

针对实数单变量不等式，SymPy在sympy.solvers.inequalities模块中封装了solve\_ univariate \_inequality()函数来求解此类不等式。

使用如下语句导入solve\_ univariate \_inequality()函数：

from sympy.solvers.inequalities import solve\_ univariate \_inequality

例：解不等式

\[]:solve\_univariate\_inequality(x\*\*2 >= 4, x, relational=False)

Union(Interval(-oo, -2), Interval(2, oo))

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-12e76931705874fab1011fd47266ae5227e41c08%2F60b20d62806d36a6f306b0881938396c.png?alt=media)\[]:

例：解不等式

\[]:solve\_univariate\_inequality(x\*\*3+2\*x\*\*2 -3\*x>= 4, x, relational=False)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-6d2ada1c2410337d5f201b9fd3833319f55fb113%2Fd4be1383e32bd325353380d3d64bf6ff.png?alt=media)\[]:

例：解不等式

\[]:domain = Interval(0, S.Infinity)

solve\_univariate\_inequality(x\*\*3+2\*x\*\*2 -3\*x>= 4, x, False, domain)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-af7daa81404ecf1110bf510feedd44b0c5134c76%2Fcb53c03cfae57e745d8d418e2a6a2cbb.png?alt=media)\[]:

例：解三角不等式

\[]:solve\_univariate\_inequality(sin(x)\*\*2> 0, x, relational=False)

![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-5cf0d82e998b9844299cb951773ed9c97245bf58%2Fc18b39ee0174bb6b63a4c56bffce5b74.png?alt=media)\[]:

**化简带有有理系数的有理数多项式**

\[]:from sympy import Poly, Symbol

from sympy.solvers.inequalities import reduce\_rational\_inequalities

x = Symbol('x', real=True)

例：化简

\[]:reduce\_rational\_inequalities(\[\[x\*\*2 <= 0]], x)

例：化简

\[]:reduce\_rational\_inequalities(\[\[x + 2 > 0]], x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-e776be8b2a48f63bb557688af9af5584998e79d4%2Fae138aa4226e3db35f5932d7640832aa.png?alt=media)

\[]:reduce\_rational\_inequalities(\[\[(x + 2, ">")]], x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-ccf77e1cf7ba6ae9bf52967a142d09e6de7f6f7f%2F5f41eb20d49398cc2233161f536c7c4d.png?alt=media)

\[]:reduce\_rational\_inequalities(\[\[x + 2]], x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-a43d7e7af28ae6eaa77f8b992d952ce1bc8aa837%2Fb967aaa96e79c4bdda7a3d542e790ba8.png?alt=media)

**化简带有绝对值的不等式**

\[]:from sympy import Abs, Symbol

from sympy.solvers.inequalities import reduce\_abs\_inequality

x = Symbol('x', real=True)

\[]:reduce\_abs\_inequality(Abs(x - 5) - 3, '<', x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-af98d5f459e5d67c8f3a692bcc77044f71d46083%2F1054165365a5201c79213c9b272c4e49.png?alt=media)

\[]:reduce\_abs\_inequality(Abs(x + 2)\*3 - 13, '<', x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-53af59c915e629a91ab7736eb9ddbe12b86c3211%2Fc6ebdec6c964350e93bc6d36f53b35bf.png?alt=media)

**化简带有绝对值的不等式系统**

\[]:from sympy import Abs, Symbol

from sympy.solvers.inequalities import reduce\_abs\_inequality

x = Symbol('x', real=True)

例：化简

\[]:reduce\_abs\_inequalities(\[(Abs(3\*x - 5) - 7, '<'),

... (Abs(x + 25) - 13, '>')], x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-20725edb3a0dfe541bcd5821d4ab1a27975ed849%2Fd1fe7be0b8cf048a742b63961be7c517.png?alt=media)

例：化简

\[]:reduce\_abs\_inequalities(\[(Abs(x - 4) + Abs(3\*x - 5) - 7, '<')], x)

\[]:![](https://914753012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-LkXo6sfWzVc3cno%2Fuploads%2Fgit-blob-a5737b61954603f5932fe0aef0e7ac072697d147%2F50daab97ade4feea868d8db65119b381.png?alt=media)
