如何使用Sympy对矩阵元素求导

9

给定一个矩阵和一个向量的乘积

A.v

其中A的形状为(m,n),v的维度为n,其中m和n是符号,我需要计算相对于矩阵元素的导数。 我还没有找到使用正确向量的方法,因此我从两个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中引入指数(它不允许我在结果向量中仅使用一个索引),则得到的乘积将被表示为总和形式:
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个回答

7
SymPy目前还不支持矩阵微积分;特别是,无法对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]])

6

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接