【问题标题】:Convert Cartesian expression to polar expression using SymPy使用 SymPy 将笛卡尔表达式转换为极坐标表达式
【发布时间】:2018-04-21 15:44:19
【问题描述】:

有没有办法将 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))

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

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

【问题讨论】:

    标签: python-3.x expression sympy polar-coordinates


    【解决方案1】:
    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()
    

    【讨论】:

    • 现在可以使用了,感谢您的帮助!我只是假设语法是这样的,没有质疑。
    • 好的。在 Stack Overflow 上,通常通过单击左侧的复选标记将最佳答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多