如何使用Sympy从线性变换表达式中求解系数矩阵A
Sympy提取线性向量表达式系数矩阵的正确实现
报错原因
sympy.solve的定位是求解方程中未知符号的具体取值,不适用于提取线性表达式系数的场景。你未预先定义待求矩阵A的维度与元素结构就传入矩阵乘法方程,Sympy做维度校验时自然会触发Matrices A and x are not aligned报错。
实现方法
你的需求本质是提取向量每个分量对α、β、γ三个变量的线性系数,Sympy提供了两个原生方法可以直接实现,不需要手写求解逻辑:
方法1:雅可比矩阵法(兼容线性/非线性场景,线性场景下直接得到系数矩阵)
对于线性变换F(x) = Ax,系数矩阵A就是F对向量x的雅可比矩阵——线性表达式对变量的一阶偏导恰好是对应项的系数。
实现代码如下:
import sympy as sp # 定义所有符号变量 alpha, beta, gamma, theta, phi = sp.symbols('alpha beta gamma theta phi') # 定义输入的线性变换结果向量F(x) F = sp.Matrix([ alpha - gamma * sp.sin(theta), beta * sp.cos(phi) + gamma * sp.sin(phi) * sp.cos(theta), -beta * sp.sin(phi) + gamma * sp.cos(phi) * sp.cos(theta) ]) # 定义由α、β、γ构成的自变量向量 x = sp.Matrix([alpha, beta, gamma]) # 计算雅可比矩阵,即为目标系数矩阵A A = F.jacobian(x)
方法2:线性方程组系数提取法(仅适用于线性表达式场景)
Sympy提供的linear_eq_to_matrix工具可以直接把线性方程组整理为Ax = b的标准形式,直接返回系数矩阵A和常数项向量b。
实现代码如下:
# 传入F向量和变量列表,直接拆分出系数矩阵和常数项 A, b = sp.linear_eq_to_matrix(F, [alpha, beta, gamma])
由于你给出的F向量没有常数项,返回的b为3×1的全零向量,A和目标矩阵完全一致。
结果验证
执行上述任意一段代码后,打印A得到的结果如下,和你给出的期望矩阵完全匹配:
⎡1 0 -sin(θ) ⎤ ⎢ ⎥ ⎢0 cos(φ) sin(φ)⋅cos(θ)⎥ ⎢ ⎥ ⎣0 -sin(φ) cos(φ)⋅cos(θ)⎦
内容的提问来源于stack exchange,提问作者Aurelie Navir
相关产品推荐
相关产品推荐

