简而言之,我的表达式包含p1
,p2
,q1
和q2
之间的乘法,我想使用[qi,pi]=ii*hb
,i={1,2}
将表达式赋予对称形式(pi^a*qi^b+qi^b*pi^a)/2
。
例如,对于p2*q2*p2^2
,我使用简化和一些替换获得(p2*q2^3+q2^3*p2)/2 + 1/2*ii*p2^2*hb
。但是我无法简化q2*q1^2*p2
,尽管我已经指定了一个规则q2*p2-> (p2*q2+q2*p2)/2 +ii/2*hb
,并且带有1和2的变量通勤。
更详细地说,here is the Mathematica code(我使用quantum package)。
当索引为1或2时,代码有效,但在使用两个索引时不起作用:
p2*q2*q1*q2
可以p2*q1*q2^2
,p2*q2*q2
可以进一步简化,但由于q1
,Mathematica不会这样做。
更详细:我正在尝试编写一个Mathematica代码,可以在appendix (eq. A2) in this paper中得到方程式 和我正在使用的this is the code。后一个文件中的代码与上面的代码略有不同,因为我无法让上面的代码运行,但它是理想的。
最后,我想将最终代码用于其他类型的哈密顿量,最高可达4次幂甚至更高。
我喜欢建议如何编写一个可以为我做有针对性的简化的软件包。
答案 0 :(得分:5)
如果您只是使用规则来简化(我假设您的意思是使用Replace[]
),那么如果您要替换的模式存在但不是以完全正确的形式存在则可能会出现问题。例如,Replace[q2*q1^2*p2,q2*p2->(p2*q2+q2*p2)/2]
的例子在这种情况下什么都不做(注意写q2*p2*q1^2
也无济于事,因为Mathematica在开始评估之前对所有输入进行排序。
我过去曾遇到类似Mathematica的简化问题,有两种策略取得了合理的成功。对不起,我不能给你一个具体的解决方案,我希望这些可以帮助你搞清楚。
解决方案1:您必须编写自己的ReplaceUnordered[form,rule]
函数,该函数会针对form
的所有不同排序解析rule
的可能应用。这可以使用Permutations[]
并使用HoldForm[]
。
解决方案2:使用Simplify[]
。特别是使用选项ComplexityFunction使非对称表达式更“昂贵”,并使用选项TransformationFunctions来指定自己的简化规则。
Here (pdf)是对Mathematica及其构造和评估过程的简短(ish)简介。
额外奖励解决方案:使用FORM这是专门为解决您遇到的问题而编写的语言。
编辑:额外额外奖励(可能非常简单)解决方案:rcollier指出SymmetricReduction[]
可能很容易做到你想要的。
另外还有一条道路:当我不得不用非交换变量进行计算时 我使用了this包,其中包含Grassmann变量的代数和微积分。