'How to calculate the divergent of a vector in sympy?

I want to calculate the divergent of a given vector with sympy. Is there any function in python responsible for this? I looked for something in the functions of einsteinpy, but I still haven't found any that help.

Basically I want to calculate \nabla_\mu (n v^\mu)=0 from a given vector v; n being a constant number.

\nabla_\mu (nv^\mu)=0 represents a divergence where \mu will take the derivative with respect to x, y or z of the vector element corresponding to the component. For example:

\nabla_\mu (n v^\mu) = \partial_x (u^x) + \partial_y(u^y) + \partial_z(u^z)

u can be something like (2x,4y,6z)

I appreciate any help.



Solution 1:[1]

As shown by @mikuszefski, you can use the module sympy.vector such that you have the implementation of the divergence in a space.

Another way to do what you want is to use the function derive_by_array to get a tensor and do einsten contraction.

import sympy as sp

x, y, z = sp.symbols("x y z")   # dim = 3

# Now the functions that you want:
u, v, w = 2*x, 4*y, 6*z  

# In a more general way, you can do:
u = sp.Function("u")(x, y, z)
v = sp.Function("v")(x, y, z)
w = sp.Function("w")(x, y, z)


U = sp.Array([u, v, w])  # U is a vector of dim = 3 (or sympy.Array)
X = sp.Array([x, y, z])  # X is a vector of dim = 3 (or sympy.Array)

dUdX = sp.derive_by_array(U, X)  # dUdX is a tensor of dim = 3 and order = 2

# Frist way:
divU = sp.trace(sp.Matrix(sp.derive_by_array(U, X)))  # Limited

# Second way:
divU = sp.tensorcontraction(sp.derive_by_array(U, X), (0, 1))  # More general

This solution works fine when dim = 2 for example, but you must have that len(X) == len(U)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1