如何使用Sympy推导Matrix元素

Mar*_*mez 5 python matrix sympy derivative

给定矩阵与向量的乘积

平均值

由于A的形状为(m,n),且v为暗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
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用索引从A的元素之一导出,我将得到未评估的表达式:

diff(C, A[i,j])
>>>> Derivative(A*B, A[i, j])
Run Code Online (Sandbox Code Playgroud)

如果我也在C中引入索引(它不会让我仅在结果向量中使用一个索引),我将得到以Sum表示的乘积:

C[l,h]
>>>> Sum(A[l, _k]*B[_k, h], (_k, 0, m - 1))
Run Code Online (Sandbox Code Playgroud)

如果针对矩阵元素派生此结果,则最终得到0而不是带有的表达式KroneckerDelta,这就是我想要得到的结果:

diff(C[l,h], A[i,j])
>>>> 0
Run Code Online (Sandbox Code Playgroud)

我想知道也许我不应该从MatrixSymbols开始。我应该如何去实现我想要的行为?

小智 5

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]))
Run Code Online (Sandbox Code Playgroud)

输出:

Matrix([[0, 0, 0], [B_2_0, B_2_1, B_2_2], [0, 0, 0], [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)


asm*_*rer 5

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))
Run Code Online (Sandbox Code Playgroud)