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

SymPy中exp矩阵调用subs替换后结果异常的问题求助

SymPy矩阵指数符号替换错误的解决方法

问题原因

SymPy计算符号矩阵的指数exp(U)时,会基于无约束的通用场景推导表达式(不预设矩阵特征值是否相等)。当替换为特征值互异的对角矩阵时,原表达式中的部分项因分母为零的特殊情况未被自动化简,导致结果异常。

可行解决方案

方法一:替换后执行化简

对exp(U)替换符号后的结果调用simplify(),强制SymPy处理特殊情况并完成化简:

from sympy import *

var("u0, u1, u2, u3", complex=True)
U = Matrix([[u0, u1], [u2, u3]])
x1 = exp(U.subs({u0: 1, u1: 0, u2: 0, u3: -1}))
x2 = exp(U).subs({u0: 1, u1: 0, u2: 0, u3: -1}).simplify()
display(x1)    # 输出:[[e, 0], [0, exp(-1)]]
display(x2)    # 输出:[[e, 0], [0, exp(-1)]]
assert x1.equals(x2)

方法二:预先设定符号约束

定义符号时添加u0 != u3的约束(对应目标矩阵特征值互异的情况),让SymPy基于特征值互异的场景推导矩阵指数,替换后直接得到正确结果:

from sympy import *

u0, u1, u2, u3 = symbols("u0, u1, u2, u3", complex=True)
assumptions.add(u0 != u3)
U = Matrix([[u0, u1], [u2, u3]])
x1 = exp(U.subs({u0: 1, u1: 0, u2: 0, u3: -1}))
x2 = exp(U).subs({u0: 1, u1: 0, u2: 0, u3: -1})
display(x1)    # 输出:[[e, 0], [0, exp(-1)]]
display(x2)    # 输出:[[e, 0], [0, exp(-1)]]
assert x1.equals(x2)

方法三:使用subs时传入simplify=True

SymPy的subs方法支持传入simplify=True参数,在替换过程中自动完成化简:

from sympy import *

var("u0, u1, u2, u3", complex=True)
U = Matrix([[u0, u1], [u2, u3]])
x1 = exp(U.subs({u0: 1, u1: 0, u2: 0, u3: -1}))
x2 = exp(U).subs({u0: 1, u1: 0, u2: 0, u3: -1}, simplify=True)
display(x1)    # 输出:[[e, 0], [0, exp(-1)]]
display(x2)    # 输出:[[e, 0], [0, exp(-1)]]
assert x1.equals(x2)

内容的提问来源于stack exchange,提问作者upe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:23:10