Derivatives of the determinant and inverse of 2nd-order tensor wrt itself in SymPy

Viewed 345

I have asked this question in Computational Science forum. https://scicomp.stackexchange.com/q/32973/24915 I have been suggested to ask this question in this forum.

I have a second-order tensor (F) for which I need to compute the derivatives of its determinant and inverse w.r.t. itself. These are basically the equations (49) and (60) in the matrix cookbook.

I have been working with SymPy for about a week. I can get the derivative of F wrt itself but can't figure out how to get the derivatives of its determinant and the inverse. For reference, I am posting the code and the output along with the error message.

Python code

from sympy import *

i = tensor.Idx('i',3)
j = tensor.Idx('j',3)
k = tensor.Idx('k',3)
l = tensor.Idx('l',3)

F = MatrixSymbol('F', 3, 3)

print("Derivative of F wrt F")
print("---------------------")
print(diff(F[k,l], F[i,j]))
print("\n")


J = det(F)
print("Derivative of det(F) wrt F")
print("--------------------------")
print(diff(J, F[i,j]))
print("\n")

print("Derivative of inv(F) wrt F")
print("--------------------------")
Finv = Inverse(F)
print(Finv[i,j])
print(diff(Finv[k,l], F[i,j]))
print("\n")

Output

Derivative of F wrt F
---------------------------
KroneckerDelta(i, k)*KroneckerDelta(j, l)

Derivative of det(F) wrt F
-------------------------------
Derivative(Determinant(F), F[i, j])

Derivative of inv(F) wrt F
-------------------------------
Traceback (most recent call last):
  File "matdiffinverse.py", line 25, in <module>
    print(Finv[i,j])
  File "/usr/lib/python3/dist-packages/sympy/matrices/expressions/matexpr.py", line 248, in __getitem__
return self._entry(i, j)
  File "/usr/lib/python3/dist-packages/sympy/matrices/expressions/matpow.py", line 46, in _entry
    raise NotImplementedError(("(%d, %d) entry" % (int(i), int(j)))
  File "/usr/lib/python3/dist-packages/sympy/core/expr.py", line 207, in __int__
    raise TypeError("can't convert symbols to int")
TypeError: can't convert symbols to int
1 Answers

I don't see anything wrong in your code. I assume you are referring to different modules via an IDE or something. Try to explicitly import your modules

    from sympy import MatrixSymbol, diff, det, Inverse
    from sympy.tensor import Idx
    import sympy

    print('SymPy version: {0}\n'.format(sympy.__version__))  # 1.3

    i = Idx('i', 3)
    j = Idx('j', 3)
    k = Idx('k', 3)
    l = Idx('l', 3)

    F = MatrixSymbol('F', 3, 3)

    print("Derivative of F wrt F")
    print("---------------------")
    print(diff(F[k, l], F[i, j]))
    print("\n")

    J = det(F)
    print("Derivative of det(F) wrt F")
    print("--------------------------")
    # no errors
    # print(diff(J, F[i, j]))

    # EDIT based on question --this is not equivalent
    # just an example by using a different function
    # it means: try with a different approach ¯\_(ツ)_/¯
    # try with an MDM
    mutable_dense_matrix = sympy.Matrix(F)
    print(diff(mutable_dense_matrix.det(), F[i, j]))
    print("\n")

    print("Derivative of inv(F) wrt F")
    print("--------------------------")
    Finv = Inverse(F)
    print(Finv[i, j])
    print(diff(Finv[k, l], F[i, j]))
    print("\n")

Output

    SymPy version: 1.3

    Derivative of F wrt F
    ---------------------
    KroneckerDelta(i, k)*KroneckerDelta(j, l)


    Derivative of det(F) wrt F
    --------------------------
    KroneckerDelta(0, i)*KroneckerDelta(0, j)*F[1, 1]*F[2, 2] - KroneckerDelta(0, i)*KroneckerDelta(0, j)*F[1, 2]*F[2, 1] - KroneckerDelta(0, i)*KroneckerDelta(1, j)*F[1, 0]*F[2, 2] + KroneckerDelta(0, i)*KroneckerDelta(1, j)*F[1, 2]*F[2, 0] + KroneckerDelta(0, i)*KroneckerDelta(2, j)*F[1, 0]*F[2, 1] - KroneckerDelta(0, i)*KroneckerDelta(2, j)*F[1, 1]*F[2, 0] - KroneckerDelta(0, j)*KroneckerDelta(1, i)*F[0, 1]*F[2, 2] + KroneckerDelta(0, j)*KroneckerDelta(1, i)*F[0, 2]*F[2, 1] + KroneckerDelta(0, j)*KroneckerDelta(2, i)*F[0, 1]*F[1, 2] - KroneckerDelta(0, j)*KroneckerDelta(2, i)*F[0, 2]*F[1, 1] + KroneckerDelta(1, i)*KroneckerDelta(1, j)*F[0, 0]*F[2, 2] - KroneckerDelta(1, i)*KroneckerDelta(1, j)*F[0, 2]*F[2, 0] - KroneckerDelta(1, i)*KroneckerDelta(2, j)*F[0, 0]*F[2, 1] + KroneckerDelta(1, i)*KroneckerDelta(2, j)*F[0, 1]*F[2, 0] - KroneckerDelta(1, j)*KroneckerDelta(2, i)*F[0, 0]*F[1, 2] + KroneckerDelta(1, j)*KroneckerDelta(2, i)*F[0, 2]*F[1, 0] + KroneckerDelta(2, i)*KroneckerDelta(2, j)*F[0, 0]*F[1, 1] - KroneckerDelta(2, i)*KroneckerDelta(2, j)*F[0, 1]*F[1, 0]


    Derivative of inv(F) wrt F
    --------------------------
    (F^-1)[i, j]
    -Sum(KroneckerDelta(_z1, i)*KroneckerDelta(_z2, j)*(F^-1)[_z2, l]*(F^-1)[k, _z1], (_z1, 0, 2), (_z2, 0, 2))
Related