在SymPy中能否创建作为函数的矩阵符号?
表示参数t的矩阵函数的正确方法
你想用sp.MatrixSymbol('H',2,2)(t)这种形式定义依赖t的矩阵,但SymPy不支持直接这么写。之前用sp.Function('H', commutative=False)(t)的问题在于,这个写法本质是把H(t)当成了非交换标量而非矩阵,所以乘法会被错误处理成张量积,和你提到的问题本质一样——都是没让变量以矩阵类型参与运算。
给你三个实用的解决办法:
方法一:用Lambda包装MatrixSymbol
通过Lambda把矩阵符号变成t的函数,调用后依然保持矩阵类型,乘法自动是矩阵乘法:
import sympy as sp t = sp.symbols('t') # 先定义基础矩阵符号 H = sp.MatrixSymbol('H', 2, 2) # 包装成t的函数 H_t = sp.Lambda(t, H) # 生成不同参数的矩阵 H_t_val = H_t(t) H_t1_val = H_t(sp.symbols('t1')) # 此时乘法是正常的矩阵乘法 print(H_t_val * H_t1_val)
方法二:自定义MatrixFunction子类
这种方式更灵活,适合需要复杂逻辑的矩阵函数,生成的对象天生是矩阵类型:
import sympy as sp class HMatrix(sp.MatrixFunction): @classmethod def eval(cls, t): # 生成带参数标识的矩阵符号 return sp.MatrixSymbol(f'H({t})', 2, 2) t = sp.symbols('t') H_t = HMatrix(t) H_t1 = HMatrix(sp.symbols('t1')) # 矩阵乘法正常生效 print(H_t * H_t1)
方法三:用普通函数返回MatrixSymbol
最简单的写法,直接写个函数,每次调用返回对应参数的矩阵符号:
import sympy as sp def H(t): return sp.MatrixSymbol(f'H_{t}', 2, 2) t = sp.symbols('t') H_t = H(t) H_t1 = H(sp.symbols('t1')) # 乘法为矩阵乘法,符号名也会清晰标注参数 print(H_t * H_t1)
核心逻辑就是:必须让H(t)是MatrixExpr(MatrixSymbol属于这个类)类型的对象,SymPy才会用矩阵乘法规则处理它,而不是当成标量来做张量积。
内容的提问来源于stack exchange,提问作者Idieh
相关产品推荐
相关产品推荐

