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
相关产品推荐
相关产品推荐

