gpt4 book ai didi

trigonometry - Sympy 取消极坐标变换雅可比矩阵中的项

转载 作者:行者123 更新时间:2023-12-04 17:58:40 29 4
gpt4 key购买 nike

我正在准备一些示例,说明如何使用极坐标/笛卡尔参数化的变换来获得雅可比行列式。我的问题是双重的。首先,我想知道如何强制 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])

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

最佳答案

在数学上,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。是 float 而不是有理数。使用 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) 会返回单位矩阵。

关于trigonometry - Sympy 取消极坐标变换雅可比矩阵中的项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37980497/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com