我知道可以在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 字段的分歧?我没有在文档中看到任何解决这个问题的内容。
答案 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个元素)。