维格纳符号#

维格纳、克莱布希-戈尔丹、拉卡和冈特系数

用于精确计算Wigner 3j,6j,9j,Clebsch Gordan,Racah以及Gaunt系数的函数集合,所有函数都计算为有理数乘以有理数的平方根 [Rasch03].

有关详细信息和示例,请参见各个函数的说明。

工具书类#

[Regge58] (1,2)

“克莱布希-戈尔丹系数的对称性”,T.雷格,新西门托,第10卷,第544页(1958年)

[Regge59]

“拉卡系数的对称性”,T.Regge,Nuovo Cimento,第11卷,第116页(1959年)

[Edmonds74] (1,2,3,4,5,6,7,8,9,10)

A、 R.埃德蒙兹。量子力学中的角动量。物理研究,4;《物理研究》,第4期。普林斯顿,新泽西州,普林斯顿大学出版社,1957年。

[Rasch03] (1,2,3,4,5,6,7,8,9)

J、 Rasch和A.C.H.Yu,“预计算Wigner 3j,6j和Gaunt系数的有效存储方案”,暹罗J.Sci。计算机。第25卷第4期,第1416-1428页(2003年)

[Liberatodebrito82]

“三次球谐函数积分的FORTRAN程序”,A.Liberato de Brito,计算机。物理。《公社》,第25卷,第81-85页(1982年)

[Homeier96] (1,2)

'Some Properties of the Coupling Coefficients of Real Spherical Harmonics and Their Relation to Gaunt Coefficients', H. H. H. Homeier and E. O. Steinborn J. Mol. Struct., Volume 368, pp. 31-37 (1996)

Authors#

  • Jens-Rasch(2009-03-24):Sage的初始版本

  • Jens-Rasch(2009-05-31):更新为sage-4.0

  • Oscar Gerardo Lazo Arjona(2017-06-18):增加了Wigner D矩阵

  • Phil Adam LeMaitre (2022-09-19): added real Gaunt coefficient

版权所有(2008)Jens Rasch<jyr2000@gmail.com>

sympy.physics.wigner.clebsch_gordan(j_1, j_2, j_3, m_1, m_2, m_3)[源代码]#

Calculates the Clebsch-Gordan coefficient. \(\left\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \right\rangle\).

此函数的参考是 [Edmonds74].

参数:

j_1, j_2, j_3, m_1, m_2, m_3 :

Integer or half integer.

返回:

有理数乘以有理数的平方根。

实例

>>> from sympy import S
>>> from sympy.physics.wigner import clebsch_gordan
>>> clebsch_gordan(S(3)/2, S(1)/2, 2, S(3)/2, S(1)/2, 2)
1
>>> clebsch_gordan(S(3)/2, S(1)/2, 1, S(3)/2, -S(1)/2, 1)
sqrt(3)/2
>>> clebsch_gordan(S(3)/2, S(1)/2, 1, -S(1)/2, S(1)/2, 0)
-sqrt(2)/2

笔记

Clebsch-Gordan系数将通过其与Wigner 3j符号的关系进行评估:

\[\左\langle j_1 m_1\;j_2 m_2 | j_3 m_3\右\r格\]

另请参阅有关Wigner 3j符号的文档,其对称关系比Clebsch-Gordan系数高得多。

Authors

  • Jens Rasch(2009-03-24):初始版本

sympy.physics.wigner.dot_rot_grad_Ynm(j, p, l, m, theta, phi)[源代码]#

点旋转梯度的球谐函数。

解释

此函数返回以下表达式的右侧:

\[\vec{R}Y{_j^{p}} \cdot \vec{R}Y{_l^{m}} = (-1)^{m+p} \sum\limits_{k=|l-j|}^{l+j}Y{_k^{m+p}} * \alpha_{l,m,j,p,k} * \frac{1}{2} (k^2-j^2-l^2+k-j-l)\]

争论

j、 p,l,m。。。。球谐函数中的指数(表达式或整数)θ,φ。。。。球谐函数中的角变元

例子

>>> from sympy import symbols
>>> from sympy.physics.wigner import dot_rot_grad_Ynm
>>> theta, phi = symbols("theta phi")
>>> dot_rot_grad_Ynm(3, 2, 2, 0, theta, phi).doit()
3*sqrt(55)*Ynm(5, 2, theta, phi)/(11*sqrt(pi))
sympy.physics.wigner.gaunt(l_1, l_2, l_3, m_1, m_2, m_3, prec=None)[源代码]#

计算Gaunt系数。

参数:

l_1, l_2, l_3, m_1, m_2, m_3 :

Integer.

prec - precision, default: ``None``.

Providing a precision can drastically speed up the calculation.

返回:

Rational number times the square root of a rational number

(if prec=None), or real number if a precision is given.

解释

Gaunt系数定义为三个球谐函数的积分:

\[\开始{aligned}\]

实例

>>> from sympy.physics.wigner import gaunt
>>> gaunt(1,0,1,1,0,-1)
-1/(2*sqrt(pi))
>>> gaunt(1000,1000,1200,9,3,-12).n(64)
0.00689500421922113448...

对于使用非整数值是错误的 \(l\)\(m\) ::

sage: gaunt(1.2,0,1.2,0,0,0)
Traceback (most recent call last):
...
ValueError: l values must be integer
sage: gaunt(1,0,1,1.1,0,-1.1)
Traceback (most recent call last):
...
ValueError: m values must be integer

笔记

Gaunt系数遵循以下对称规则:

  • 在任何列排列下不变

    \[\开始{aligned}\]
  • 空间拐点不变,即。

    \[是(1,2,3,1,2,3)\]
  • 关于规则72对称的继承 \(3j\) 符号 [Regge58]

  • \(l_1\)\(l_2\)\(l_3\) 不满足三角关系

  • 违反任何一个条件,则为零: \(l_1 \ge |m_1|\)\(l_2 \ge |m_2|\)\(l_3 \ge |m_3|\)

  • 只有偶数和非零 \(l_i\) ,即 \(L = l_1 + l_2 + l_3 = 2n\) 对于 \(n\) 在里面 \(\mathbb{{N}}\)

Algorithms

此函数使用 [Liberatodebrito82] 准确计算出Gaunt的值。注意,该公式包含大因式上的交替和,因此不适用于有限精度算法,只适用于计算机代数系统 [Rasch03].

Authors

Jens Rasch (2009-03-24): initial version for Sage.

sympy.physics.wigner.racah(aa, bb, cc, dd, ee, ff, prec=None)[源代码]#

计算Racah符号 \(W(a,b,c,d;e,f)\) .

参数:

a, ..., f :

Integer or half integer.

prec :

Precision, default: None. Providing a precision can drastically speed up the calculation.

返回:

Rational number times the square root of a rational number

(if prec=None), or real number if a precision is given.

实例

>>> from sympy.physics.wigner import racah
>>> racah(3,3,3,3,3,3)
-1/14

笔记

Racah符号与Wigner 6j符号相关:

\[\操作员姓名{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)\]

请参阅6j符号,了解其更丰富的对称性和其他属性。

算法

此函数使用 [Edmonds74] 精确计算6j符号的值。注意,该公式包含大因式上的交替和,因此不适用于有限精度算法,只适用于计算机代数系统 [Rasch03].

Authors

  • Jens Rasch(2009-03-24):初始版本

sympy.physics.wigner.real_gaunt(l_1, l_2, l_3, m_1, m_2, m_3, prec=None)[源代码]#

Calculate the real Gaunt coefficient.

参数:

l_1, l_2, l_3, m_1, m_2, m_3 :

Integer.

prec - precision, default: ``None``.

Providing a precision can drastically speed up the calculation.

返回:

有理数乘以有理数的平方根。

解释

The real Gaunt coefficient is defined as the integral over three real spherical harmonics:

\[\begin{split}\begin{aligned} \operatorname{RealGaunt}(l_1,l_2,l_3,m_1,m_2,m_3) &=\int Z^{m_1}_{l_1}(\Omega) Z^{m_2}_{l_2}(\Omega) Z^{m_3}_{l_3}(\Omega) \,d\Omega \\ \end{aligned}\end{split}\]

Alternatively, it can be defined in terms of the standard Gaunt coefficient by relating the real spherical harmonics to the standard spherical harmonics via a unitary transformation \(U\), i.e. \(Z^{m}_{l}(\Omega)=\sum_{m'}U^{m}_{m'}Y^{m'}_{l}(\Omega)\) [Homeier96]. The real Gaunt coefficient is then defined as

\[\begin{split}\begin{aligned} \operatorname{RealGaunt}(l_1,l_2,l_3,m_1,m_2,m_3) &=\int Z^{m_1}_{l_1}(\Omega) Z^{m_2}_{l_2}(\Omega) Z^{m_3}_{l_3}(\Omega) \,d\Omega \\ &=\sum_{m'_1 m'_2 m'_3} U^{m_1}_{m'_1}U^{m_2}_{m'_2}U^{m_3}_{m'_3} \operatorname{Gaunt}(l_1,l_2,l_3,m'_1,m'_2,m'_3) \end{aligned}\end{split}\]

The unitary matrix \(U\) has components

\[\begin{aligned} U^m_{m'} = \delta_{|m||m'|}*(\delta_{m'0}\delta_{m0} + \frac{1}{\sqrt{2}}\big[\Theta(m) \big(\delta_{m'm}+(-1)^{m'}\delta_{m'-m}\big)+i\Theta(-m)\big((-1)^{-m} \delta_{m'-m}-\delta_{m'm}*(-1)^{m'-m}\big)\big]) \end{aligned}\]

where \(\delta_{ij}\) is the Kronecker delta symbol and \(\Theta\) is a step function defined as

\[\begin{split}\begin{aligned} \Theta(x) = \begin{cases} 1 \,\text{for}\, x > 0 \\ 0 \,\text{for}\, x \leq 0 \end{cases} \end{aligned}\end{split}\]

实例

>>> from sympy.physics.wigner import real_gaunt
>>> real_gaunt(2,2,4,-1,-1,0)
-2/(7*sqrt(pi))
>>> real_gaunt(10,10,20,-9,-9,0).n(64)
-0.00002480019791932209313156167...
对于使用非整数值是错误的 \(l\)\(m\) ::

real_gaunt(2.8,0.5,1.3,0,0,0) Traceback (most recent call last): ... ValueError: l values must be integer real_gaunt(2,2,4,0.7,1,-3.4) Traceback (most recent call last): ... ValueError: m values must be integer

笔记

The real Gaunt coefficient inherits from the standard Gaunt coefficient, the invariance under any permutation of the pairs \((l_i, m_i)\) and the requirement that the sum of the \(l_i\) be even to yield a non-zero value. It also obeys the following symmetry rules:

  • zero for \(l_1\), \(l_2\), \(l_3\) not fulfiling the condition \(l_1 \in \{l_{\text{max}}, l_{\text{max}}-2, \ldots, l_{\text{min}}\}\), where \(l_{\text{max}} = l_2+l_3\),

    \[\begin{split}\begin{aligned} l_{\text{min}} = \begin{cases} \kappa(l_2, l_3, m_2, m_3) & \text{if}\, \kappa(l_2, l_3, m_2, m_3) + l_{\text{max}}\, \text{is even} \\ \kappa(l_2, l_3, m_2, m_3)+1 & \text{if}\, \kappa(l_2, l_3, m_2, m_3) + l_{\text{max}}\, \text{is odd}\end{cases} \end{aligned}\end{split}\]

    and \(\kappa(l_2, l_3, m_2, m_3) = \max{\big(|l_2-l_3|, \min{\big(|m_2+m_3|, |m_2-m_3|\big)}\big)}\)

  • zero for an odd number of negative \(m_i\)

Algorithms

This function uses the algorithms of [Homeier96] and [Rasch03] to calculate the value of the real Gaunt coefficient exactly. Note that the formula used in [Rasch03] contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03]. However, this function can in principle use any algorithm that computes the Gaunt coefficient, so it is suitable for finite precision arithmetic in so far as the algorithm which computes the Gaunt coefficient is.

sympy.physics.wigner.wigner_3j(j_1, j_2, j_3, m_1, m_2, m_3)[源代码]#

计算维格纳3j符号 \(\operatorname{{Wigner3j}}(j_1,j_2,j_3,m_1,m_2,m_3)\) .

参数:

j_1, j_2, j_3, m_1, m_2, m_3 :

Integer or half integer.

返回:

有理数乘以有理数的平方根。

实例

>>> from sympy.physics.wigner import wigner_3j
>>> wigner_3j(2, 6, 4, 0, 0, 0)
sqrt(715)/143
>>> wigner_3j(2, 6, 4, 0, 0, 1)
0

参数不是整数值或半整数值是错误的:

sage: wigner_3j(2.1, 6, 4, 0, 0, 0)
Traceback (most recent call last):
...
ValueError: j values must be integer or half integer
sage: wigner_3j(2, 6, 4, 1, 0, -1.1)
Traceback (most recent call last):
...
ValueError: m values must be integer or half integer

笔记

Wigner 3j符号遵循以下对称规则:

  • 任何列的变化都是不变的 \(J:=j_1+j_2+j_3\) ):

    \[\开始{aligned}\]
  • 空间拐点不变,即。

    \[\操作员姓名{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3)\]
  • 与72个附加对称对称性对称 [Regge58]

  • \(j_1\)\(j_2\)\(j_3\) 不满足三角关系

  • \(m_1 + m_2 + m_3 \neq 0\)

  • 违反任何一个条件都归零 \(j_1 \ge |m_1|\)\(j_2 \ge |m_2|\)\(j_3 \ge |m_3|\)

算法

此函数使用 [Edmonds74] 精确计算3j符号的值。注意,该公式包含大因式上的交替和,因此不适用于有限精度算法,只适用于计算机代数系统 [Rasch03].

Authors

  • Jens Rasch(2009-03-24):初始版本

sympy.physics.wigner.wigner_6j(j_1, j_2, j_3, j_4, j_5, j_6, prec=None)[源代码]#

计算维格纳6j符号 \(\operatorname{{Wigner6j}}(j_1,j_2,j_3,j_4,j_5,j_6)\) .

参数:

j_1, ..., j_6 :

Integer or half integer.

prec :

Precision, default: None. Providing a precision can drastically speed up the calculation.

返回:

Rational number times the square root of a rational number

(if prec=None), or real number if a precision is given.

实例

>>> from sympy.physics.wigner import wigner_6j
>>> wigner_6j(3,3,3,3,3,3)
-1/14
>>> wigner_6j(5,5,5,5,5,5)
1/52

参数不是整数值或半整数值或不满足三角形关系是错误的:

sage: wigner_6j(2.5,2.5,2.5,2.5,2.5,2.5)
Traceback (most recent call last):
...
ValueError: j values must be integer or half integer and fulfill the triangle relation
sage: wigner_6j(0.5,0.5,1.1,0.5,0.5,1.1)
Traceback (most recent call last):
...
ValueError: j values must be integer or half integer and fulfill the triangle relation

笔记

Wigner 6j符号与Racah符号相关,但表现出更多的对称性,详情如下。

\[\操作员姓名{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)\]

Wigner 6j符号遵循以下对称规则:

  • Wigner 6j符号在列的任何排列下保持不变:

    \[\开始{aligned}\]
  • 它们在任意两列的上下参数交换下是不变的,即。

    \[\操作员姓名{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)\]
  • 额外的6个对称性 [Regge59] 共有144个对称

  • 只有非零,如果有三倍 \(j\) 满足三角形关系

算法

此函数使用 [Edmonds74] 精确计算6j符号的值。注意,该公式包含大因式上的交替和,因此不适用于有限精度算法,只适用于计算机代数系统 [Rasch03].

sympy.physics.wigner.wigner_9j(j_1, j_2, j_3, j_4, j_5, j_6, j_7, j_8, j_9, prec=None)[源代码]#

计算维格纳9j符号 \(\operatorname{{Wigner9j}}(j_1,j_2,j_3,j_4,j_5,j_6,j_7,j_8,j_9)\) .

参数:

j_1, ..., j_9 :

Integer or half integer.

prec : precision, default

None. Providing a precision can drastically speed up the calculation.

返回:

Rational number times the square root of a rational number

(if prec=None), or real number if a precision is given.

实例

>>> from sympy.physics.wigner import wigner_9j
>>> wigner_9j(1,1,1, 1,1,1, 1,1,0, prec=64) # ==1/18
0.05555555...
>>> wigner_9j(1/2,1/2,0, 1/2,3/2,1, 0,1,1, prec=64) # ==1/6
0.1666666...

参数不是整数值或半整数值或不满足三角形关系是错误的:

sage: wigner_9j(0.5,0.5,0.5, 0.5,0.5,0.5, 0.5,0.5,0.5,prec=64)
Traceback (most recent call last):
...
ValueError: j values must be integer or half integer and fulfill the triangle relation
sage: wigner_9j(1,1,1, 0.5,1,1.5, 0.5,1,2.5,prec=64)
Traceback (most recent call last):
...
ValueError: j values must be integer or half integer and fulfill the triangle relation

算法

此函数使用 [Edmonds74] 精确计算3j符号的值。注意,该公式包含大因式上的交替和,因此不适用于有限精度算法,只适用于计算机代数系统 [Rasch03].

sympy.physics.wigner.wigner_d(J, alpha, beta, gamma)[源代码]#

返回角动量J的Wigner D矩阵。

返回:

A matrix representing the corresponding Euler angle rotation( in the basis

of eigenvectors of \(J_z\)).

\[\mathcal{D}_{\alpha \beta \gamma} = \exp\big( \frac{i\alpha}{\hbar} J_z\big) \exp\big( \frac{i\beta}{\hbar} J_y\big) \exp\big( \frac{i\gamma}{\hbar} J_z\big)\]

The components are calculated using the general form [Edmonds74],

equation 4.1.12.

解释

J :

An integer, half-integer, or SymPy symbol for the total angular momentum of the angular momentum space being rotated.

alpha, beta, gamma - Real numbers representing the Euler.

Angles of rotation about the so-called vertical, line of nodes, and figure axes. See [Edmonds74].

实例

最简单的例子:

>>> from sympy.physics.wigner import wigner_d
>>> from sympy import Integer, symbols, pprint
>>> half = 1/Integer(2)
>>> alpha, beta, gamma = symbols("alpha, beta, gamma", real=True)
>>> pprint(wigner_d(half, alpha, beta, gamma), use_unicode=True)
⎡  ⅈ⋅α  ⅈ⋅γ             ⅈ⋅α  -ⅈ⋅γ         ⎤
⎢  ───  ───             ───  ─────        ⎥
⎢   2    2     ⎛β⎞       2     2      ⎛β⎞ ⎥
⎢ ℯ   ⋅ℯ   ⋅cos⎜─⎟     ℯ   ⋅ℯ     ⋅sin⎜─⎟ ⎥
⎢              ⎝2⎠                    ⎝2⎠ ⎥
⎢                                         ⎥
⎢  -ⅈ⋅α   ⅈ⋅γ          -ⅈ⋅α   -ⅈ⋅γ        ⎥
⎢  ─────  ───          ─────  ─────       ⎥
⎢    2     2     ⎛β⎞     2      2      ⎛β⎞⎥
⎢-ℯ     ⋅ℯ   ⋅sin⎜─⎟  ℯ     ⋅ℯ     ⋅cos⎜─⎟⎥
⎣                ⎝2⎠                   ⎝2⎠⎦
sympy.physics.wigner.wigner_d_small(J, beta)[源代码]#

返回角动量J的小Wigner d矩阵。

返回:

A matrix representing the corresponding Euler angle rotation( in the basis

of eigenvectors of \(J_z\)).

\[\mathcal{d}_{\beta} = \exp\big( \frac{i\beta}{\hbar} J_y\big)\]

The components are calculated using the general form [Edmonds74],

equation 4.1.15.

解释

JAn integer, half-integer, or SymPy symbol for the total angular

旋转的角动量空间的动量。

betaA real number representing the Euler angle of rotation about

所谓的节点线。看到了吗 [Edmonds74].

实例

>>> from sympy import Integer, symbols, pi, pprint
>>> from sympy.physics.wigner import wigner_d_small
>>> half = 1/Integer(2)
>>> beta = symbols("beta", real=True)
>>> pprint(wigner_d_small(half, beta), use_unicode=True)
⎡   ⎛β⎞      ⎛β⎞⎤
⎢cos⎜─⎟   sin⎜─⎟⎥
⎢   ⎝2⎠      ⎝2⎠⎥
⎢               ⎥
⎢    ⎛β⎞     ⎛β⎞⎥
⎢-sin⎜─⎟  cos⎜─⎟⎥
⎣    ⎝2⎠     ⎝2⎠⎦
>>> pprint(wigner_d_small(2*half, beta), use_unicode=True)
⎡        2⎛β⎞              ⎛β⎞    ⎛β⎞           2⎛β⎞     ⎤
⎢     cos ⎜─⎟        √2⋅sin⎜─⎟⋅cos⎜─⎟        sin ⎜─⎟     ⎥
⎢         ⎝2⎠              ⎝2⎠    ⎝2⎠            ⎝2⎠     ⎥
⎢                                                        ⎥
⎢       ⎛β⎞    ⎛β⎞       2⎛β⎞      2⎛β⎞        ⎛β⎞    ⎛β⎞⎥
⎢-√2⋅sin⎜─⎟⋅cos⎜─⎟  - sin ⎜─⎟ + cos ⎜─⎟  √2⋅sin⎜─⎟⋅cos⎜─⎟⎥
⎢       ⎝2⎠    ⎝2⎠        ⎝2⎠       ⎝2⎠        ⎝2⎠    ⎝2⎠⎥
⎢                                                        ⎥
⎢        2⎛β⎞               ⎛β⎞    ⎛β⎞          2⎛β⎞     ⎥
⎢     sin ⎜─⎟        -√2⋅sin⎜─⎟⋅cos⎜─⎟       cos ⎜─⎟     ⎥
⎣         ⎝2⎠               ⎝2⎠    ⎝2⎠           ⎝2⎠     ⎦

从中的表4 [Edmonds74]

>>> pprint(wigner_d_small(half, beta).subs({beta:pi/2}), use_unicode=True)
⎡ √2   √2⎤
⎢ ──   ──⎥
⎢ 2    2 ⎥
⎢        ⎥
⎢-√2   √2⎥
⎢────  ──⎥
⎣ 2    2 ⎦
>>> pprint(wigner_d_small(2*half, beta).subs({beta:pi/2}),
... use_unicode=True)
⎡       √2      ⎤
⎢1/2    ──   1/2⎥
⎢       2       ⎥
⎢               ⎥
⎢-√2         √2 ⎥
⎢────   0    ── ⎥
⎢ 2          2  ⎥
⎢               ⎥
⎢      -√2      ⎥
⎢1/2   ────  1/2⎥
⎣       2       ⎦
>>> pprint(wigner_d_small(3*half, beta).subs({beta:pi/2}),
... use_unicode=True)
⎡ √2    √6    √6   √2⎤
⎢ ──    ──    ──   ──⎥
⎢ 4     4     4    4 ⎥
⎢                    ⎥
⎢-√6   -√2    √2   √6⎥
⎢────  ────   ──   ──⎥
⎢ 4     4     4    4 ⎥
⎢                    ⎥
⎢ √6   -√2   -√2   √6⎥
⎢ ──   ────  ────  ──⎥
⎢ 4     4     4    4 ⎥
⎢                    ⎥
⎢-√2    √6   -√6   √2⎥
⎢────   ──   ────  ──⎥
⎣ 4     4     4    4 ⎦
>>> pprint(wigner_d_small(4*half, beta).subs({beta:pi/2}),
... use_unicode=True)
⎡             √6            ⎤
⎢1/4   1/2    ──   1/2   1/4⎥
⎢             4             ⎥
⎢                           ⎥
⎢-1/2  -1/2   0    1/2   1/2⎥
⎢                           ⎥
⎢ √6                     √6 ⎥
⎢ ──    0    -1/2   0    ── ⎥
⎢ 4                      4  ⎥
⎢                           ⎥
⎢-1/2  1/2    0    -1/2  1/2⎥
⎢                           ⎥
⎢             √6            ⎥
⎢1/4   -1/2   ──   -1/2  1/4⎥
⎣             4             ⎦