Wigner 符号

Wigner, Clebsch-Gordan, Racah, 和 Gaunt 系数

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

有关更多详细信息和示例,请参阅各个函数的描述。

引用

[Rafa391d642cb-Regge58]

‘Clebsch-Gordan 系数的对称性性质’, T. Regge, Nuovo Cimento, 第10卷, 第544页 (1958)

[Rafa391d642cb-Regge59]

‘Racah系数的对称性性质’, T. Regge, Nuovo Cimento, 第11卷, pp. 116 (1959)

[Rafa391d642cb-Edmonds74]

A. R. Edmonds. Angular momentum in quantum mechanics. Investigations in physics, 4.; Investigations in physics, no. 4. Princeton, N.J., Princeton University Press, 1957.

[Rafa391d642cb-Rasch03]

J. Rasch and A. C. H. Yu, ‘Efficient Storage Scheme for Pre-calculated Wigner 3j, 6j and Gaunt Coefficients’, SIAM J. Sci. Comput. Volume 25, Issue 4, pp. 1416-1428 (2003)

[Rafa391d642cb-Liberatodebrito82]

‘FORTRAN 程序用于三个球谐函数的积分’, A. Liberato de Brito, 计算物理通讯, 第25卷, 第81-85页 (1982)

[Rafa391d642cb-Homeier96]

‘实球谐函数的耦合系数的某些性质及其与Gaunt系数的关系’, H. H. H. Homeier 和 E. O. Steinborn J. Mol. Struct., 第368卷, 第31-37页 (1996)

作者

  • 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): 添加了实际的 Gaunt 系数

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

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

计算 Clebsch-Gordan 系数。 \(\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

整数或半整数。

返回:
有理数乘以有理数的平方根。

注释

Clebsch-Gordan 系数将通过其与 Wigner 3j 符号的关系来计算:

\[\left\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \right\rangle =(-1)^{j_1-j_2+m_3} \sqrt{2j_3+1} \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,-m_3)\]

另请参阅关于 Wigner 3j 符号的文档,它们展示的更高对称性关系比 Clebsch-Gordan 系数更为复杂。

示例

>>> 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
sympy.physics.wigner.dot_rot_grad_Ynm(j, p, l, m, theta, phi)[源代码][源代码]

返回球谐函数旋转梯度的点积。

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

整数。

prec - 精度,默认值:``None``。

提供一个精度可以显著加快计算速度。

返回:
有理数乘以有理数的平方根
(如果 prec=None),或者如果给定精度则为实数。

注释

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

  • 在任何列的排列下不变

    \[\begin{split}\begin{aligned} Y(l_1,l_2,l_3,m_1,m_2,m_3) &=Y(l_3,l_1,l_2,m_3,m_1,m_2) \\ &=Y(l_2,l_3,l_1,m_2,m_3,m_1) \\ &=Y(l_3,l_2,l_1,m_3,m_2,m_1) \\ &=Y(l_1,l_3,l_2,m_1,m_3,m_2) \\ &=Y(l_2,l_1,l_3,m_2,m_1,m_3) \end{aligned}\end{split}\]
  • 在空间反演下不变,即

    \[Y(l_1,l_2,l_3,m_1,m_2,m_3) =Y(l_1,l_2,l_3,-m_1,-m_2,-m_3)\]
  • 关于 \(3j\) 符号所继承的 72 种 Regge 对称性是对称的 [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}\)

示例

>>> 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.006895004219221134484332976156744208248842039317638217822322799675

将非整数值用于 \(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
sympy.physics.wigner.racah(aa, bb, cc, dd, ee, ff, prec=None)[源代码][源代码]

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

参数:
a, …, f

整数或半整数。

prec

精度,默认值:None。提供一个精度可以显著加快计算速度。

返回:
有理数乘以有理数的平方根
(如果 prec=None),或者如果给定精度则为实数。

注释

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

\[\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)\]

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

示例

>>> from sympy.physics.wigner import racah
>>> racah(3,3,3,3,3,3)
-1/14
sympy.physics.wigner.real_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

整数。

prec - 精度,默认值:``None``。

提供一个精度可以显著加快计算速度。

返回:
有理数乘以有理数的平方根。

注释

实际的 Gaunt 系数继承自标准的 Gaunt 系数,其在任何 \((l_i, m_i)\) 对的排列下不变,并且要求 \(l_i\) 的和为偶数以产生非零值。它还遵循以下对称规则:

  • \(l_1\)\(l_2\)\(l_3\) 不满足条件 \(l_1 \in \{l_{\text{max}}, l_{\text{max}}-2, \ldots, l_{\text{min}}\}\) 时为零,其中 \(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{如果}\, \kappa(l_2, l_3, m_2, m_3) + l_{\text{max}}\, \text{是偶数} \\ \kappa(l_2, l_3, m_2, m_3)+1 & \text{如果}\, \kappa(l_2, l_3, m_2, m_3) + l_{\text{max}}\, \text{是奇数}\end{cases} \end{aligned}\end{split}\]

    并且 \(\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)}\)

  • 对于奇数个负数 \(m_i\),结果为零

示例

>>> 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.00002480019791932209313156167176797577821140084216297395518482071448
将非整数值用于 \(l\)\(m\) 是错误的:

real_gaunt(2.8,0.5,1.3,0,0,0) 回溯 (最近一次调用最后): … ValueError: l 值必须是整数 real_gaunt(2,2,4,0.7,1,-3.4) 回溯 (最近一次调用最后): … ValueError: m 值必须是整数

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

计算Wigner 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

整数或半整数。

返回:
有理数乘以有理数的平方根。

注释

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

  • 在任何列的排列下是不变的(除了符号变化,其中 \(J:=j_1+j_2+j_3\)):

    \[\begin{split}\begin{aligned} \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3) &=\operatorname{Wigner3j}(j_3,j_1,j_2,m_3,m_1,m_2) \\ &=\operatorname{Wigner3j}(j_2,j_3,j_1,m_2,m_3,m_1) \\ &=(-1)^J \operatorname{Wigner3j}(j_3,j_2,j_1,m_3,m_2,m_1) \\ &=(-1)^J \operatorname{Wigner3j}(j_1,j_3,j_2,m_1,m_3,m_2) \\ &=(-1)^J \operatorname{Wigner3j}(j_2,j_1,j_3,m_2,m_1,m_3) \end{aligned}\end{split}\]
  • 在空间反演下不变,即

    \[\operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3) =(-1)^J \operatorname{Wigner3j}(j_1,j_2,j_3,-m_1,-m_2,-m_3)\]
  • 关于 [Regge58] 的工作,基于72个额外的对称性,具有对称性

  • 对于 \(j_1\), \(j_2\), \(j_3\) 不满足三角关系的零

  • 对于 \(m_1 + m_2 + m_3 eq 0\) 为零

  • 违反任何一项条件则为零

    \(m_1 \in \{-|j_1|, \ldots, |j_1|\}\), \(m_2 \in \{-|j_2|, \ldots, |j_2|\}\), \(m_3 \in \{-|j_3|, \ldots, |j_3|\}\)

示例

>>> 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
sympy.physics.wigner.wigner_6j(j_1, j_2, j_3, j_4, j_5, j_6, prec=None)[源代码][源代码]

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

参数:
j_1, …, j_6

整数或半整数。

prec

精度,默认值:None。提供一个精度可以显著加快计算速度。

返回:
有理数乘以有理数的平方根
(如果 prec=None),或者如果给定精度则为实数。

注释

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

\[\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)\]

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

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

    \[\begin{split}\begin{aligned} \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) &=\operatorname{Wigner6j}(j_3,j_1,j_2,j_6,j_4,j_5) \\ &=\operatorname{Wigner6j}(j_2,j_3,j_1,j_5,j_6,j_4) \\ &=\operatorname{Wigner6j}(j_3,j_2,j_1,j_6,j_5,j_4) \\ &=\operatorname{Wigner6j}(j_1,j_3,j_2,j_4,j_6,j_5) \\ &=\operatorname{Wigner6j}(j_2,j_1,j_3,j_5,j_4,j_6) \end{aligned}\end{split}\]
  • 它们在交换任意两列的上、下参数时是不变的,即。

    \[\begin{aligned} \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) &=\operatorname{Wigner6j}(j_1,j_5,j_6,j_4,j_2,j_3)\n &=\operatorname{Wigner6j}(j_4,j_2,j_6,j_1,j_5,j_3)\n &=\operatorname{Wigner6j}(j_4,j_5,j_3,j_1,j_2,j_6) \end{aligned}\]
  • 另外6种对称性 [Regge59] 导致总共144种对称性

  • 仅当任意三个 \(j\) 满足三角关系时为非零

示例

>>> 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
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,
)[源代码][源代码]

计算Wigner 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

整数或半整数。

prec精度,默认

None。提供一个精度可以显著加快计算速度。

返回:
有理数乘以有理数的平方根
(如果 prec=None),或者如果给定精度则为实数。

示例

>>> from sympy.physics.wigner import wigner_9j
>>> wigner_9j(1,1,1, 1,1,1, 1,1,0, prec=64)
0.05555555555555555555555555555555555555555555555555555555555555555
>>> wigner_9j(1/2,1/2,0, 1/2,3/2,1, 0,1,1, prec=64)
0.1666666666666666666666666666666666666666666666666666666666666667

如果参数不是整数或半整数值,或者不满足三角关系,则会出现错误:

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
sympy.physics.wigner.wigner_d(J, alpha, beta, gamma)[源代码][源代码]

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

返回:
一个表示相应欧拉角旋转的矩阵(在基底中)
\(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)\]
这些组件是使用一般形式 [Edmonds74] 计算的。
方程 4.1.12.

示例

最简单的例子:

>>> 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 矩阵。

返回:
一个表示相应欧拉角旋转的矩阵(在基底中)
\(J_z\) 的特征向量)。
\[\mathcal{d}_{\beta} = \exp\big( \frac{i\beta}{\hbar} J_y\big)\]
这些组件是使用一般形式 [Edmonds74] 计算的。
方程 4.1.15.

示例

>>> 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⎠     ⎦

[Edmonds74] 中的表4

>>> 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             ⎦