使用 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
将自动给出 sin
、cos
形式:
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 ⎠
我正在尝试使用 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
将自动给出 sin
、cos
形式:
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 ⎠