使用 Sympy 将复数方程的指数形式转换为极坐标形式,python

Convert Exponential form of Complex Equation into polar form with Sympy, python

我正在尝试使用 python 中的 sympy 模块求解微分方程。 这就是我所做的

from sympy import *


t = sympy.Symbol('t')      
k = sympy.Symbol('k')      
m = sympy.Symbol('m')      
x = sympy.Function('x')(t)     

GDE = Eq(m*x.diff(t, 2) + k*x, 0)

solution = dsolve(GDE, x)
display(solution)

现在,我正在尝试使用 sin、cos 和复数项 (i) 获得极坐标形式的解决方案,如下图所示。在这张图中,w_n就是sqrt(k/m)

我试过了

solution.rewrite(sin) 

但它 returns 是一个双曲函数表达式。rewrite(cos) 也是 returns 一个双曲函数表达式。

我也试过了

solution.rewrite(sin, cos)

但它给出了初步答案。

有没有什么方法可以将这种复数形式的指数形式转换为不带双曲函数的极坐标形式?

谢谢

你应该将你的符号声明为实数或正数等。否则默认情况下 SymPy 会假设一个类似复数的东西:

In [7]: import sympy

In [8]: from sympy import *
   ...: 
   ...: 
   ...: t = sympy.Symbol('t', real=True)
   ...: k = sympy.Symbol('k', positive=True)
   ...: m = sympy.Symbol('m', positive=True)
   ...: x = sympy.Function('x', real=True)(t)
   ...: 
   ...: GDE = Eq(m*x.diff(t, 2) + k*x, 0)

然后各种简化会自动发生:

In [9]: sqrt(-k/m)
Out[9]: 
ⅈ⋅√k
────
 √m 

In [10]: exp(t * sqrt(-k/m))
Out[10]: 
 ⅈ⋅√k⋅t
 ──────
   √m  
ℯ      

In [11]: exp(t * sqrt(-k/m)).rewrite(cos)
Out[11]: 
     ⎛√k⋅t⎞      ⎛√k⋅t⎞
ⅈ⋅sin⎜────⎟ + cos⎜────⎟
     ⎝ √m ⎠      ⎝ √m ⎠

事实上,假设设置 dsolve 将自动给出 sincos 形式:

In [12]: dsolve(GDE)
Out[12]: 
             ⎛√k⋅t⎞         ⎛√k⋅t⎞
x(t) = C₁⋅sin⎜────⎟ + C₂⋅cos⎜────⎟
             ⎝ √m ⎠         ⎝ √m ⎠

如果不设置这些假设,仍然可以将表达式操作成 sin/cos 形式,但需要一些 force=True 来覆盖假设检查:

In [25]: s = solution.rhs; s
Out[25]: 
           _____             _____
          ╱ -k              ╱ -k  
    -t⋅  ╱  ───        t⋅  ╱  ─── 
       ╲╱    m           ╲╱    m  
C₁⋅ℯ             + C₂⋅ℯ           

In [26]: s = expand(s, force=True); s
Out[26]: 
                ___                  ___
               ╱ 1                  ╱ 1 
    -ⅈ⋅√k⋅t⋅  ╱  ─        ⅈ⋅√k⋅t⋅  ╱  ─ 
            ╲╱   m               ╲╱   m 
C₁⋅ℯ                + C₂⋅ℯ              

In [27]: s = s.rewrite(sin); s
Out[27]: 
   ⎛       ⎛         ___⎞      ⎛         ___⎞⎞      ⎛     ⎛         ___⎞      ⎛         ___⎞⎞
   ⎜       ⎜        ╱ 1 ⎟      ⎜        ╱ 1 ⎟⎟      ⎜     ⎜        ╱ 1 ⎟      ⎜        ╱ 1 ⎟⎟
C₁⋅⎜- ⅈ⋅sin⎜√k⋅t⋅  ╱  ─ ⎟ + cos⎜√k⋅t⋅  ╱  ─ ⎟⎟ + C₂⋅⎜ⅈ⋅sin⎜√k⋅t⋅  ╱  ─ ⎟ + cos⎜√k⋅t⋅  ╱  ─ ⎟⎟
   ⎝       ⎝     ╲╱   m ⎠      ⎝     ╲╱   m ⎠⎠      ⎝     ⎝     ╲╱   m ⎠      ⎝     ╲╱   m ⎠⎠

In [28]: s = expand(s).collect(s.atoms(sin, cos)); s
Out[28]: 
             ⎛         ___⎞                     ⎛         ___⎞
             ⎜        ╱ 1 ⎟                     ⎜        ╱ 1 ⎟
(C₁ + C₂)⋅cos⎜√k⋅t⋅  ╱  ─ ⎟ + (-ⅈ⋅C₁ + ⅈ⋅C₂)⋅sin⎜√k⋅t⋅  ╱  ─ ⎟
             ⎝     ╲╱   m ⎠                     ⎝     ╲╱   m ⎠

In [29]: s = powsimp(s, force=True); s
Out[29]: 
             ⎛         ___⎞                     ⎛         ___⎞
             ⎜        ╱ 1 ⎟                     ⎜        ╱ 1 ⎟
(C₁ + C₂)⋅cos⎜√k⋅t⋅  ╱  ─ ⎟ + (-ⅈ⋅C₁ + ⅈ⋅C₂)⋅sin⎜√k⋅t⋅  ╱  ─ ⎟
             ⎝     ╲╱   m ⎠                     ⎝     ╲╱   m ⎠

In [30]: s = powsimp(s, force=True, deep=True); s
Out[30]: 
             ⎛      ___⎞                     ⎛      ___⎞
             ⎜     ╱ k ⎟                     ⎜     ╱ k ⎟
(C₁ + C₂)⋅cos⎜t⋅  ╱  ─ ⎟ + (-ⅈ⋅C₁ + ⅈ⋅C₂)⋅sin⎜t⋅  ╱  ─ ⎟
             ⎝  ╲╱   m ⎠                     ⎝  ╲╱   m ⎠