用symphy,python将复方程的指数型转化为极型

2024-05-19 08:12:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

This is the solution

现在,我试图得到一个极性形式的解,包括sin,cos和复数项(I),如图所示。在这张图中,w_n是sqrt(k/m)

This is what I am trying to get

我试过了

solution.rewrite(sin) 

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

enter image description here

我也试过了

solution.rewrite(sin, cos)

但它给出了初步答案

有没有办法把这个指数形式的复数形式转换成没有双曲函数的极性形式

多谢各位


Tags: 模块函数表达式sin双曲cossymbol形式
1条回答
网友
1楼 · 发布于 2024-05-19 08:12:20

您应该将符号声明为实数或正数等。否则,默认情况下,Symphy会假定类似复数的内容:

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 ⎠

相关问题 更多 >

    热门问题