SymPy线性代数与矩阵运算
【免费下载链接】sympy 一个用纯Python语言编写的计算机代数系统。 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy
本文详细介绍了SymPy符号计算库在线性代数和矩阵运算方面的强大功能。文章首先深入探讨了SymPy符号矩阵系统的设计与实现,包括其核心架构、MatrixExpr基类设计、MatrixSymbol实现细节以及矩阵运算表达式系统。接着系统讲解了行列式、特征值与特征向量的符号计算方法,包括各种算法选择和性能优化策略。然后全面阐述了矩阵分解技术(LU、QR、Cholesky、LDL分解)及其在线性方程组求解中的应用。最后重点介绍了SymPy的张量运算与多维数组处理能力,包括张量积、缩并、对角化等高级操作及其在物理和工程领域的实际应用。
符号矩阵系统设计与实现
SymPy的符号矩阵系统是其线性代数模块的核心组成部分,它提供了一个强大的框架来处理抽象的矩阵表达式。与传统的数值矩阵不同,符号矩阵允许用户使用符号变量来表示矩阵元素,从而能够进行符号计算、代数推导和理论证明。
核心架构设计
SymPy的符号矩阵系统建立在面向对象的设计理念之上,采用了层次化的类结构:
MatrixExpr基类设计
MatrixExpr是所有矩阵表达式的抽象基类,它定义了符号矩阵系统的基本接口和行为模式:
class MatrixExpr(Expr):
"""Superclass for Matrix Expressions
MatrixExprs represent abstract matrices, linear transformations
represented within a particular basis.
"""
is_Matrix = True
is_MatrixExpr = True
is_commutative = False
is_number = False
@property
def shape(self):
raise NotImplementedError
def _entry(self, i, j, **kwargs):
raise NotImplementedError
基类提供了矩阵操作的标准接口,包括形状查询、元素访问、转置、逆矩阵、行列式等基本操作。所有具体的矩阵表达式类都必须实现这些核心方法。
MatrixSymbol实现细节
MatrixSymbol是符号矩阵系统的基础构建块,它代表一个具有符号名称和特定维度的矩阵:
class MatrixSymbol(MatrixExpr):
"""Symbolic representation of a Matrix object
Creates a SymPy Symbol to represent a Matrix. This matrix has a shape
and can be included in Matrix Expressions.
"""
is_symbol = True
_diff_wrt = True
def __new__(cls, name, n, m):
n, m = _sympify(n), _sympify(m)
cls._check_dim(m)
cls._check_dim(n)
# ... 参数验证和对象创建逻辑
@property
def shape(self):
return self.args[1], self.args[2]
def _entry(self, i, j, **kwargs):
return MatrixElement(self, i, j)
MatrixSymbol的关键特性包括:
- 支持符号维度(如
n,m等符号变量) - 严格的维度验证机制
- 延迟求值的设计理念
- 与SymPy符号系统的深度集成
矩阵运算表达式
符号矩阵系统支持丰富的矩阵运算表达式,包括加法、乘法、幂运算等:
矩阵加法 (MatAdd)
class MatAdd(MatrixExpr, Add):
"""A Sum of Matrix Expressions"""
identity = GenericZeroMatrix()
def _entry(self, i, j, **kwargs):
return Add(*[arg._entry(i, j, **kwargs) for arg in self.args])
矩阵加法表达式维护一个操作数列表,并在求值时对每个对应位置的元素进行符号加法。
矩阵乘法 (MatMul)
class MatMul(MatrixExpr, Mul):
"""A product of matrix expressions"""
identity = GenericIdentity()
def _entry(self, i, j, expand=True, **kwargs):
# 实现矩阵乘法的元素级计算
from sympy.concrete.summations import Sum
# ... 复杂的求和表达式生成逻辑
矩阵乘法表达式的实现涉及复杂的索引处理和求和表达式生成,支持符号维度的正确推导。
表达式化简与求值系统
符号矩阵系统包含一个强大的化简和求值系统,能够处理各种矩阵表达式:
维度推导与验证
符号矩阵系统实现了智能的维度推导机制:
def validate_matmul_integer(*matrices):
"""验证矩阵乘法的维度兼容性"""
for i in range(len(matrices)-1):
if matrices[i].cols != matrices[i+1].rows:
raise ShapeError("矩阵维度不兼容")
系统能够在符号层面验证矩阵运算的维度兼容性,即使维度本身是符号变量。
符号索引与元素访问
符号矩阵支持灵活的索引机制:
# 创建符号矩阵
A = MatrixSymbol('A', n, m)
B = MatrixSymbol('B', m, p)
# 访问具体元素
element = A[0, 1] # 返回MatrixElement对象
# 符号索引
i, j = symbols('i j', integer=True)
symbolic_element = A[i, j] # 支持符号索引
求导与微分支持
符号矩阵系统提供了矩阵微分的完整支持:
def _eval_derivative_matrix_lines(self, x):
"""计算矩阵对矩阵的导数"""
# 实现复杂的矩阵导数计算规则
# 支持链式法则和转置规则
性能优化策略
系统采用了多种性能优化策略:
- 延迟求值:保持表达式符号形式直到显式调用
doit() - 表达式缓存:重用已计算的子表达式
- 模式匹配:识别常见模式进行特殊处理
- 符号简化:应用代数恒等式进行化简
扩展性与自定义
符号矩阵系统设计具有良好的扩展性,用户可以定义自定义的矩阵表达式类:
class CustomMatrixExpr(MatrixExpr):
def __new__(cls, *args):
# 自定义创建逻辑
pass
@property
def shape(self):
# 自定义形状推导
pass
def _entry(self, i, j):
# 自定义元素访问逻辑
pass
这种设计使得SymPy的符号矩阵系统不仅功能强大,而且具有很好的灵活性和可扩展性,能够满足各种复杂的符号线性代数计算需求。
行列式、特征值与特征向量计算
SymPy提供了强大的符号计算能力来处理线性代数中的核心概念,包括行列式计算、特征值和特征向量的求解。这些功能使得符号矩阵的代数运算变得简单而精确。
行列式计算
行列式是矩阵的一个重要数值特征,用于判断矩阵是否可逆、计算矩阵的秩等。SymPy提供了多种算法来计算行列式:
基本行列式计算
from sympy import Matrix, symbols
# 创建一个3x3符号矩阵
a, b, c, d, e, f, g, h, i = symbols('a:i')
M = Matrix([[a, b, c], [d, e, f], [g, h, i]])
# 计算行列式
det_M = M.det()
print(f"矩阵M的行列式: {det_M}")
# 输出: a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g
数值矩阵的行列式
from sympy import Matrix
# 数值矩阵示例
M = Matrix([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
det_value = M.det()
print(f"数值矩阵的行列式: {det_value}")
# 输出: 0 (因为矩阵是奇异的)
使用不同算法计算行列式
SymPy支持多种行列式计算算法,可以通过method参数指定:
# 使用Bareiss算法
det_bareiss = M.det(method='bareiss')
# 使用Berkowitz算法
det_berkowitz = M.det(method='berkowitz')
# 使用LU分解算法
det_lu = M.det(method='lu')
# 使用Laplace展开
det_laplace = M.det(method='laplace')
特征多项式
特征多项式是求解特征值的基础,其根即为矩阵的特征值:
from sympy import symbols
# 计算特征多项式
lamda = symbols('lamda')
char_poly = M.charpoly(lamda)
print(f"特征多项式: {char_poly}")
# 对于3x3矩阵,输出: PurePoly(lamda**3 - (a + e + i)*lamda**2 + ...)
特征值计算
特征值是线性变换的重要不变量,SymPy可以精确计算符号矩阵的特征值:
基本特征值计算
from sympy import Matrix
# 创建一个矩阵
M = Matrix([
[3, -2, 4, -2],
[5, 3, -3, -2],
[5, -2, 2, -2],
[5, -2, -3, 3]
])
# 计算特征值(返回字典形式:特征值->代数重数)
eigenvals_dict = M.eigenvals()
print(f"特征值及其重数: {eigenvals_dict}")
# 输出: {-2: 1, 3: 1, 5: 2}
# 计算特征值(返回列表形式)
eigenvals_list = M.eigenvals(multiple=True)
print(f"特征值列表: {eigenvals_list}")
# 输出: [-2, 3, 5, 5]
符号矩阵的特征值
from sympy import Matrix, symbols
x, y = symbols('x y')
M_sym = Matrix([
[x, 1],
[1, y]
])
# 计算符号矩阵的特征值
eigenvals_sym = M_sym.eigenvals()
print(f"符号矩阵特征值: {eigenvals_sym}")
特征向量计算
特征向量描述了线性变换的不变方向,SymPy可以精确计算特征向量:
基本特征向量计算
# 计算特征值和特征向量
eigenvects = M.eigenvects()
print("特征向量信息:")
for eigenval, multiplicity, eigenvectors in eigenvects:
print(f"特征值: {eigenval}, 重数: {multiplicity}")
for i, vec in enumerate(eigenvectors):
print(f" 特征向量 {i+1}: {vec.T}")
验证特征向量
# 验证特征向量的正确性
for eigenval, multiplicity, eigenvectors in eigenvects:
for vec in eigenvectors:
# 检查 M*v = λ*v 是否成立
lhs = M * vec
rhs = eigenval * vec
print(f"验证: M*v = {lhs}")
print(f" λ*v = {rhs}")
print(f" 是否相等: {lhs.equals(rhs)}")
对角化
当矩阵可对角化时,SymPy可以找到相似变换矩阵:
# 矩阵对角化
P, D = M.diagonalize()
print(f"相似变换矩阵 P: {P}")
print(f"对角矩阵 D: {D}")
# 验证: M = P * D * P^{-1}
M_reconstructed = P * D * P.inv()
print(f"重构的矩阵: {M_reconstructed}")
print(f"是否相等: {M.equals(M_reconstructed)}")
特殊矩阵的特征值特性
对称矩阵
from sympy import Matrix, symbols
# 创建对称矩阵
a, b, c = symbols('a b c')
M_symmetric = Matrix([
[a, b],
[b, c]
])
# 对称矩阵的特征值都是实数
eigenvals_symm = M_symmetric.eigenvals()
print(f"对称矩阵特征值: {eigenvals_symm}")
对角矩阵
# 对角矩阵的特征值就是对角线元素
M_diag = Matrix.diag(1, 2, 3, 4)
eigenvals_diag = M_diag.eigenvals()
print(f"对角矩阵特征值: {eigenvals_diag}")
# 输出: {1: 1, 2: 1, 3: 1, 4: 1}
计算流程示意图
性能考虑和算法选择
对于大型符号矩阵,特征值计算可能非常耗时。SymPy提供了多种优化策略:
- 使用
charpoly代替eigenvals:如果只需要特征多项式而不需要具体特征值 - 设置
simplify=False:避免不必要的化简操作 - 使用数值方法:对于数值矩阵,可以使用数值近似方法
# 性能优化示例
eigenvals_fast = M.eigenvals(simplify=False)
# 数值近似
M_num = M.evalf()
eigenvals_approx = M_num.eigenvals()
应用实例
物理系统分析
from sympy import Matrix, symbols, sqrt
# 简谐振子系统
m, k = symbols('m k', positive=True)
# 动力学矩阵
K = Matrix([
[2*k, -k],
[-k, 2*k]
])
M_mass = Matrix([
[m, 0],
[0, m]
])
# 求解特征值问题: K * x = ω² * M * x
eigenvals = (M_mass.inv() * K).eigenvals()
frequencies = [sqrt(lamda) for lamda in eigenvals.keys()]
print(f"系统固有频率: {frequencies}")
图像处理中的特征脸
# 伪代码: 特征脸计算
def compute_eigenfaces(data_matrix):
# 中心化数据
mean_face = data_matrix.mean(axis=1)
centered_data = data_matrix - mean_face
# 计算协方差矩阵的特征向量
covariance = centered_data * centered_data.T
eigenvals, eigenvects = covariance.eigenvects()
return eigenvals, eigenvects, mean_face
SymPy的行列式、特征值和特征向量计算功能为符号线性代数提供了强大的工具,特别适用于需要精确符号结果的数学推导、物理建模和工程分析场景。通过合理的算法选择和性能优化,可以高效处理各种规模的矩阵运算问题。
矩阵分解与线性方程组求解
SymPy提供了强大的矩阵分解功能,包括LU分解、QR分解、Cholesky分解和LDL分解等。这些分解方法不仅有助于理解矩阵的结构特性,还能高效地解决线性方程组问题。
LU分解及其应用
LU分解将矩阵A分解为下三角矩阵L和上三角矩阵U的乘积,即A = LU。SymPy中的LU分解实现支持部分主元选取,确保数值稳定性。
from sympy import Matrix
# 创建示例矩阵
A = Matrix([[4, 3], [6, 3]])
L, U, perm = A.LUdecomposition()
print("L矩阵:")
print(L)
print("U矩阵:")
print(U)
print("置换信息:", perm)
输出结果:
L矩阵:
Matrix([
[ 1, 0],
[3/2, 1]])
U矩阵:
Matrix([
[4, 3],
[0, -3/2]])
置换信息: []
LU分解的数学原理可以通过以下流程图表示:
QR分解与最小二乘问题
QR分解将矩阵分解为正交矩阵Q和上三角矩阵R的乘积,特别适用于解决超定方程组的最小二乘问题。
# QR分解示例
A = Matrix([[12, -51, 4], [6, 167, -68], [-4, 24, -41]])
Q, R = A.QRdecomposition()
print("Q矩阵:")
print(Q)
print("R矩阵:")
print(R)
print("验证正交性 Q^T * Q = I:")
print(Q.T * Q)
QR分解的算法基于Gram-Schmidt正交化过程:
Cholesky分解与正定矩阵
对于对称正定矩阵,Cholesky分解提供了一种高效的分解方法,将矩阵分解为下三角矩阵L及其转置的乘积。
# Cholesky分解示例
A = Matrix([[25, 15, -5], [15, 18, 0], [-5, 0, 11]])
L = A.cholesky()
print("Cholesky分解结果L:")
print(L)
print("验证 L * L.T = A:")
print(L * L.T == A)
LDL分解
LDL分解是Cholesky分解的变体,避免了平方根运算,特别适合符号计算:
# LDL分解示例
L, D = A.LDLdecomposition()
print("L矩阵:")
print(L)
print("D矩阵:")
print(D)
print("验证 L * D * L.T = A:")
print(L * D * L.T == A)
线性方程组求解方法比较
SymPy提供了多种基于矩阵分解的线性方程组求解方法:
| 方法 | 适用条件 | 时间复杂度 | 稳定性 |
|---|---|---|---|
| LUsolve | 方阵,非奇异 | O(n³) | 中等 |
| QRsolve | 任意矩阵 | O(mn²) | 高 |
| cholesky_solve | 对称正定 | O(n³/3) | 高 |
| LDLsolve | 对称矩阵 | O(n³/3) | 高 |
实际应用示例
使用LU分解求解方程组
# 构建线性方程组 Ax = b
A = Matrix([[2, 3, 1], [1, 1, 1], [1, 2, -1]])
b = Matrix([9, 6, 2])
# 使用LU分解求解
x = A.LUsolve(b)
print("解向量x:", x)
print("验证 Ax = b:", A * x == b)
使用QR分解解决最小二乘问题
# 超定方程组示例
A = Matrix([[1, 1], [1, 2], [1, 3], [1, 4]])
b = Matrix([6, 5, 7, 10])
# QR分解求解
x = A.QRsolve(b)
print("最小二乘解:", x)
print("残差范数:", (A*x - b).norm())
数值稳定性与算法选择
在选择矩阵分解方法时,需要考虑以下因素:
- 矩阵特性:对称正定矩阵优先选择Cholesky或LDL分解
- 数值稳定性:QR分解具有最好的数值稳定性
- 计算效率:Cholesky分解计算量最小
- 内存需求:稀疏矩阵应考虑特殊存储格式
SymPy的矩阵分解功能不仅支持精确符号计算,还能处理复杂的数学表达式,为科学计算和工程应用提供了强大的工具。通过合理选择分解方法,可以高效解决各类线性代数问题。
张量运算与多维数组处理
SymPy作为强大的符号计算库,提供了完整的张量运算和多维数组处理功能。在物理、工程和数学计算中,张量运算扮演着至关重要的角色,SymPy的张量模块让用户能够在符号层面进行复杂的多维数组操作。
多维数组基础
SymPy提供了多种多维数组类型,支持从简单的数值数组到复杂的符号张量运算。核心的数组类包括:
| 数组类型 | 可变性 | 存储方式 | 特点 |
|---|---|---|---|
MutableDenseNDimArray | 可变 | 密集存储 | 支持原地修改操作 |
ImmutableDenseNDimArray | 不可变 | 密集存储 | 线程安全,哈希可用 |
MutableSparseNDimArray | 可变 | 稀疏存储 | 适合大型稀疏数组 |
ImmutableSparseNDimArray | 不可变 | 稀疏存储 | 稀疏且不可变 |
创建多维数组的基本方法:
from sympy.tensor.array import Array, MutableDenseNDimArray
from sympy import symbols
# 从列表创建数组
A = Array([[1, 2, 3], [4, 5, 6]])
print(f"数组A: {A}")
print(f"形状: {A.shape}")
print(f"秩: {A.rank()}")
# 创建符号数组
x, y, z = symbols('x y z')
B = Array([[x, y], [z, x+y]])
print(f"符号数组B: {B}")
# 创建高维数组
C = MutableDenseNDimArray.zeros(2, 3, 4)
print(f"三维零数组形状: {C.shape}")
张量积运算
张量积(Tensor Product)是张量代数中的基本操作,SymPy提供了强大的张量积计算功能:
from sympy.tensor.array import tensorproduct
from sympy import Matrix
# 矩阵的张量积
m1 = Matrix([[1, 2], [3, 4]])
m2 = Matrix([[x, y], [z, w]])
tp = tensorproduct(m1, m2)
print(f"矩阵张量积:\n{tp}")
print(f"结果形状: {tp.shape}")
# 多维数组的张量积
A = Array([1, 2, 3])
B = Array([x, y])
result = tensorproduct(A, B)
print(f"向量张量积: {result}")
print(f"结果形状: {result.shape}")
张量积的数学表示: 对于两个张量 $A_{i_1i_2\ldots i_m}$ 和 $B_{j_1j_2\ldots j_n}$,它们的张量积为: $$(A \otimes B){i_1i_2\ldots i_mj_1j_2\ldots j_n} = A{i_1i_2\ldots i_m} \cdot B_{j_1j_2\ldots j_n}$$
张量缩并运算
张量缩并(Tensor Contraction)是张量分析中的重要操作,用于对指定指标进行求和:
from sympy.tensor.array import tensorcontraction
# 创建三维数组
arr = Array(range(24), (2, 3, 4))
print(f"原始数组形状: {arr.shape}")
# 对第0和第2个指标进行缩并
contracted = tensorcontraction(arr, (0, 2))
print(f"缩并后数组: {contracted}")
print(f"缩并后形状: {contracted.shape}")
# 矩阵迹运算(对角线和)
matrix = Array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
trace = tensorcontraction(matrix, (0, 1))
print(f"矩阵迹: {trace}")
缩并运算的流程可以用以下流程图表示:
张量对角化
张量对角化(Tensor Diagonalization)将多个指标合并为一个对角指标:
from sympy.tensor.array import tensordiagonal
# 三维数组的对角化
arr = Array(range(18), (3, 2, 3))
print(f"原始数组形状: {arr.shape}")
# 对第0和第2个指标进行对角化
diagonalized = tensordiagonal(arr, (0, 2))
print(f"对角化结果: {diagonalized}")
print(f"结果形状: {diagonalized.shape}")
# 验证对角化结果
for i in range(3):
print(f"对角线元素{i}: {arr[i, :, i]}")
数组表达式系统
SymPy提供了强大的数组表达式系统,支持符号化的数组操作:
from sympy.tensor.array.expressions import ArraySymbol, ArrayTensorProduct, ArrayContraction
# 定义符号数组
A = ArraySymbol("A", (3, 3))
B = ArraySymbol("B", (3, 3))
# 构建张量积表达式
tp_expr = ArrayTensorProduct(A, B)
print(f"张量积表达式: {tp_expr}")
# 构建缩并表达式(矩阵乘法)
matmul_expr = ArrayContraction(tp_expr, (1, 2))
print(f"矩阵乘法表达式: {matmul_expr}")
# 转换为显式形式(如果可能)
from sympy import Matrix
A_mat = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
B_mat = Matrix([[x, y, z], [1, 2, 3], [a, b, c]])
# 将符号表达式替换为具体矩阵
result = matmul_expr.replace({A: A_mat, B: B_mat})
print(f"具体计算结果: {result}")
高级张量操作
SymPy支持更复杂的张量操作,包括指标操作、对称性处理和坐标变换:
from sympy.tensor import TensorIndexType, tensor_indices, tensorhead
from sympy import symbols
# 定义张量指标类型
Lorentz = TensorIndexType('Lorentz', dummy_name='L')
mu, nu, rho = tensor_indices('mu nu rho', Lorentz)
# 定义度规张量
g = tensorhead('g', [Lorentz, Lorentz], [[1,1]])
# 定义电磁场张量
F = tensorhead('F', [Lorentz, Lorentz], [[1,2]])
# 构建麦克斯韦方程中的项
term1 = F(mu, nu) * F(-mu, -nu) # F_{\mu\nu}F^{\mu\nu}
term2 = F(mu, nu) * F(nu, rho) * F(rho, mu) # 更复杂的收缩
print(f"第一项: {term1}")
print(f"第二项: {term2}")
# 自动进行指标收缩和简化
from sympy.tensor import tensor_contract
contracted_term = tensor_contract(term1)
print(f"收缩后的项: {contracted_term}")
性能优化技巧
对于大型张量运算,SymPy提供了多种优化策略:
from sympy.tensor.array import ImmutableDenseNDimArray
import time
# 创建大型数组
large_array = ImmutableDenseNDimArray(range(1000), (10, 10, 10))
# 时间性能测试
start = time.time()
result = tensorcontraction(large_array, (0, 1))
end = time.time()
print(f"缩并运算时间: {end - start:.4f}秒")
# 使用稀疏数组优化内存
from sympy.tensor.array import MutableSparseNDimArray
sparse_array = MutableSparseNDimArray.zeros(100, 100)
sparse_array[50, 50] = 1 # 只存储非零元素
sparse_array[25, 75] = 2
print(f"稀疏数组内存效率更高,特别适合大型稀疏张量")
实际应用案例
在理论物理中,张量运算广泛应用于相对论和量子场论:
from sympy import symbols, simplify
from sympy.tensor import TensorIndexType, tensor_indices, tensorhead
# 广义相对论中的黎曼曲率张量
Lorentz = TensorIndexType('Lorentz', dummy_name='L')
a, b, c, d = tensor_indices('a b c d', Lorentz)
# 定义度规张量、克里斯托费尔符号和黎曼张量
g = tensorhead('g', [Lorentz, Lorentz], [[1,1]])
Gamma = tensorhead('Gamma', [Lorentz, Lorentz, Lorentz], [[2,1]])
Riemann = tensorhead('R', [Lorentz, Lorentz, Lorentz, Lorentz], [[2,2]])
# 爱因斯坦场方程中的里奇张量
Ricci = Riemann(a, b, -a, c) # R_{b c}
# 爱因斯坦张量
Einstein = Ricci(b, c) - (1/2)*g(b, c)*Ricci(a, -a)
print(f"爱因斯坦张量: {Einstein}")
# 在具体度规下计算
from sympy import diag
g_metric = diag(-1, 1, 1, 1) # 闵可夫斯基度规
# 可以进一步计算具体分量...
SymPy的张量模块为科学计算提供了强大的符号处理能力,无论是简单的多维数组操作还是复杂的微分几何计算,都能提供清晰而强大的解决方案。通过结合符号计算和数值计算的优势,SymPy使得复杂的张量运算变得直观且易于验证。
总结
SymPy提供了一个完整而强大的符号线性代数计算生态系统,从基础的矩阵操作到高级的张量运算都能得到很好的支持。其符号矩阵系统采用面向对象设计,具有优秀的扩展性和灵活性,能够处理符号变量表示的矩阵元素和维度。通过各种矩阵分解技术和求解算法,SymPy能够高效解决各类线性代数问题。特别值得注意的是其张量运算模块,为物理、工程等领域的多维计算提供了强有力的符号处理工具。SymPy的这些功能使得数学推导、理论证明和科学计算变得更加精确和高效,是科研工作者和工程师进行符号计算的宝贵工具。
【免费下载链接】sympy 一个用纯Python语言编写的计算机代数系统。 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



