2017-08-09 63 views
0

我知道在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 

但是,它有可能採取領域的分歧?我沒有看到任何解決這個問題的文檔。

回答

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)派生,因此創建了一個rank 3數組(形狀爲3x3x3)。此時tensorcontraction收縮第一個和第二個軸,將結果減少到第一個數組(3個元素)。