2016-06-23 5 views
2

極座標/直交座標からの変換を使用してヤコビ行列がどのように到着したかの例を準備しています。私の質問は二重です。まず、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 

I)は(キャンセル使用していることを期待、あるいはevalf()は、R /(R^2)^ 1/2 = 1項を削除しているだろうが、それはしませんでした。

第2に、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]) 

第2のエラーは最初のエラーの結果であると思われます。

答えて

1

数学的には、r /(r^2)^ 1/2 = 1は必ずしも真ではありません。 rが非負の数であれば真であり、それは極座標である。ですから、SymPyにこのことを教えてください:

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

を(極座標の原点誘導体で、とにかく動作しないので、数学的には、あなたも、positive=True、rは厳密に正と仮定することができます。)

出力は次のようになりますはるかに楽しい:[[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) 

最終結果はtrigsimp(J1*J2)は単位行列を返すし、三角簡略化として[[cos(theta), sin(theta)], [-sin(theta)/r, cos(theta)/r]]

あります。

関連する問題