SymPy 的简单使用

SymPy 库简介

SymPy 是一个用于符号数学的 Python 库。

可以用来代替 Mathematica 和 Maple 等数学软件,同时可以结合 Python 其他库来拓展功能。

加载 SymPy

使用如下代码加载 SymPy 库:

1
2
import sympy as sp
sp.init_printing()

当然,你要先使用 pip 安装 sympy 库:

1
pip install sympy

注意:调用 init_printing() 可能会使代码执行时间过长甚至出现卡死的情况,可以不调用该函数。

四则运算

\[ 3 + 2 \]

1
3 + 2

\[ 3 - 2 \]

1
3 - 2

\[ 3 * 2 \]

1
3 * 2

\[ \frac{3}{2} \]

1
3 / 2

使用如下代码处理分数:

\[ \frac{3}{2} \]

1
sp.Rational(3, 2)

\[ \frac{3}{2} \]

1
sp.denom(sp.Rational(3, 2))

\[ \frac{3}{2} \]

1
sp.numer(sp.Rational(3, 2))

幂、阶乘

\[ 3^2 \]

1
3 ** 2

\[ 50! \]

1
sp.factorial(50)

\[ 50!! \]

1
sp.factorial2(50)

\[ \sqrt{50} \]

1
sp.sqrt(50)

常数

\[ \pi \]

1
sp.pi

\[ \mathrm{e} \]

1
sp.E

\[ \infty \]

1
sp.oo

复数

\[ \mathrm{i} \]

1
sp.I

\[ \overline{2 + 3\mathrm{i}} \]

1
sp.conjugate(2 + 3 * sp.I)

\[ \mathrm{Re}\left(2 + 3\mathrm{i}\right) \]

1
sp.re(2 + sp.I * 3)

\[ \mathrm{Im}\left(2 + 3\mathrm{i}\right) \]

1
sp.im(2 + sp.I * 3)

\[ \left|2 + 3\mathrm{i}\right| \]

1
sp.Abs(2 + sp.I * 3)

\[ \mathrm{Arg} \left(2 + 3\mathrm{i}\right) \]

1
sp.arg(2 + sp.I * 3)

变量

声明变量

1
2
3
4
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, r, s, t, u, v, w, x, y, z = sp.symbols('a b c d e f g h i j k l m n o p r s t u v w x y z')
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V, W, X, Y, Z = sp.symbols('A B C D E F G H I J K L M N O P R S T U V W X Y Z')
alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa, lamda, mu, nu, xi, omicron, pi, rho, sigma, tau, upsilon, phi, chi, psi, omega = sp.symbols('alpha beta gamma delta epsilon zeta eta theta iota kappa lamda mu nu xi omicron pi rho sigma tau upsilon phi chi psi omega')
Alpha, Beta, Gamma, Delta, Epsilon, Zeta, Eta, Theta, Iota, Kappa, Lamda, Mu, Nu, Xi, Omicron, Pi, Rho, Sigma, Tau, Upsilon, Phi, Chi, Psi, Omega = sp.symbols('Alpha Beta Gamma Delta Epsilon Zeta Eta Theta Iota Kappa Lamda Mu Nu Xi Omicron Pi Rho Sigma Tau Upsilon Phi Chi Psi Omega')

算术运算

\[ x+y+x-y \]

1
x + y + x - y

\[ \left(x+y\right)^2 \]

1
(x + y) ** 2

代数运算

质因数分解

\[ 10!=2^8 \cdot 3^4 \cdot 5^2 \cdot 7 \]

1
sp.factorint(sp.factorial(10))

因式分解

\[ x^2 -4x+3 = \left(x-3\right)\left(x-1\right) \]

1
sp.factor(x ** 2 - 4 * x + 3)

不可约多项式在整数上的因式分解:

\[ \left(1+x-x^2\right)\left(1-x-x^2\right)=\left(x^2-x-1\right)\left(x^2+x-1\right) \]

1
sp.factor((1 + x - x ** 2) * (1 - x - x ** 2))

分圆多项式的不可约因式分解(模 5):

1
sp.factor((1 + x - x ** 2) * (1 - x - x ** 2), modulus=5)

化简

\[ \frac{x+xy}{x}=y+1 \]

1
sp.simplify((x + x * y) / x)

\[ \frac{\sin x}{\cos x} = \tan x \]

1
sp.trigsimp(sp.sin(x) / sp.cos(x))

\[ \sin^2x + \cos^2x = 1 \]

1
sp.trigsimp((sp.sin(a)) ** 2 + (sp.cos(a)) ** 2)

\[ \sinh^2a+\cosh^2a = \cosh 2a \]

1
sp.trigsimp((sp.sinh(a)) ** 2 + (sp.cosh(a)) ** 2)

部分分式分解

\[ \frac{1}{x^2-4x+3} = \frac{1}{2\left(x-3\right)} - \frac{1}{2\left(x-1\right)} \]

1
sp.apart(1 / (x ** 2 - 4 * x + 3))

\[ \frac{1}{x^6-1}=\frac{x-2}{6\left(x^2-x+1\right)}-\frac{x+2}{6\left(x^2+x+1\right)}-\frac{1}{6\left(x+1\right)}+\frac{1}{6\left(x-1\right)} \]

1
sp.apart(1 / (x ** 6 - 1))

展开

\[ \left(x+y\right)^6=x^6+6x^5y+15x^4y^2+20x^3y^3+15x^2y^4+6xy^5+y^6 \]

1
sp.expand((x + y) ** 6)

\[ \tan\left(a+b\right)=\frac{\tan a+\tan b}{1-\tan a\tan b} \]

1
sp.simplify(sp.expand(sp.tan(a + b), trig=True))

pink fas fa-car-crash simple

注意:trig=True 表示展开三角函数。

通分

\[ \frac{2x-2}{\left(x-1\right)^2\left(x-2\right)}=\frac{2}{\left(x-2\right)\left(x-1\right)} \]

1
sp.simplify((2 * x - 2) / ((x - 1) ** 2 * (x - 2)))

\[ \frac{1}{\left(x-1\right)^2}+\frac{1}{\left(x-1\right)\left(x-2\right)}=\frac{2x-3}{\left(x-2\right)\left(x-1\right)^2} \]

1
sp.simplify(1 / (x - 1) ** 2 + 1 / ((x - 1) * (x - 2)))

通分展开

\[ \frac{2x-2}{\left(x-1\right)^2\left(x-2\right)}=\frac{2}{x^2-3x+2} \]

1
sp.cancel((2 * x - 2) / ((x - 1) ** 2 * (x - 2)))

\[ \frac{1}{\left(x-1\right)^2}+\frac{1}{\left(x-1\right)\left(x-2\right)}=\frac{2x-3}{x^3-4x^2+5x-2} \]

1
sp.cancel(1 / (x - 1) ** 2 + 1 / ((x - 1) * (x - 2)))

系数

\[ \left(x+y\right)^6 \]

\(x^3\) 的系数:

1
sp.expand((x + y) ** 6).coeff(x, 3)

代入

\[ a x^2+b x+c\left.\right|_{x=3} \]

1
(a * x ** 2 + b * x + c).subs(x, 3)

\[ ax^2+bx+c \]

where:

\[ x=\frac{-b+\sqrt{-4ac+b^2}}{2a} \]

1
sp.expand((a * x ** 2 + b * x + c).subs(x, (-b + sp.sqrt(-4 * a * c + b ** 2)) / (2 * a)))

求和

\[ \sum_{x=1}^{10}x \]

1
sp.summation(x, (x, 1, 10))

\[ \sum_{x=1}^{a}x \]

1
sp.factor(sp.summation(x, (x, 1, a)))

\[ \sum_{x=1}^{a}x^3 \]

1
sp.factor(sp.summation(x ** 3, (x, 1, a)))

求积

\[ \prod_{x=1}^{10}x \]

1
sp.product(x, (x, 1, 10))

命题逻辑

真伪判断

\[ 0=\sqrt{2}-2^{\frac{1}{2}} \text { ? } \]

1
0 == sp.sqrt(2) - 2 ** (sp.Rational(1, 2))

输出结果:

1
True

\[ 0=\sqrt{2}-2^{\frac{1}{3}} \text { ? } \]

1
0 == sp.sqrt(2) - 2 ** (sp.Rational(1, 3))

输出结果:

1
False

\[ 10!=\prod_{x=1}^{10}x \text { ? } \]

1
sp.factorial(10) == sp.product(x, (x, 1, 10))

输出结果:

1
True

\[ 50!=50!!\times 49!!\text { ? } \]

1
sp.factorial(10) == sp.product(x, (x, 1, 10))

输出结果:

1
True

对于公式的处理要小心,例如对于如下判断:

\[ x^2-2x+1=\left(x-1\right)^2 \text {?} \]

结果应该为 True,但如果使用如下代码的话:

1
x ** 2 - 2 * x + 1 == (x - 1) ** 2

其结果为 False,应该显示的将公式进行展开,然后再进行判断:

1
x ** 2 - 2 * x + 1 == sp.expand((x - 1) ** 2)

这样就可以得到我们想要的结果。

逻辑运算

\[ x \wedge y=\text { True ? } \]

1
sp.satisfiable(x & y)
1
{x: True, y: True}

\[ x \wedge \neg x=\text { True ? } \]

1
sp.satisfiable(x & ~x)
1
False

数学分析

函数定义

\[ f\left(x\right) =\frac{\log\left(x+1\right)}{x} \]

1
2
3
4
def f(x):
return sp.log(1 + x) / x

f(x)

极限

\[ \lim _{x \rightarrow 0} \frac{\sin (x)}{x}=1 \]

1
sp.limit(sp.sin(x) / x, x, 0)

\[ \lim _{x \rightarrow \infty} x=\infty \]

1
sp.limit(x, x, sp.oo)

\[ \lim _{x \rightarrow \infty} \frac{1}{x}=0 \]

1
sp.limit(1 / x, x, sp.oo)

\[ \lim _{x \rightarrow 0} x^x=1 \]

1
sp.limit(x ** x, x, 0)

微分

\[ \frac{\partial}{\partial x}(x+y)^3=3(x+y)^2 \]

1
sp.diff((x + y) ** 3, x)

\[ \frac{\partial^2}{\partial y^2}(x+y)^3=6(x+y) \]

1
sp.diff((x + y) ** 3, y, 2)

\[ \frac{\mathrm{d}}{\mathrm{d} x} \tan (x)=\tan ^2(x)+1 \]

1
sp.diff(sp.tan(x), x)

\[ \lim _{y \rightarrow 0} \frac{\tan (x+y)-\tan (x)}{y}=\tan ^2(x)+1 \]

1
sp.limit((sp.tan(x + y) - sp.tan(x)) / y, y, 0)

\[ \frac{\mathrm{d}}{\mathrm{d} x} f(x)=\frac{\mathrm{d}}{\mathrm{d} x} \frac{\log (x+1)}{x}=\frac{1}{x(x+1)}-\frac{\log (x+1)}{x^2} \]

1
sp.diff(f(x), x, 1)

级数展开

\[ \frac{1}{\cos (x)}=1+\frac{x^2}{2}+\frac{5 x^4}{24}+\Omicron\left(x^6\right) \]

1
sp.series(sp.cos(x), x)

\[ f(x)=\frac{\log (x+1)}{x}=1-\frac{x}{2}+\frac{x^2}{3}-\frac{x^3}{4}+\frac{x^4}{5}-\frac{x^5}{6}+\frac{x^6}{7}+\Omicron\left(x^7\right) \]

1
sp.series(f(x), x, 0, 7)

积分

\[ \int\left(x+y\right)\mathrm{d}x = \frac{x^2}{2}+xy \]

1
sp.integrate(x + y, x)

\[ \int(2 x+\sinh x) \mathrm{d} x=x^2+\cosh (x) \]

1
sp.integrate(2 * x + sp.sinh(x), x)

\[ \int_0^6(x+y)^3 \mathrm{d} x=6 y^3+54 y^2+216 y+324 \]

1
sp.integrate((x + y) ** 3, (x, 0, 6))

\[ \int_{-\infty}^{\infty} \mathrm{e}^{-x^2} \mathrm{d} x=\sqrt{\pi} \]

1
sp.integrate(sp.exp(-x ** 2), (x, -sp.oo, sp.oo))

\[ \int \mathrm{e}^{-x^2} \operatorname{erf}(x) \mathrm{d} x=\frac{\sqrt{x} \operatorname{erf}^2(x)}{4} \]

1
sp.integrate(sp.exp(-x ** 2) * sp.erf(x), x)

\[ \int f(x) \mathrm{d} x=\int \frac{\log (x+1)}{x} \mathrm{d} x=-\operatorname{Li}_2\left(x \mathrm{e}^{i \pi}\right) \]

1
sp.integrate(f(x), x)

代数方程

求解

解方程:

\[ x^4-1=0 \]

1
sp.solve(x ** 4 - 1, x)

解方程组:

\[ \begin{align*} x+5y-2=0\\ -3x+6y-15=0 \end{align*} \]

1
sp.solve([x + 5 * y - 2, -3 * x + 6 * y - 15], [x, y])

\[ \mathrm{e}^x + 1= 0 \]

1
sp.solve(sp.exp(x) + 1, x)

\[ ax^2+bx+c=0 \]

1
sp.solve(a * x ** 2 + b * x + c, x)

等式

解方程 \[ x+1=\frac{x+1}{x^2+x-2} \]

1
2
equation = sp.Eq(x + 1, (x + 1) / (x ** 2 + x - 2))
sp.solve(equation, x)

得到等式右边:

1
equation.rhs

得到等式左边:

1
equation.lhs

线性代数

矩阵

\[ \begin{bmatrix} 1 & x \\ y & 1 \end{bmatrix} \]

1
sp.Matrix([[1, x], [y, 1]])

\[ \begin{bmatrix} 1 & x \\ y & 1 \end{bmatrix}^2= \begin{bmatrix} xy+1 & 2x \\ 2y & xy+1 \end{bmatrix} \]

1
sp.Matrix([[1, x], [y, 1]]) ** 2

阶梯型

\[ \begin{bmatrix} 1 & 0 & 1 & 3 \\ 2 & 3 & 4 & 7 \\ -1 & -3 & -3 & -4 \end{bmatrix} \]

的阶梯型:

1
sp.Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]]).rref()

零空间

\[ \begin{bmatrix} 1 & 2 & 3 & 0 & 0\\ 4 & 10 & 0 & 0 & 1 \end{bmatrix} \]

的零空间:

1
sp.Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]]).nullspace()

列空间

\[ \begin{bmatrix} 1 & 1 & 2 \\ 2 & 1 & 3 \\ 3 & 1 & 4 \end{bmatrix} \]

的列空间:

1
sp.Matrix([[1, 1, 2], [2, 1, 3], [3, 1, 4]]).columnspace()

特征方程

\[ \begin{bmatrix} 3 & -2 & 4 & -2 \\ 5 & 3 & -3 & -2 \\ 5 & -2 & 2 & -2 \\ 5 & -2 & -3 & 3 \end{bmatrix} \]

的特征方程:

1
sp.factor(sp.Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]).charpoly())

特征值和特征向量

\[ \begin{bmatrix} 3 & -2 & 4 & -2 \\ 5 & 3 & -3 & -2 \\ 5 & -2 & 2 & -2 \\ 5 & -2 & -3 & 3 \end{bmatrix} \]

的特征值和特征向量:

1
sp.Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]).eigenvects()

对角化

\[ \begin{bmatrix} 3 & -2 & 4 & -2 \\ 5 & 3 & -3 & -2 \\ 5 & -2 & 2 & -2 \\ 5 & -2 & -3 & 3 \end{bmatrix} \]

对其对角化:

1
P, D = sp.Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]).diagonalize()

微分方程

定义未知函数

1
f = sp.symbols('f', cls=sp.Function)

求解微分方程

\[ \frac{\mathrm{d}^2}{\mathrm{d}x^2}f(x)+f(x)=0 \]

1
sp.dsolve(f(x).diff(x, x) + f(x), f(x))

\[ x \frac{\mathrm{d}}{\mathrm{d} x} f(x)+f(x)-f^2(x)=0 \]

1
sp.dsolve(x * f(x).diff(x) + f(x) - f(x) ** 2)

\[ x \frac{\mathrm{d}}{\mathrm{d} x} f(x)+f(x)-f^2(x)=0 \]

这是一个伯努利类型的微分方程,我们可以暗示它:

1
sp.dsolve(x * f(x).diff(x) + f(x) - f(x) ** 2, f(x), hint='Bernoulli')

输出 LaTex

1
2
3
equation = sp.Eq(a * x ** 2 + b * x + c, 0)
solution = sp.solve(equation, x)
print(sp.latex(solution))

小结

尝试使用 SymPy 求解下面的积分吧:

\[ \int_0^1\left(x^2+\frac{x}{\sqrt{1+x^2}}\right)\left(1+\frac{x}{\left(1+x^2\right) \sqrt{1+x^2}}\right) \mathrm{d} x \]

参考答案:

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

参考资料