You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SymPy中求解两个符号块矩阵间的方程组?

SymPy分块矩阵方程组求解实现方案

完全可以在SymPy中实现该需求,具体操作如下:

原代码修正说明

你当前代码存在一处定义问题:将已知系数矩阵M1/M2/M3重复定义为了未知量A/B/C,不符合「已知系数矩阵」的设定,我们先修正该问题再完成求解逻辑。

核心实现思路

  1. 遍历两个分块矩阵的对应位置,基于分块相等的规则生成所有等式
  2. 若子矩阵为1×1的标量形式,可直接转为标量方程组求解;若为高阶子矩阵,可展开为元素级方程组或直接调用矩阵方程求解接口
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:54:01