首页 文章

如何使用Sympy导出Matrix元素

提问于
浏览
3

给定矩阵和向量的乘积

A.v

对于形状(m,n)和v的dim n,其中m和n是符号,我需要相对于矩阵元素计算导数 . 我还没有找到使用正确向量的方法,所以我从2 MatrixSymbol 开始:

n, m = symbols('n m')
j = tensor.Idx('j')
i = tensor.Idx('i')
l = tensor.Idx('l')
h = tensor.Idx('h')
A = MatrixSymbol('A', n,m)
B = MatrixSymbol('B', m,1)
C=A*B

现在,如果我尝试使用索引来获取A的元素之一,我会回到未评估的表达式:

diff(C, A[i,j])
>>>> Derivative(A*B, A[i, j])

如果我也在C中引入索引(它不会让我在结果向量中只使用一个索引)我得到了表示为Sum的产品:

C[l,h]
>>>> Sum(A[l, _k]*B[_k, h], (_k, 0, m - 1))

如果我相对于矩阵元素得到这个,我最终得到0而不是带有 KroneckerDelta 的表达式,这是我想得到的结果:

diff(C[l,h], A[i,j])
>>>> 0

我想知道是否我不应该使用MatrixSymbols开始 . 我应该如何实现我想要的行为?

2 回答

  • 3

    SymPy(以及下一个版本)的git版本可以更好地处理这个问题:

    In [55]: print(diff(C[l,h], A[i,j]))
    Sum(KroneckerDelta(_k, j)*KroneckerDelta(i, l)*B[_k, h], (_k, 0, m - 1))
    
  • 2

    SymPy does not yet know matrix calculus;特别是,人们无法区分 MatrixSymbol 对象 . 您可以使用填充了符号数组的 Matrix 对象进行此类计算;缺点是矩阵大小必须明确才能使其工作 .

    例:

    from sympy import *
    A = Matrix(symarray('A', (4, 5)))
    B = Matrix(symarray('B', (5, 3)))
    C = A*B
    print(C.diff(A[1, 2]))
    

    输出:

    Matrix([[0, 0, 0], [B_2_0, B_2_1, B_2_2], [0, 0, 0], [0, 0, 0]])
    

相关问题