SymPy 符号计算笔记

2 minute read

Published:

模块导入和基础设置

# 导入 Sympy
from sympy import *

# 启用终端美观打印
init_printing(use_unicode=True)

# 设置递归深度限制
sympy.core.evaluate(False)

符号与结构定义

符号定义

# 定义单个符号
x = symbols('x')

# 定义多个符号
y, z = symbols('y z')

# 定义带属性的符号(实数)
a = symbols('a', real=True)

# 定义希腊字母符号
theta = symbols('theta', cls=Symbol)

函数定义

# 定义单元函数
f = Function('f')(x)

# 定义多元函数
u = Function('u')(x, y)

# 定义 Lambda 函数
g = Lambda(x, x**2 + sin(x))

矩阵与张量

# 定义矩阵
M = Matrix([[1, x], [y, 2]])

# 定义张量(需要索引系统)
from sympy.tensor import IndexedBase, Idx
T = IndexedBase('T')
i, j = symbols('i j', cls=Idx)
tensor_expr = T[i, j]

特殊符号与运算符

特殊函数

# 伽马函数
gamma(x)

# 贝塞尔函数
besselj(0, x)

# 误差函数
erf(x)

特殊运算符

# 微分算子
Dx = Differential(x)

# 拉普拉斯算子
from sympy.vector import Laplacian

微积分运算

微分计算

# 一阶导数
diff(cos(x**2), x)  # -2*x*sin(x**2)

# 偏导数
diff(x**2 * y**3, x, y)  # 6*x*y**2

# 高阶导数
diff(exp(x), x, 3)  # exp(x)

积分计算

# 不定积分
integrate(x*sin(x), x)  # -x*cos(x) + sin(x)

# 定积分
integrate(x**2, (x, 0, 1))  # 1/3

# 多重积分
integrate(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))  # π

极限与级数

# 极限计算
limit(sin(x)/x, x, 0)  # 1

# Taylor展开
series(exp(x), x, 0, 4)  # 1 + x + x**2/2 + x**3/6 + O(x**4)

方程求解

代数方程

# 单变量方程
solve(x**2 - 3*x + 2, x)  # [1, 2]

# 多变量方程组
solve([x + y - 3, x - y - 1], [x, y])  # {x: 2, y: 1}

微分方程

# 常微分方程
eq = Eq(f.diff(x, x) + f, 0)
dsolve(eq)  # f(x) = C1*sin(x) + C2*cos(x)

矩阵与张量运算

矩阵操作

A = Matrix([[1, 2], [3, 4]])
B = Matrix([[x, 1], [y, 2]])

# 基本运算
A + B   # 矩阵加法
A * B   # 矩阵乘法
A.T     # 转置矩阵
A.det() # 行列式计算
A.rank()# 矩阵秩
A.trace() # 迹
A.inv() # 逆矩阵

张量运算

# 张量缩并
from sympy.tensor import tensorcontraction
expr = T[i, j]*T[j, k]
contracted = tensorcontraction(expr, (1, 2))

表达式操作

化简与替换

# 三角函数化简
trigsimp(sin(x)**2 + cos(x)**2)  # 1

# 代数化简
simplify((x**2 - 1)/(x + 1))  # x - 1

# 带值计算
expr = x**2 + 2*x + 1
expr.subs(x, 2)  # 9

# 部分替换
expr.subs(x, y)  # y**2 + 2*y + 1

可视化与输出

函数绘图

from sympy.plotting import plot

# 2D绘图
p = plot(sin(x), cos(x), (x, -pi, pi), show=False)
p[0].line_color = 'r'
p.show()

# 3D绘图
from sympy.plotting import plot3d
plot3d(sin(x)*cos(y), (x, -5, 5), (y, -5, 5))

LaTeX 输出

print(latex(Integral(sqrt(x), x)))  # \int \sqrt{x}\, dx

杂项

# 禁用自动简化
with evaluate(False):
    expr = x + x + 1  # 保持为 Add(x, x, 1)