Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Symphy认为只有实变量的函数是复杂的?_Python_Sympy - Fatal编程技术网

Python 为什么Symphy认为只有实变量的函数是复杂的?

Python 为什么Symphy认为只有实变量的函数是复杂的?,python,sympy,Python,Sympy,我一直在试图让Symphy为我简化这个复杂的代数表达式: 其中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

我一直在试图让Symphy为我简化这个复杂的代数表达式:

其中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()

由于我不理解的原因,Salm拒绝承认相位的大小是1(即我们可以消除绝对值符号内的表达式的最右边的乘法指数)。我测试了如果绝对值符号中有一个非常简单的指数,Symphy是否会简化这个场景。似乎没有:

>>> 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)
我得到了更丑陋的表情:

这确实修复了上述合成场景:

>>> 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()
并将
预览
更改为
打印
时,我得到了613.8KB的文本输出!查看输出文件的第一页和最后一页,它实际上看起来像一个非常巨大的表达式(即,我不认为它是一些愚蠢的长错误消息或类似的东西)。难怪我试图简化程序时程序崩溃了:)


我不知道第二种方法出了什么问题,但从第一种方法的输出来看,sympy似乎没有意识到实变量平方和的平方根也是实的。我该怎么做才能解决这个问题?是否有一些参数需要传递给某个函数,告诉它Gamma和Delta的平方和的平方根是实数?

任何帮助都将不胜感激

Symphy的开发版本(即将发布为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或使用

您使用的是什么版本的Symphy?@thisch版本0.7.4.1,根据
pip list | grep symphy
命令。刚刚遇到这个答案,想说---谢谢您的答案,也谢谢您对答案和代码的许可!我也没有SA许可证,当我看到其他人也这样做时,我会受到鼓励。快乐的黑客!