首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Sympy,python将复方程的指数型转化为极型

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

Stack Overflow用户
提问于 2021-08-18 21:12:14
回答 1查看 371关注 0票数 0

我试图在python中解一个带渐近模的微分方程。这就是我所做的

代码语言:javascript
复制
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)

现在,我试图得到一个极坐标形式的解,它包含着罪恶,因为和像这幅图一样的复杂术语(i)。在这张图片中,w_n是sqrt(k/m)

我试过了

代码语言:javascript
复制
solution.rewrite(sin) 

但是它返回带有双曲函数的表达式,.rewrite(cos)也返回带有双曲函数的表达式。

我也试过

代码语言:javascript
复制
solution.rewrite(sin, cos)

但它给出了初步的答案。

有没有办法把这种不带双曲函数的指数型复形转换成极型?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 23:45:36

您应该声明您的符号为实或正等。否则,默认情况下,SymPy假设一个复数:

代码语言:javascript
复制
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)

然后,各种简化将自动发生:

代码语言:javascript
复制
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表单:

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

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

代码语言:javascript
复制
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 ⎠
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68839375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档