Wigner 符号¶
Wigner, Clebsch-Gordan, Racah, 和 Gaunt 系数
用于精确计算Wigner 3j、6j、9j、Clebsch-Gordan、Racah以及Gaunt系数的函数集合,所有计算结果均为有理数乘以有理数的平方根 [Rafa391d642cb-Rasch03]。
有关更多详细信息和示例,请参阅各个函数的描述。
引用
‘Clebsch-Gordan 系数的对称性性质’, T. Regge, Nuovo Cimento, 第10卷, 第544页 (1958)
‘Racah系数的对称性性质’, T. Regge, Nuovo Cimento, 第11卷, pp. 116 (1959)
A. R. Edmonds. Angular momentum in quantum mechanics. Investigations in physics, 4.; Investigations in physics, no. 4. Princeton, N.J., Princeton University Press, 1957.
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)
‘FORTRAN 程序用于三个球谐函数的积分’, A. Liberato de Brito, 计算物理通讯, 第25卷, 第81-85页 (1982)
‘实球谐函数的耦合系数的某些性质及其与Gaunt系数的关系’, H. H. H. Homeier 和 E. O. Steinborn J. Mol. Struct., 第368卷, 第31-37页 (1996)
致谢与版权¶
此代码经所有作者许可,取自Sage:
https://groups.google.com/forum/#!topic/sage-devel/M4NZdu-7O38
- 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.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 ⎦