Python中使用sympy求解简单矩阵方程的报错原因及实现方法
报错原因
- 核心冲突是你混用了numpy数组和sympy的符号运算逻辑:
numpy数组 * sympy符号得到的是内嵌sympy对象的numpy数组,sym.Eq无法直接将这类numpy数组转换为sympy自身可识别的表达式结构,因此抛出SympifyError。 - 其次你没有提前声明sympy类型的符号变量
y,这也是报错的诱因之一。 - 标量代码能正常运行,是因为你提前定义了
x为sympy原生标量符号,所有运算生成的都是sympy可识别的表达式,sym.Eq可以正常解析。
正确实现方式
sympy的矩阵方程求解请统一使用sympy自身的Matrix类型做矩阵运算,不要和numpy数组混用,以下是两种常见场景的实现代码:
场景1:y为标量,求满足矩阵等式的标量解
import sympy as sym # 第一步:声明符号变量 y = sym.symbols('y') # 第二步:用sympy原生接口构造矩阵 a = sym.eye(3) * 3 # 第三步:构造等式,右侧也要用sympy的零矩阵 eq = sym.Eq(a * y, sym.zeros(3, 3)) # 第四步:求解 print(sym.solve(eq, y)) # 输出结果:[0]
场景2:y为3维列向量,求解线性方程组
import sympy as sym # 第一步:声明向量分量的符号变量 y1, y2, y3 = sym.symbols('y1 y2 y3') y = sym.Matrix([y1, y2, y3]) # 第二步:构造系数矩阵 a = sym.eye(3) * 3 # 第三步:构造等式,右侧为3行1列的零向量 eq = sym.Eq(a * y, sym.zeros(3, 1)) # 第四步:求解 print(sym.solve(eq, (y1, y2, y3))) # 输出结果:{y1: 0, y2: 0, y3: 0}
如果必须使用numpy生成的数组,需要先转换为sympy的Matrix类型再参与符号运算:
import sympy as sym import numpy as np # numpy生成数组 a_np = np.eye(3) * 3 # 转换为sympy矩阵 a = sym.Matrix(a_np) y = sym.symbols('y') eq = sym.Eq(a * y, sym.zeros(3, 3)) print(sym.solve(eq, y))
内容的提问来源于stack exchange,提问作者Marek Umiński
相关产品推荐
相关产品推荐

