Wigner-D functions play the role of sine and cosine waves for rotations. Weighted sums of them can represent any square-integrable function on the rotation group \(\mathrm{SO}(3)\).
Each function has a non-negative degree \(n\) and two orders \(k\) and \(l\), both between \(-n\) and \(n\). The command WignerD evaluates a complete matrix of orders at once.
Evaluate one degree
A real number passed to WignerD is the second Euler angle \(\beta\). The result below
contains all Wigner-d functions of degree one at \(\beta=90\) degrees.
import matplotlib.pyplot as plt
import numpy as np
from mtex import *
beta = 90 * degree
d = WignerD(beta, 1)
d
array([[ 0.5 , -0.7071, -0.5 ],
[ 0.7071, 0. , 0.7071],
[-0.5 , -0.7071, 0.5 ]])
The rows and columns correspond to \(k=-1,0,1\) and \(l=-1,0,1\), respectively. In particular, the central value is zero at 90 degrees, while the corner values have magnitude \(0.5\).
Passing a rotation instead evaluates the generally complex Wigner-D functions. The
normalize flag selects MTEX’s \(L_2\) normalization.
R = rotation.byEuler(20 * degree, 40 * degree, 10 * degree)
W = WignerD(R, 1, normalize=True)
W
array([[1.3245+0.7647j, 0.1367-0.7753j, 0.1995-0.0352j],
[0.2693-0.7398j, 1.3268+0.j , 0.2693+0.7398j],
[0.1995+0.0352j, 0.1367+0.7753j, 1.3245-0.7647j]])
Follow the Wigner-d curves
The Wigner-d functions are ordinary functions of the single angle \(\beta\), so they can be drawn directly. Here are three entries from the degree-one matrix.
beta = np.linspace(0, np.pi, 181)
d = np.zeros((beta.size, 3))
for j in range(beta.size):
Dj = WignerD(beta[j], 1)
d[j] = [Dj[0, 0], Dj[1, 1], Dj[0, 2]]
plt.figure()
plt.plot(beta / degree, d, linewidth=2)
plt.xlim(0, 180)
plt.xlabel('beta in degree')
legend('$d^1_{-1,-1}$', '$d^1_{0,0}$', '$d^1_{-1,1}$', location='best')

The first curve decreases from 1 to 0. The central curve crosses zero at 90 degrees, while the corner entry decreases from 0 to -1. These smooth shapes arise because the functions are polynomials in \(\cos(\beta/2)\) and \(\sin(\beta/2)\). Series in Wigner-d functions therefore converge quickly for smooth functions.
Build one basis function
The Wigner-D functions form an orthonormal basis of \(L_2(\mathrm{SO}(3))\). MTEX stores a weighted series in this basis as an SO3FunHarmonic object.
Its coefficient vector starts with the degree-zero block. The next nine entries are the degree-one matrix, stored one column at a time. The vector below therefore selects \(D_1^{1,-1}\).
F = SO3FunHarmonic([0, 0, 0, 1])
seriesValue = F.eval(R)
seriesValue
(0.19953333233923354+0.0351831100420756j)
The selected coefficient is row 3 and column 1 of the normalized matrix W above, W[2,
0] counted from zero. Both evaluations give approximately 0.1995 + 0.0352i.
directValue = W[2, 0]
directValue
(0.19953333233923354+0.035183110042075603j)
comparisonError = abs(seriesValue - directValue)
comparisonError
6.9389e-18
Normalization
Several normalizations of Wigner-D functions occur in the literature. MTEX defines the \(L_2\) norm by
\[\|f\|_2 = \left(\frac{1}{8\pi^2}\int_{\mathrm{SO}(3)} \lvert f(\mathbf{R})\rvert^2\,\mathrm{d}\mathbf{R}\right)^{1/2}.\]With this measure, the constant function \(f=1\) has norm 1. Every normalized Wigner-D function also has \(\|D_n^{k,l}\|_2=1\).
norm(F)
1
The section Integration and Norms explains integration and norms for rotational functions in more detail.
The maths behind Wigner-D functions
In the Matthies ZYZ convention, write a rotation as \(\mathbf{R}=\mathbf{R}(\alpha,\beta,\gamma)\). MTEX defines the \(L_2\)-normalized Wigner-D function by
\[D_n^{k,l}(\mathbf{R})=\sqrt{2n+1}\, \mathrm{e}^{-\mathrm{i}k\gamma}\,d_n^{k,l}(\beta)\, \mathrm{e}^{-\mathrm{i}l\alpha}.\]The real-valued Wigner-d function \(d_n^{k,l}\colon[0,\pi]\to\mathbb{R}\) is defined through the Jacobi polynomial \(P_s^{a,b}\) by
\[d_n^{k,l}(\beta)=(-1)^\nu \binom{2n-s}{s+a}^{\frac{1}{2}} \binom{s+b}{b}^{-\frac{1}{2}} \left(\frac{\sin\beta}{2}\right)^a \left(\frac{\cos\beta}{2}\right)^b P_s^{a,b}(\cos\beta),\]| where $$a= | k-l | \(,\)b= | k+l | \(, and\)s=n-\max{ | k | , | l | }$$. The sign exponent is |
How the MTEX convention differs
MTEX’s definition differs slightly from other common definitions. It is compatible with the spherical harmonics, which form an orthonormal basis on the 2-sphere and are used to build harmonic spherical functions.
- The orders \(k\) and \(l\) are interchanged in the exponential factors compared with common definitions.
- The factor \(\sqrt{2n+1}\) gives each \(D_n^{k,l}\) unit \(L_2\) norm.
- The sign of \(d_n^{k,l}\) includes the contribution \(\min\{0,k\}+\min\{0,l\}\) through \((-1)^\nu\).
- MTEX parametrizes a Wigner-d function by the second Euler angle \(\beta\). Thus MTEX’s \(d_n^{k,l}(\beta)\) corresponds to \(d_n^{k,l}(x)\) with \(x=\cos(\beta)\) in definitions that use \(x\).
Composition and symmetry
For each degree \(n\), the Wigner-D functions are the matrix elements of a representation \(D_n\colon\mathrm{SO}(3)\to \mathbb{C}^{(2n+1)\mathbin{\times}(2n+1)}\). The representation is a group homomorphism. With MTEX’s order and normalization conventions,
\[D_n(\mathbf{R}\mathbf{Q})=\frac{1}{\sqrt{2n+1}} D_n(\mathbf{Q})D_n(\mathbf{R}),\]and hence
\[D_n^{k,l}(\mathbf{R}\mathbf{Q})= \frac{1}{\sqrt{2n+1}}\sum_{j=-n}^{n} D_n^{k,j}(\mathbf{Q})D_n^{j,l}(\mathbf{R}).\]Inversion exchanges the two orders and complex conjugates the value:
\[D_n^{k,l}(\mathbf{R})= \overline{D_n^{l,k}(\mathbf{R}^{-1})}.\]The Wigner-d functions also satisfy several useful symmetries:
\[d_n^{k,l}(\beta)=d_n^{-k,-l}(\beta) =(-1)^{k+l}d_n^{l,k}(\beta) =(-1)^{k+l}d_n^{-l,-k}(\beta),\] \[d_n^{k,l}(\beta)=(-1)^{n+k+l}d_n^{-k,l}(\pi-\beta) =(-1)^{n+k+l}d_n^{k,-l}(\pi-\beta),\] \[d_n^{k,l}(\beta)=(-1)^{k+l}d_n^{k,l}(-\beta).\]References
- D. A. Varshalovich, A. N. Moskalev, and V. K. Khersonskii, Quantum Theory of Angular Momentum, World Scientific, 1988, gives common Wigner-D definitions against which MTEX’s order, sign, and normalization conventions can be compared.
Technical Details
WignerD and the coefficients fhat are MTEX’s; the port computes internally in the
conventions of docs/design/harmonics.md and converts at the boundary. MATLAB’s
'normalize' flag is normalize=True, and a NumPy matrix is indexed from zero.
Citing this page.
This page is part of the documentation of
MTEX, a free and open
source MATLAB toolbox for analyzing and modeling crystallographic textures.
It was written by The MTEX Developers and is published at
https://mtex-toolbox.github.io/WignerFunctions_py.html.
If you use MTEX, or reuse text or figures from this page, in your research,
please cite
F. Bachmann, R. Hielscher, H. Schaeben: Texture Analysis with MTEX - Free and Open Source Software Toolbox, Solid State Phenomena 160 (2010), 63-68. 10.4028/www.scientific.net/SSP.160.63
BibTeX
@article{bachmann2010mtex,
author = {F. Bachmann and R. Hielscher and H. Schaeben},
title = {Texture Analysis with MTEX - Free and Open Source Software Toolbox},
journal = {Solid State Phenomena},
volume = {160},
pages = {63-68},
year = {2010},
doi = {10.4028/www.scientific.net/SSP.160.63},
url = {https://doi.org/10.4028/www.scientific.net/SSP.160.63}
}
Other papers describing specific MTEX methods are listed under Publications — please cite the one that best fits your application. The MTEX source code is licensed under the GNU General Public License v2.0; the text and figures of this documentation are licensed under CC BY 4.0, which permits reuse — including by automated systems — provided The MTEX Developers and this page are credited.