SymPy 库使用小记

Life is short,you need Python.

—— Guido van Rossum

你离计算机代数只差一行 Python 代码:

1
from sympy import *

微积分

求导

\(\displaystyle\frac{d}{d x} 2^{\operatorname{arctan}{\frac{1 - x^{2}}{1 + x^{2}}}}\) 这个来说

1
2
3
4
5
6
7
8
# 初始化一下打印
init_printing()
# 声明一下符号
x = symbols('x')
# 定义一个式子
expr = Derivative(2**atan((1-x**2)/(1+x**2)), x)
# 让 sympy 来求解
print(expr.doit())

然后我们就得到了

\[- 2^{\operatorname{arctan}{\frac{1 - x^{2}}{1 + x^{2}}}}\ln2\cdot\frac{2x}{x^{4} + 1}\]

\(\displaystyle e^{x^{2} + y^{2}} \sin{\left(x y \right)}\) 这个的偏导也可以:

1
2
3
4
5
6
init_printing()
x, y = symbols('x y')
expr = E**(x**2+y**2)*sin(x*y)
# 分别对 x、对 y 和先对 x 再对 y 求偏导
print(diff(expr, x), diff(expr, y))
print(diff(expr, x, y))

然后就分别得到了 \[\begin{array}{c}2 x e^{x^{2} + y^{2}} \sin{\left(x y \right)} + y e^{x^{2} + y^{2}} \cos{\left(x y \right)}\\ e^{x^{2} + y^{2}} \cos{\left(x y \right)} + 2 y e^{x^{2} + y^{2}} \sin{\left(x y \right)}\\ \left(3 x y \sin{\left(x y \right)} + \left(2 x^{2} + 2 y^{2} + 1\right) \cos{\left(x y \right)}\right) e^{x^{2} + y^{2}}\end{array}\]

完美!

积分

1
2
3
4
# 对象形式
Integral(expr, (var, lower, upper))
# 函数形式
integrate(expr, (var, lower, upper))

比如说这个不定积分 \(\displaystyle\int \frac{\ln{\frac{1+x}{1-x}}}{1 - x^{2}}\, dx\)

1
2
integ = Integral(1/(1-x**2)*log((1+x)/(1-x)), x)
print(integ.doit())

最后输出(可以注意到默认都是不带任意常数 \(C\) 的): \[\frac{1}{4}{\left(\ln{\frac{x + 1}{1 - x}}\right)}^2\]

这个不定积分 \(\displaystyle\int_{0}^{1} \frac{x^{3}}{\sqrt{x^{2} + 1}}\, dx\) 则是传入一个三元组:

1
integrate((x**3)/sqrt(x**2+1), (x, 0, 1))

极限

SymPy 使用 oo 来表示 \(\infty\)(没错就是两个 o),类似于 \(\infty - \infty\)\(\dfrac\infty\infty\) 这种则返回 nan (不是一个数,Not a Number)

Talk is cheap, show me the code.

—— Linus Torvalds

求重要极限 \(\lim\limits_{x\to\infty}{\left(1+\dfrac{1}{x}\right)}^{x}\)

1
2
3
4
# 对象形式
Limit((1+1/x)**x, x, oo)
# 函数形式
limit((1+1/x)**x, x, oo)

求单侧极限 \(\lim\limits_{x \to 0^+} \dfrac{1}{x}\)\(\lim\limits_{x \to 0^-} \dfrac{1}{x}\)

1
2
limit(1/x, x, 0, '+')
limit(1/x, x, 0, '-')

打印

自动选择打印方式:

1
init_printing()

不同打印方式对应的代码:

打印方式 代码
ASCII 字符 pprint(expr, use_unicode = False)
Unicode 字符 pprint(expr, use_unicode = True)
\(\LaTeX\) print(latex(expr))
MathML from sympy.printing.mathml import print_mathml
print_mathml(expr)

化简

函数 功能
simplify(expr) 最简单的化简函数,但是有可能会很慢
expand(poly) 用来展开多项式
factor(poly) 因式分解多项式
collect(expr, factor) expr 表达式中提出 factor
cancel(rational) 分式化简并展开
apart(rational) 分式作部分分式分解
trigsimp(expr) 化简三角函数表达式
expand_trig(expr) 展开三角函数表达式
powsimp(expr) 化简表达式
powdenest(expr) \({x}^{a^b}\) 化简成 \(x^{ab}\)
expand_log(expr) 展开对数表达式
logcombine(expr) \(\log{x}+\log{y}\) 合并成 \(\log{xy}\)
combsimp(expr) 组合数化简

SymPy 库使用小记
https://devexzh.github.io/2023/Manuscript_Of_Using_SymPy_Module/
作者
Ryker Zhu
发布于
2023年8月14日
许可协议