【问题标题】:Convert Exponential form of Complex Equation into polar form with Sympy, python使用 Sympy、python 将复数方程的指数形式转换为极坐标形式
【发布时间】:2021-08-18 21:12:14
【问题描述】:

我正在尝试用 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) 

但它返回一个带有双曲线函数的表达式。rewrite(cos) 也返回一个带有双曲线函数的表达式。

我也试过

solution.rewrite(sin, cos)

但它给出了最初的答案。

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

谢谢

【问题讨论】:

  • 我认为 ODE 的解不包含 sin() 或 cos(),因此无法转换为极坐标形式。也就是说,解乘以 cos(0*t)
  • 我不明白,如果两个实指数不能自行转换为复指数,则组合。如果您想在复杂字段上使用 smt,则必须使用 Symbol 指定它
  • sinh 和 cosh 只是指数特殊组合的占位符 => sympy 是对的
  • @Patricio Loncomilla 语法应该是:Symbol("x*, complex=True)

标签: python sympy ode differential-equations polar-coordinates


【解决方案1】:

你应该将你的符号声明为实数或正数等。否则默认情况下 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 ⎠

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多