2016-06-23 36 views
2

我正在準備雅可比例式是如何使用極座標/笛卡爾參數化變換的例子。我的問題是雙重的。首先,我想知道如何強制sympy取消替換後的條款。 兩個矩陣是:在極座標變換的雅可比行列式中的Sympy抵消術語

J1 = Matrix([[(r*cos(theta)).diff(r), (r*cos(theta)).diff(theta)],[(r*sin(theta)).diff(r),(r*sin(theta)).diff(theta)]]) 
J2 = Matrix([[((x**2+y**2)**(1/2.)).diff(x),((x**2+y**2)**(1/2.)).diff(y)],[atan(y/x).diff(x),atan(y/x).diff(y)]]) 
#substitute for x,y to have same variables for J1 and J2 
J2 = trigsimp(J2.subs({x:r*cos(theta), y:r*sin(theta)})) 
J2 

我預期使用取消(),或甚至evalf()將除去R /(R^2)^ 1/2 = 1術語,但它沒有。第二,如何或可以要求sympy識別簡單的身份,在這種情況下,sin^2 + cos^2 = 1???????????????????????這使得結果是來自J1 * J2的評估單位矩陣。

這工作,按照文件:

simplify(r/(r**2)**(1/2)*(sin(theta)**2+cos(theta)**2)) 

這相當於(ISH)方程沒有。

J = J1*J2 
simplify(J[0,0]) 

看來第二個錯誤是第一個錯誤的結果。

回答

1

在數學上,r /(r^2)^ 1/2 = 1並不總是成立。如果r是一個非負數,它在極座標中,這是真的。所以,你應該告訴SymPy這樣的:

r = Symbol('r', nonnegative=True) 
theta, x, y = symbols('theta x y') 

(數學上,你甚至可以假設[R嚴格爲正,positive=True,因爲在原點在極座標衍生物不反正工作。)

輸出將是更令人愉快:[[1.0*cos(theta), 1.0*sin(theta)], [-sin(theta)/r, cos(theta)/r]]

只有這個1.0是煩人的,它從哪裏來?它來自1/2。作爲一個浮點數而不是有理數。使用Rational(1, 2)在指數中有一個有理數(重要的是爲了簡化)。在這種情況下,指數爲1/2,使用sqrt更自然,它具有使指數合理且易於輸入的相同效果。

sqrt(x**2+y**2).diff(x) 

最終的結果是[[cos(theta), sin(theta)], [-sin(theta)/r, cos(theta)/r]]

至於三角函數簡化,trigsimp(J1*J2)確實返回單位矩陣。