【问题标题】:Sympy cancelling terms in the Jacobian of polar coordinates transformation极坐标变换的雅可比行列式中的 Sympy 抵消项
【发布时间】:2016-06-23 00:46:06
【问题描述】:

我正在准备如何使用极坐标/笛卡尔参数化的变换来得出雅可比矩阵的示例。我的问题是双重的。首先,我想知道如何强制 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

我预计使用 cancel(),甚至 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])

似乎第二个错误是第一个错误的结果。

【问题讨论】:

    标签: trigonometry sympy


    【解决方案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) 确实返回单位矩阵。

    【讨论】:

    • 我有同样的问题,但我有 cos(x)/(cos(x)**2)** 而不是 r/(r**2)**(1/2) (1/2),这对于我的 -pi/2
    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多