Tensor Operators#
- class sympy.tensor.toperators.PartialDerivative(expr, *variables)[source]#
Partial derivative for tensor expressions.
Examples
>>> from sympy.tensor.tensor import TensorIndexType, TensorHead >>> from sympy.tensor.toperators import PartialDerivative >>> from sympy import symbols >>> L = TensorIndexType("L") >>> A = TensorHead("A", [L]) >>> B = TensorHead("B", [L]) >>> i, j, k = symbols("i j k")
>>> expr = PartialDerivative(A(i), A(j)) >>> expr PartialDerivative(A(i), A(j))
The
PartialDerivativeobject behaves like a tensorial expression:>>> expr.get_indices() [i, -j]
Notice that the deriving variables have opposite valence than the printed one:
A(j)is printed as covariant, but the index of the derivative is actually contravariant, i.e.-j.Indices can be contracted:
>>> expr = PartialDerivative(A(i), A(i)) >>> expr PartialDerivative(A(L_0), A(L_0)) >>> expr.get_indices() [L_0, -L_0]
The method
.get_indices()always returns all indices (even the contracted ones). If only uncontracted indices are needed, call.get_free_indices():>>> expr.get_free_indices() []
Nested partial derivatives are flattened:
>>> expr = PartialDerivative(PartialDerivative(A(i), A(j)), A(k)) >>> expr PartialDerivative(A(i), A(j), A(k)) >>> expr.get_indices() [i, -j, -k]
Replace a derivative with array values:
>>> from sympy.abc import x, y >>> from sympy import sin, log >>> compA = [sin(x), log(x)*y**3] >>> compB = [x, y] >>> expr = PartialDerivative(A(i), B(j)) >>> expr.replace_with_arrays({A(i): compA, B(i): compB}) [[cos(x), 0], [y**3/x, 3*y**2*log(x)]]
The returned array is indexed by
.Be careful that other SymPy modules put the indices of the deriving variables before the indices of the derivand in the derivative result. For example:
>>> expr.get_free_indices() [i, -j]
>>> from sympy import Matrix, Array >>> Matrix(compA).diff(Matrix(compB)).reshape(2, 2) [[cos(x), y**3/x], [0, 3*y**2*log(x)]] >>> Array(compA).diff(Array(compB)) [[cos(x), y**3/x], [0, 3*y**2*log(x)]]
These are the transpose of the result of
PartialDerivative, as the matrix and the array modules put the index
before
in the
derivative result. An array read with index order
is indeed the
transpose of the same array read with index order
. By specifying
the index order to .replace_with_arraysone can get a compatible expression:>>> expr.replace_with_arrays({A(i): compA, B(i): compB}, [-j, i]) [[cos(x), y**3/x], [0, 3*y**2*log(x)]]