2015-10-01 47 views
2

我試圖按照我自己的例子在sympy.diffgeom中的文檔。我嘗試使用笛卡爾座標和環形座標,而不是使用笛卡爾座標和極座標。使用sympy.diffgeom.CoordSystem連接兩個座標系

這裏是從IPython的會話我的代碼:

from sympy.diffgeom import Manifold, Patch, CoordSystem 
from sympy.abc import theta, eta, psi 
import sympy as sym 

x,y,z,a = sym.symbols("x y z a") 
m = Manifold("M",2) 
patch = Patch("P",m) 

cartesian = CoordSystem("cartesian",patch) 
toroidal = CoordSystem("toroidal",patch) 

from sympy import sin,cos,sinh,cosh 
toroidal.connect_to(cartesian,[eta,theta,psi], 
[(a*sinh(eta)*cos(psi))/(cosh(eta) - cos(theta)), 
(a*sinh(eta)*sin(psi))/(cosh(eta) - cos(theta)), 
(a*sin(theta))/(cosh(eta) - cos(theta))]) 

當我嘗試在本地執行的最後一行,代碼簡單地運行不休。 爲什麼這不起作用?

+0

我的目的是找到度量G和用它來確定黎曼曲率張量。我已經實現了可以找到度量的代碼。 我測試了代碼並返回了度量的正確條目。就個人而言,我寧願寫自己的實現來確定黎曼曲率張量,但由於在sympy.diffgeom中有一個實現,我很樂意爲上面描述的座標系測試它。 – imranal

+0

你在2維或3維工作嗎?爲什麼你聲明你的流形是二維的,但是傳遞了3個參數給connect_to()方法? –

+0

啊,我忘了改變歧管的尺寸。它應該是3!感謝您注意! – imranal

回答

1

儘量把逆=假作爲參數在.connect_to(...)

toroidal.connect_to(cartesian,[eta,theta,psi], 
[(a*sinh(eta)*cos(psi))/(cosh(eta) - cos(theta)), 
(a*sinh(eta)*sin(psi))/(cosh(eta) - cos(theta)), 
(a*sin(theta))/(cosh(eta) - cos(theta))], inverse=False) 

這可能是因爲SymPy的求解器遇到了很多困難,在翻轉變換方程。

如果你想使用的逆變換,我建議叫.connect_to(...)第二次,手動指定逆變換:

cartesian.connect_to(toroidal, ... , ... , inverse=False) 
+0

謝謝,這工作! – imranal