如何使用SymPy将笛卡尔表达式转换为极坐标表达式?
用SymPy将笛卡尔表达式转换为极坐标表达式的正确方法
嘿,当然可以用SymPy搞定这个转换呀!你之前的subs用法踩了两个小坑,我来帮你捋清楚正确的实现方式~
首先先分析下你之前的问题:
- 第一种
subs写法,虽然代入了x和y的极坐标形式,但没有调用化简函数,SymPy不会自动帮你把sqrt(r²cos²θ + r²sin²θ)简化成r; - 第二种
subs写法不仅参数格式错误,替换逻辑也不对——你把sqrt(x²+y²)换成atan(y/x)完全不匹配,前者对应极坐标的r,后者对应theta,这俩根本不是一回事儿。
方法一:代入极坐标关系后化简
这是最通用的方法,适合任何笛卡尔表达式转极坐标:
import sympy as sp # 定义所需符号 x, y, r, theta = sp.symbols('x y r theta') # 你的笛卡尔表达式 expr = 1 / sp.sqrt(x**2 + y**2) # 代入x=r*cosθ、y=r*sinθ,然后调用simplify化简 polar_expr = expr.subs({x: r*sp.cos(theta), y: r*sp.sin(theta)}).simplify() print(polar_expr) # 输出结果就是1/r
SymPy会自动利用三角恒等式cos²θ + sin²θ = 1,把分母的sqrt(r²(cos²θ+sin²θ))简化为r,最终得到你想要的1/r。
方法二:直接替换核心项
因为你的表达式正好是1/sqrt(x²+y²),而sqrt(x²+y²)本身就是极坐标里的r,所以可以直接替换这个核心项,一步到位:
import sympy as sp x, y, r = sp.symbols('x y r') expr = 1 / sp.sqrt(x**2 + y**2) # 直接把sqrt(x²+y²)替换成r polar_expr = expr.subs(sp.sqrt(x**2 + y**2), r) print(polar_expr) # 直接输出1/r
这种方式更简洁,适合表达式结构和极坐标变量直接对应的场景。
内容的提问来源于stack exchange,提问作者Linde




