如何在SymPy中求解两个符号块矩阵间的方程组?
SymPy分块矩阵方程组求解实现方案
完全可以在SymPy中实现该需求,具体操作如下:
原代码修正说明
你当前代码存在一处定义问题:将已知系数矩阵M1/M2/M3重复定义为了未知量A/B/C,不符合「已知系数矩阵」的设定,我们先修正该问题再完成求解逻辑。
核心实现思路
- 遍历两个分块矩阵的对应位置,基于分块相等的规则生成所有等式
- 若子矩阵为1×1的标量形式,可直接转为标量方程组求解;若为高阶子矩阵,可展开为元素级方程组或直接调用矩阵方程求解接口
- 调用SymPy内置求解工具得到未知量的解
完整可运行代码
import sympy as sym # 构造块矩阵用到的未知子矩阵 A = sym.MatrixSymbol('A',1,1) B = sym.MatrixSymbol('B',1,1) C = sym.MatrixSymbol('C',1,1) # 修正:定义独立的已知系数矩阵 M1 = sym.MatrixSymbol('M1',1,1) M2 = sym.MatrixSymbol('M2',1,1) M3 = sym.MatrixSymbol('M3',1,1) # 构造零矩阵项 Z = sym.ZeroMatrix(1,1) # 构造2×2分块矩阵 S = sym.BlockMatrix([ [A,Z], [B,C]]) # 对分块矩阵求逆 Sinv = S.inverse() # 将逆矩阵与其转置做乘积得到包含待解方程的块矩阵N N = sym.block_collapse(Sinv*Sinv.transpose()) N = N.simplify() # 构造对称的目标系数矩阵M M = sym.BlockMatrix([ [M1,M2.transpose()], [M2,M3]]) # 步骤1:生成所有对应分块的等式 eq_list = [] for i in range(S.shape[0]//A.shape[0]): for j in range(S.shape[1]//A.shape[1]): eq_list.append(sym.Eq(N.blocks[i,j], M.blocks[i,j])) # 步骤2:转为标量方程组(仅适用于1×1子矩阵场景,高阶矩阵可调整为元素遍历) scalar_eqs = [eq.as_explicit()[0,0] for eq in eq_list] unknowns = [A.as_explicit()[0,0], B.as_explicit()[0,0], C.as_explicit()[0,0]] # 步骤3:求解方程组 solution = sym.solve(scalar_eqs, unknowns, dict=True) # 打印求解结果 print("方程组的解为:", solution)
注意事项
- 如果子矩阵维度大于1,可通过遍历子矩阵内所有元素生成元素级的方程组求解
- 涉及矩阵求逆的场景默认隐含矩阵可逆的前提,求解后建议校验解的合法性
- 若已知系数矩阵为数值矩阵,可在定义
M1/M2/M3时直接传入数值,即可得到数值解
内容的提问来源于stack exchange,提问作者J.Galt
相关产品推荐
相关产品推荐

