簡體   English   中英

為什么sympy認為只有實變量的函數是復雜的?

[英]Why does sympy think that a function of only real variables is complex?

我一直在努力為我簡化這個復雜的代數表達式:
表達
Delta,Gamma,t和hbar是真實的。 我用來生成這個表達式的代碼是:

from __future__ import division
from pylab import *
from sympy import *

def main():
    d, g, t = symbols("Delta Gamma t", real=True)
    hbar = symbols("hbar", positive=True, real=True)
    dg = sqrt(d**2 + g**2)
    S = simplify(Matrix([[(dg - g) / d, -(g + dg)/d], [1, 1]]))
    D = simplify(Matrix([[exp(I * t * dg / hbar), 0], [0, exp(-I * t * dg / hbar)]]))
    Sinverse = simplify(Matrix([[d / (2*dg), (g / dg + 1)/2], [-d / (2 * dg), 1/2 - g / (2*dg)]]))
    U = simplify(S * D * Sinverse)
    initial = Matrix([[1], [0]])
    later = simplify(U * initial)
    P1 = simplify(abs(later[0])**2)
    preview(P1)

if __name__=="__main__":
    main()

由於我不理解的原因,sympy拒絕承認階段的大小為1(即我們可以消除絕對值符號內表達式最右側的乘法指數)。 我測試了如果我們在絕對值符號中有一個非常簡單的指數,那么sympy是否會簡化這種情況。 似乎不是:

>>> from pylab import *
>>> from sympy import *
>>> t = symbols("t", real=True)
>>> z = exp(t*I)
>>> abs(z).simplify()
Abs(exp(I*t))

我已經嘗試了兩個針對這個問題的補救措施,其中任何一個都沒有效果:


(1)用參數乘以參數的復共軛替換絕對值符號的平方。 當我改變main()函數的結尾時:

    ...
    P1 = simplify(later[0] * later[0].conjugate())
    preview(P1)

我得到了更加丑陋的表達:

表達式2

這確實修復了上面組成的情節:

>>> from pylab import *
>>> from sympy import *
>>> t = symbols("t", real=True)
>>> z = exp(t*I)
>>> abs(z).simplify()
Abs(exp(I*t))
>>> z * z.conjugate()
1

(2)用關鍵字complex=True擴展幅度,然后簡化。 此方法還解決了構成方案:

>>> from pylab import *
>>> from sympy import *
>>> t = symbols("t", real=True)
>>> z = exp(t*I)
>>> abs(z).simplify()
Abs(exp(I*t))
>>> abs(z).expand(complex=True).simplify()
1

但是,我的實際表達卻滑稽地失敗了。 當我調整main()函數以使用此方法時:

    ...
    P1 = (abs(later[0])**2).expand(complex=True).simplify()
    preview(P1)

程序崩潰了。 當我取下.simplify()並將preview更改為print ,我得到613.8 kB的文本輸出! 看一下輸出文件的第一頁和最后一頁,它實際上看起來像一個非常巨大的表達式(即我不認為它是一些愚蠢的長錯誤信息或類似的東西)。 難怪當我試圖簡化它時程序崩潰了:)


我不知道第二種方法出了什么問題,但是看第一種方法的輸出,看來同情並沒有意識到實變量的平方和的平方根也是實數。 我該怎么做才能解決這個問題? 是否有一些參數我需要傳遞給某個函數來告訴它Gamma和Delta的平方和的平方根是一個實數?
任何幫助將不勝感激!

看起來SymPy的開發版本(即將發布為1.0)可以實現這種簡化:

In [1]: t = Symbol('t', real=True)

In [2]: abs(exp(-t*I))
Out[2]: 1

以我為例,我得到了

In [13]: P1
Out[13]:
                                                            2
 │                                                _________│
 │                                               ╱  2    2 │
 │                                       2⋅ⅈ⋅t⋅╲╱  Δ  + Γ  │
 │       _________   ⎛       _________⎞  ──────────────────│
 │      ╱  2    2    ⎜      ╱  2    2 ⎟          h̅        │
-│Γ + ╲╱  Δ  + Γ   - ⎝Γ - ╲╱  Δ  + Γ  ⎠⋅ℯ                  │
──────────────────────────────────────────────────────────────
                            2      2
                         4⋅Δ  + 4⋅Γ

但是我檢查了並且最新的穩定版本(0.7.6.1)沒有這樣做,因此您需要等待1.0或使用git版本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM