Производные определителя и обратного тензора 2-го порядка относительно самого себя в SymPy - PullRequest
2 голосов
/ 01 июля 2019

Я задал этот вопрос на форуме Вычислительная наука .https://scicomp.stackexchange.com/q/32973/24915 Мне предложили задать этот вопрос на этом форуме.

У меня есть тензор второго порядка ( F ), для которого мне нужно вычислить производные егоопределитель и обратный по отношению к самому себе.Это в основном уравнения (49) и (60) в матричной поваренной книге .

Я работаю с SymPy около недели.Я могу получить производную от F по самой себе, но не могу понять, как получить производные от ее детерминанта и обратного.Для справки выкладываю код и вывод вместе с сообщением об ошибке.

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")

Вывод

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 Ответ

1 голос
/ 01 июля 2019

Я не вижу ничего плохого в вашем коде.Я предполагаю, что вы имеете в виду разные модули через IDE или что-то еще.Попробуйте явно импортировать ваши модули

    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")

Вывод

    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))
...