SYMPY:如何用 exp(-i.w.t) 项简化函数?
SYMPY : How to simplify function with exp(-i.w.t) term?
我使用 sympy 对虚数指数项 (exp(i.a)) 进行符号计算,但我在简化方面遇到了问题。
比如我得到了如下函数(经过一些哈密尔顿对角化和时间演化,这不是本题的问题):
import sympy as sp
w, th, t =sp.symbols("omega theta t", real=True)
myFunc = (sp.exp(sp.I*w*t)*sp.sin(th)**2 + sp.exp(-sp.I*w*t)*sp.cos(th)**2)*(sp.exp(sp.I*w*t)*sp.cos(th)**2 + sp.exp(-sp.I*w*t)*sp.sin(th)**2) + sp.sin(2*th)**2*sp.sin(w*t)**2
在计算过程中,sin(w.t) 和 cos(w.t) 项是从 exp(-i.wt) 和 exp(i.wt) 隐式生成的。这个是正常的。但是,我无法使用 https://docs.sympy.org/latest/tutorial/simplification.html.
中的不同方法来简化它们
但是,在上面的示例中,如果 sinus(w.t) 明确地替换为 (exp(i.w.t)-exp(-i.w.t)) /(2.i))
firstStep=myFunc.subs(sp.sin(w*t),((sp.exp(sp.I*w*t)-sp.exp(-sp.I*w*t))/(2*sp.I)))
(sp.simplify(firstStep)
) 按预期输出 1。
是否有一些 sympy 函数可以直接 简化带有 exp(i.wt)、exp(-i.wt) 项与 sin(wt) 混合的表达式), cos(wt) 项 ?
感谢回答
有很多函数可以像这样操作表达式。最简单的化简方式就是要么将exp改写为sin,要么将sin改写为exp:
In [22]: myFunc
Out[22]:
⎛ ⅈ⋅ω⋅t 2 -ⅈ⋅ω⋅t 2 ⎞ ⎛ ⅈ⋅ω⋅t 2 -ⅈ⋅ω⋅t 2 ⎞ 2 2
⎝ℯ ⋅sin (θ) + ℯ ⋅cos (θ)⎠⋅⎝ℯ ⋅cos (θ) + ℯ ⋅sin (θ)⎠ + sin (2⋅θ)⋅sin (ω⋅t)
In [23]: myFunc.expand()
Out[23]:
2⋅ⅈ⋅ω⋅t 2 2 4 2 2 4 -2⋅ⅈ⋅ω⋅t 2 2
ℯ ⋅sin (θ)⋅cos (θ) + sin (θ) + sin (2⋅θ)⋅sin (ω⋅t) + cos (θ) + ℯ ⋅sin (θ)⋅cos (θ)
In [24]: myFunc.rewrite(exp)
Out[24]:
⎛ 2 2 ⎞ ⎛ 2 2 ⎞ 2
⎜⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⅈ⋅ω⋅t⎟ ⎜⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⎛ ⅈ⋅θ -ⅈ⋅θ⎞ -ⅈ⋅ω⋅t⎟ ⎛ 2⋅ⅈ⋅θ -2⋅ⅈ⋅θ⎞ ⎛ ⅈ⋅ω⋅t -ⅈ⋅ω⋅t
⎜⎜ℯ ℯ ⎟ -ⅈ⋅ω⋅t ⎝ℯ - ℯ ⎠ ⋅ℯ ⎟ ⎜⎜ℯ ℯ ⎟ ⅈ⋅ω⋅t ⎝ℯ - ℯ ⎠ ⋅ℯ ⎟ ⎝ℯ - ℯ ⎠ ⋅⎝ℯ - ℯ
⎜⎜──── + ─────⎟ ⋅ℯ - ──────────────────────⎟⋅⎜⎜──── + ─────⎟ ⋅ℯ - ───────────────────────⎟ + ─────────────────────────────────────
⎝⎝ 2 2 ⎠ 4 ⎠ ⎝⎝ 2 2 ⎠ 4 ⎠ 16
2
⎞
⎠
──
In [25]: myFunc.rewrite(exp).expand()
Out[25]: 1
In [26]: myFunc.rewrite(sin)
Out[26]:
⎛ 2 2⎛ π⎞⎞ ⎛ 2⎛ π⎞ 2
⎜(-ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin (θ) + (ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin ⎜θ + ─⎟⎟⋅⎜(-ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin ⎜θ + ─⎟ + (ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin
⎝ ⎝ 2⎠⎠ ⎝ ⎝ 2⎠
⎞ 2 2
(θ)⎟ + sin (2⋅θ)⋅sin (ω⋅t)
⎠
In [27]: myFunc.rewrite(sin).expand()
Out[27]:
4 2 4 2 2 2 2⎛ π⎞ 2 2⎛ π⎞ 2 2 2 2
sin (θ)⋅sin (ω⋅t) + sin (θ)⋅cos (ω⋅t) - 2⋅sin (θ)⋅sin (ω⋅t)⋅sin ⎜θ + ─⎟ + 2⋅sin (θ)⋅sin ⎜θ + ─⎟⋅cos (ω⋅t) + sin (2⋅θ)⋅sin (ω⋅t) + sin (ω⋅t)⋅s
⎝ 2⎠ ⎝ 2⎠
4⎛ π⎞ 4⎛ π⎞ 2
in ⎜θ + ─⎟ + sin ⎜θ + ─⎟⋅cos (ω⋅t)
⎝ 2⎠ ⎝ 2⎠
In [28]: myFunc.rewrite(sin).expand().trigsimp()
Out[28]: 1
我使用 sympy 对虚数指数项 (exp(i.a)) 进行符号计算,但我在简化方面遇到了问题。 比如我得到了如下函数(经过一些哈密尔顿对角化和时间演化,这不是本题的问题):
import sympy as sp
w, th, t =sp.symbols("omega theta t", real=True)
myFunc = (sp.exp(sp.I*w*t)*sp.sin(th)**2 + sp.exp(-sp.I*w*t)*sp.cos(th)**2)*(sp.exp(sp.I*w*t)*sp.cos(th)**2 + sp.exp(-sp.I*w*t)*sp.sin(th)**2) + sp.sin(2*th)**2*sp.sin(w*t)**2
在计算过程中,sin(w.t) 和 cos(w.t) 项是从 exp(-i.wt) 和 exp(i.wt) 隐式生成的。这个是正常的。但是,我无法使用 https://docs.sympy.org/latest/tutorial/simplification.html.
中的不同方法来简化它们但是,在上面的示例中,如果 sinus(w.t) 明确地替换为 (exp(i.w.t)-exp(-i.w.t)) /(2.i))
firstStep=myFunc.subs(sp.sin(w*t),((sp.exp(sp.I*w*t)-sp.exp(-sp.I*w*t))/(2*sp.I)))
(sp.simplify(firstStep)
) 按预期输出 1。
是否有一些 sympy 函数可以直接 简化带有 exp(i.wt)、exp(-i.wt) 项与 sin(wt) 混合的表达式), cos(wt) 项 ?
感谢回答
有很多函数可以像这样操作表达式。最简单的化简方式就是要么将exp改写为sin,要么将sin改写为exp:
In [22]: myFunc
Out[22]:
⎛ ⅈ⋅ω⋅t 2 -ⅈ⋅ω⋅t 2 ⎞ ⎛ ⅈ⋅ω⋅t 2 -ⅈ⋅ω⋅t 2 ⎞ 2 2
⎝ℯ ⋅sin (θ) + ℯ ⋅cos (θ)⎠⋅⎝ℯ ⋅cos (θ) + ℯ ⋅sin (θ)⎠ + sin (2⋅θ)⋅sin (ω⋅t)
In [23]: myFunc.expand()
Out[23]:
2⋅ⅈ⋅ω⋅t 2 2 4 2 2 4 -2⋅ⅈ⋅ω⋅t 2 2
ℯ ⋅sin (θ)⋅cos (θ) + sin (θ) + sin (2⋅θ)⋅sin (ω⋅t) + cos (θ) + ℯ ⋅sin (θ)⋅cos (θ)
In [24]: myFunc.rewrite(exp)
Out[24]:
⎛ 2 2 ⎞ ⎛ 2 2 ⎞ 2
⎜⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⅈ⋅ω⋅t⎟ ⎜⎛ ⅈ⋅θ -ⅈ⋅θ⎞ ⎛ ⅈ⋅θ -ⅈ⋅θ⎞ -ⅈ⋅ω⋅t⎟ ⎛ 2⋅ⅈ⋅θ -2⋅ⅈ⋅θ⎞ ⎛ ⅈ⋅ω⋅t -ⅈ⋅ω⋅t
⎜⎜ℯ ℯ ⎟ -ⅈ⋅ω⋅t ⎝ℯ - ℯ ⎠ ⋅ℯ ⎟ ⎜⎜ℯ ℯ ⎟ ⅈ⋅ω⋅t ⎝ℯ - ℯ ⎠ ⋅ℯ ⎟ ⎝ℯ - ℯ ⎠ ⋅⎝ℯ - ℯ
⎜⎜──── + ─────⎟ ⋅ℯ - ──────────────────────⎟⋅⎜⎜──── + ─────⎟ ⋅ℯ - ───────────────────────⎟ + ─────────────────────────────────────
⎝⎝ 2 2 ⎠ 4 ⎠ ⎝⎝ 2 2 ⎠ 4 ⎠ 16
2
⎞
⎠
──
In [25]: myFunc.rewrite(exp).expand()
Out[25]: 1
In [26]: myFunc.rewrite(sin)
Out[26]:
⎛ 2 2⎛ π⎞⎞ ⎛ 2⎛ π⎞ 2
⎜(-ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin (θ) + (ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin ⎜θ + ─⎟⎟⋅⎜(-ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin ⎜θ + ─⎟ + (ⅈ⋅sin(ω⋅t) + cos(ω⋅t))⋅sin
⎝ ⎝ 2⎠⎠ ⎝ ⎝ 2⎠
⎞ 2 2
(θ)⎟ + sin (2⋅θ)⋅sin (ω⋅t)
⎠
In [27]: myFunc.rewrite(sin).expand()
Out[27]:
4 2 4 2 2 2 2⎛ π⎞ 2 2⎛ π⎞ 2 2 2 2
sin (θ)⋅sin (ω⋅t) + sin (θ)⋅cos (ω⋅t) - 2⋅sin (θ)⋅sin (ω⋅t)⋅sin ⎜θ + ─⎟ + 2⋅sin (θ)⋅sin ⎜θ + ─⎟⋅cos (ω⋅t) + sin (2⋅θ)⋅sin (ω⋅t) + sin (ω⋅t)⋅s
⎝ 2⎠ ⎝ 2⎠
4⎛ π⎞ 4⎛ π⎞ 2
in ⎜θ + ─⎟ + sin ⎜θ + ─⎟⋅cos (ω⋅t)
⎝ 2⎠ ⎝ 2⎠
In [28]: myFunc.rewrite(sin).expand().trigsimp()
Out[28]: 1