使用 SymPy 将笛卡尔表达式转换为极坐标表达式

Convert Cartesian expression to polar expression using SymPy

有没有办法将 SymPy 中的笛卡尔表达式转换为极坐标表达式? 我有以下表达式:

1/sqrt(x^2+y^2)

但是,我似乎无法让 SymPy 承认这是极坐标中的 1/r。我尝试使用 'subs' 命令,以下两个选项(我将 sympy 导入为 asp,并在前面定义了所有符号):

expr = 1/sp.sqrt(x**2+y**2)
expr.subs((x,y),(r*cos(theta),r*sin(theta))
expr.subs((sp.sqrt(x**2+y**2),sp.atan(y/x)),(r,theta))

但在这两种情况下,我只是再次收到原始表达式。

有没有办法在 SymPy 中将笛卡尔表达式转换为极坐标表达式?

subs((x,y),(r*cos(theta),r*sin(theta))

不是 subs 的正确语法。当要替换多个符号时,必须提供字典

subs({x: r*sp.cos(theta), y: r*sp.sin(theta)})

或其中包含对(旧的,新的)的可迭代对象:

subs(((x, r*sp.cos(theta)), (y, r*sp.sin(theta))))

前者可读性更强;当必须以特定顺序执行替换时需要后者(这里不是这种情况)。

无论哪种方式,要实现 1/r,您还需要将 r 声明为非负数

r = sp.symbols('r', nonnegative=True)

并简化替换结果:

expr.subs({x: r*sp.cos(theta), y: r*sp.sin(theta)}).simplify()