用Python做科学计算(工具篇)——sympy使用指南(符号运算)

用Python做科学计算(工具篇)——sympy使用指南(符号运算)什么是 SymPy SymPy 是一款用于符号运算的 Python 库 它旨在成为 Mathematica 或 Maple 等系统的替代品 同时保持代码尽可能简单且易于扩展 SymPy 完全用 Python 编写 不需要任何外部库

大家好,欢迎来到IT知识分享网。

什么是 SymPy?

SymPy 是一款用于符号运算的 Python 库。它旨在成为 Mathematica 或 Maple 等系统的替代品,同时保持代码尽可能简单且易于扩展。SymPy 完全用 Python 编写,不需要任何外部库。

用Python做科学计算(工具篇)——sympy使用指南(符号运算)

目录

  • sympy第一步

将symy用作计算器

符号

  • 代数操作

展开

化简

  • 微积分

极限

微分

级数展开

积分

  • 方程求解
  • 线性代数

矩阵

微分方程


3.2.1. SymPy 的第一步

3.2.1.1. 使用 SymPy 作为计算器

SymPy 定义了三种数值类型实数,有理数和整数

有理数类将有理数表示为一对两个整数:分子和分母,因此 表示 1/ 2、5/2 等:Rational(1, 2)Rational(5, 2)

>>>

>>> import sympy as sym >>> a = sym.Rational(1, 2) >>> a 1/2 >>> a*2 1 

SymPy 在后台使用 mpmath,这使得使用任意精度算术执行计算成为可能。这样,一些特殊的常数,如e, pi, 无穷大(Infinity) 被视为符号并且可以以任意精度计算:

>>>

>>> sym.pi2 pi2 >>> sym.pi.evalf() 3.979 >>> (sym.pi + sym.exp(1)).evalf() 5.884 

evalf将表达式计算为浮点数。

还有一个表示数学无穷大的类, oo

>>>

>>> sym.oo > 99999 True >>> sym.oo + 1 oo 

3.2.1.2. 符号

与其他计算机代数系统相比,在 SymPy 中你必须显式声明符号变量:

>>>

>>> x = sym.Symbol('x') >>> y = sym.Symbol('y') 

然后可以操作它们:

>>>

>>> x + y + x - y 2*x >>> (x + y) 2 (x + y)2 

现在可以使用一些 python 运算符来操作符号:+、(算术)、&、| , ~ , >>, << (布尔值)。-`, “*

print

Sympy 允许控制输出的显示。从这里我们使用以下设置进行print:

>>>

>>> sym.init_printing(use_unicode=False, wrap_line=True) 

3.2.2.代数运算

SymPy 能够执行强大的代数运算。我们将研究一些最常用的:展开和化简。

3.2.2.1.展开

使用它来展开代数表达式。它将尝试消除幂和乘法:

>>>

>>> sym.expand((x + y) 3) 3 2 2 3 x + 3*x *y + 3*x*y + y >>> 3 * x * y 2 + 3 * y * x 2 + x 3 + y 3 3 2 2 3 x + 3*x *y + 3*x*y + y 

可以在关键字的表单中提供更多选项:

>>>

>>> sym.expand(x + y, complex=True) re(x) + re(y) + I*im(x) + I*im(y) >>> sym.I * sym.im(x) + sym.I * sym.im(y) + sym.re(x) + sym.re(y) re(x) + re(y) + I*im(x) + I*im(y) >>> sym.expand(sym.cos(x + y), trig=True) -sin(x)*sin(y) + cos(x)*cos(y) >>> sym.cos(x) * sym.cos(y) - sym.sin(x) * sym.sin(y) -sin(x)*sin(y) + cos(x)*cos(y) 

3.2.2.2. 化简

如果您想将表达式转换为更简单的形式,请使用简化:

>>>

>>> sym.simplify((x + x * y) / x) y + 1 

化简是一个有点模糊的术语,并且存在更精确的化简替代方案:(powsimp指数的简化),( trigsimp对于三角表达式) ,logcombine,radsimp

3.2.3. 微积分

3.2.3.1.极限

限制在 SymPy 中很容易使用,语法limit(function, variable, point),比如要计算f(x)在x趋于0的极限,使用limit(f, x, 0)

>>>

>>> sym.limit(sym.sin(x) / x, x, 0) 1 

还可以计算无穷大的极限:

>>>

>>> sym.limit(x, x, sym.oo) oo >>> sym.limit(1 / x, x, sym.oo) 0 >>> sym.limit(x x, x, 0) 1 

3.2.3.2.微分

使用 diff(func, var) 计算任何 SymPy 的表达式。例子:

>>>

>>> sym.diff(sym.sin(x), x) cos(x) >>> sym.diff(sym.sin(2 * x), x) 2*cos(2*x) >>> sym.diff(sym.tan(x), x) 2 tan (x) + 1 

通过以下方式检查它是否正确:

>>>

>>> sym.limit((sym.tan(x + y) - sym.tan(x)) / y, y, 0) 2 tan (x) + 1 

可以使用以下方法计算更高阶的导数:diff(func, var, n)

>>>

>>> sym.diff(sym.sin(2 * x), x, 1) 2*cos(2*x) >>> sym.diff(sym.sin(2 * x), x, 2) -4*sin(2*x) >>> sym.diff(sym.sin(2 * x), x, 3) -8*cos(2*x) 

3.2.3.3.级数展开

SymPy 还知道如何计算一个表达式的泰勒级数。使用:series(expr, var)

>>>

>>> sym.series(sym.cos(x), x) 2 4 x x / 6\ 1 - -- + -- + O\x / 2 24 >>> sym.series(1/sym.cos(x), x) 2 4 x 5*x / 6\ 1 + -- + ---- + O\x / 2 24 

3.2.3.4.积分

SymPy 支持通过integrate()工具对先验基本函数和特殊函数进行不定和定积分,它使用强大的扩展 Risch-Norman 算法和一些启发式和模式匹配。

>>>

>>> sym.integrate(6 * x 5, x) 6 x >>> sym.integrate(sym.sin(x), x) -cos(x) >>> sym.integrate(sym.log(x), x) x*log(x) - x >>> sym.integrate(2 * x + sym.sinh(x), x) 2 x + cosh(x) 

特殊函数也很容易处理:

>>>

>>> sym.integrate(sym.exp(-x 2) * sym.erf(x), x) ____ 2 \/ pi *erf (x) -------------- 4 

可以计算定积分:

>>>

>>> sym.integrate(x3, (x, -1, 1)) 0 >>> sym.integrate(sym.sin(x), (x, 0, sym.pi / 2)) 1 >>> sym.integrate(sym.cos(x), (x, -sym.pi / 2, sym.pi / 2)) 2 

也支持不定积分:

>>>

>>> sym.integrate(sym.exp(-x), (x, 0, sym.oo)) 1 >>> sym.integrate(sym.exp(-x 2), (x, -sym.oo, sym.oo)) ____ \/ pi 

3.2.4. 方程求解

SymPy 能够解决代数方程,在一个和多个变量中使用solveset()

>>>

>>> sym.solveset(x 4 - 1, x) {-1, 1, -I, I} 

它将一个应该等于 0 的表达式作为第一个参数。它还(有限)支持超越方程:

>>>

>>> sym.solveset(sym.exp(x) + 1, x) {I*(2*n*pi + pi) | n in Integers} 

线性方程组

Sympy 能够求解大部分多项式方程,并且还能够求解关于多个变量的多个方程,将元组作为第二个参数。使用以下solve()命令:

>>>

>>> solution = sym.solve((x + 5 * y - 2, -3 * x + 6 * y - 15), (x, y)) >>> solution[x], solution[y] 

(-3, 1)

多项式方程的另一种选择是 factor。factor返回分解为不可约项的多项式,并且能够计算各个域的分解:

>>>

>>> f = x 4 - 3 * x 2 + 1 >>> sym.factor(f) / 2 \ / 2 \ \x - x - 1/*\x + x - 1/ >>> sym.factor(f, modulus=5) 2 2 (x - 2) *(x + 2) 

SymPy 还能够求解布尔方程,即确定某个布尔表达式是否可满足。为此,我们使用可满足的函数:

>>>

>>> sym.satisfiable(x & y) {x: True, y: True} 

这告诉我们,无论何时都是 True并且两者都是 True。如果一个表达式不能为真,即没有任何参数值可以使表达式为真,它将返回 False:(x & y)xy

>>>

>>> sym.satisfiable(x & ~x) False 

3.2.5. 线性代数

3.2.5.1. 矩阵

矩阵是作为 Matrix 类的实例创建的:

>>>

>>> sym.Matrix([[1, 0], [0, 1]]) [1 0] [ ] [0 1] 

与 NumPy 数组不同,还可以将 Symbols 放入其中:

>>>

>>> x, y = sym.symbols('x, y') >>> A = sym.Matrix([[1, x], [y, 1]]) >>> A [1 x] [ ] [y 1] >>> A2 [x*y + 1 2*x ] [ ] [ 2*y x*y + 1] 

3.2.5.2. 微分方程

SymPy 能够求解(一些)普通微分问题。要求解微分方程,请使用 dsolve。首先,通过将 cls=Function 传递给 symbols 函数来创建一个未定义的函数:

>>>

>>> f, g = sym.symbols('f g', cls=sym.Function) 

f 和 g 现在是未定义的函数。我们可以调用 f(x),它将代表一个未知函数:

>>>

>>> f(x) f(x) >>> f(x).diff(x, x) + f(x) 2 d f(x) + ---(f(x)) 2 dx >>> sym.dsolve(f(x).diff(x, x) + f(x), f(x)) f(x) = C1*sin(x) + C2*cos(x) 

可以为此函数提供关键字参数,以帮助找到可能的最佳解析系统。例如,如果你知道它是一个可分离方程,你可以使用关键字hint=’separable’ 强制 dsolve 将它解析为一个可分离方程:

>>>

>>> sym.dsolve(sym.sin(x) * sym.cos(f(x)) + sym.cos(x) * sym.sin(f(x)) * f(x).diff(x), f(x), hint='separable') / C1 \ / C1 \ [f(x) = - acos|------| + 2*pi, f(x) = acos|------|] \cos(x)/ \cos(x)/ 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/162932.html

(0)
上一篇 2024-12-17 12:00
下一篇 2024-12-17 12:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信