同情中张量场的分歧

时间:2017-08-09 06:18:33

标签: python sympy

我知道可以在sympy中采用向量场的分歧。例如:

>>> from sympy.physics.vector import ReferenceFrame
>>> from sympy.physics.vector import divergence
>>> R = ReferenceFrame('R')
>>> vfield = 3*R[0]**2*R.x+2*R[1]*R.y
>>> divergence(vfield,R)
6*R_x + 2

但是,是否可以采用 tensor 字段的分歧?我没有在文档中看到任何解决这个问题的内容。

1 个答案:

答案 0 :(得分:0)

注意sympy.physics.vector正在重写为sympy.vector

我看来,矢量模块并不真正支持张量场,但你可以使用N维数组,例如:

In [6]: ta = Array([[Function("f_{0}{1}".format(j,i))(x,y,z) for i in range(1,4)
   ...: ] for j in range(1,4)])

In [7]: ta
Out[7]: 
⎡f₁₁(x, y, z)  f₁₂(x, y, z)  f₁₃(x, y, z)⎤
⎢                                        ⎥
⎢f₂₁(x, y, z)  f₂₂(x, y, z)  f₂₃(x, y, z)⎥
⎢                                        ⎥
⎣f₃₁(x, y, z)  f₃₂(x, y, z)  f₃₃(x, y, z)⎦

In [9]: tensorcontraction(derive_by_array(ta, (x, y, z)), (0, 1))
Out[9]: 
⎡∂                  ∂                  ∂                 ∂                  ∂ 
⎢──(f₁₁(x, y, z)) + ──(f₂₁(x, y, z)) + ──(f₃₁(x, y, z))  ──(f₁₂(x, y, z)) + ──
⎣∂x                 ∂y                 ∂z                ∂x                 ∂y

                 ∂                 ∂                  ∂                  ∂    
(f₂₂(x, y, z)) + ──(f₃₂(x, y, z))  ──(f₁₃(x, y, z)) + ──(f₂₃(x, y, z)) + ──(f₃
                 ∂z                ∂x                 ∂y                 ∂z   

           ⎤
₃(x, y, z))⎥
           ⎦

在点6中创建秩2阵列,在点9中,相同的阵列由另一个阵列(x, y, z)导出,从而创建秩3阵列(形状为3x3x3)。此时tensorcontraction收缩第1和第2轴,将结果减少到1级数组(含3个元素)。