Polarization#

The module implements routines to model the polarization of optical fields and can be used to calculate the effects of polarization optical elements on the fields.

  • Jones vectors.

  • Stokes vectors.

  • Jones matrices.

  • Mueller matrices.

Examples#

We calculate a generic Jones vector:

>>> from sympy import symbols, pprint, zeros, simplify
>>> from sympy.physics.optics.polarization import (jones_vector, stokes_vector,
...     half_wave_retarder, polarizing_beam_splitter, jones_2_stokes)
>>> psi, chi, p, I0 = symbols("psi, chi, p, I0", real=True)
>>> x0 = jones_vector(psi, chi)
>>> pprint(x0, use_unicode=True)
⎡-ⅈ⋅sin(χ)⋅sin(ψ) + cos(χ)⋅cos(ψ)⎤
⎢                                ⎥
⎣ⅈ⋅sin(χ)⋅cos(ψ) + sin(ψ)⋅cos(χ) ⎦

And the more general Stokes vector: >>> s0 = stokes_vector(psi, chi, p, I0) >>> pprint(s0, use_unicode=True) ⎡ I₀ ⎤ ⎢ ⎥ ⎢I₀⋅p⋅cos(2⋅χ)⋅cos(2⋅ψ)⎥ ⎢ ⎥ ⎢I₀⋅p⋅sin(2⋅ψ)⋅cos(2⋅χ)⎥ ⎢ ⎥ ⎣ I₀⋅p⋅sin(2⋅χ) ⎦

We calculate how the Jones vector is modified by a half-wave plate: >>> alpha = symbols(“alpha”, real=True) >>> HWP = half_wave_retarder(alpha) >>> x1 = simplify(HWP*x0)

We calculate the very common operation of passing a beam through a half-wave plate and then through a polarizing beam-splitter. We do this by putting this Jones vector as the first entry of a two-Jones-vector state that is transformed by a 4x4 Jones matrix modelling the polarizing beam-splitter to get the transmitted and reflected Jones vectors:

>>> PBS = polarizing_beam_splitter()
>>> X1 = zeros(4, 1)
>>> X1[:2, :] = x1
>>> X2 = PBS*X1
>>> transmitted_port = X2[:2, :]
>>> reflected_port = X2[2:, :]

This allows us to calculate how the power in both ports depends on the initial polarization:

>>> transmitted_power = jones_2_stokes(transmitted_port)[0]
>>> reflected_power = jones_2_stokes(reflected_port)[0]
>>> print(transmitted_power)
cos(-2*alpha + chi + psi)**2/2 + cos(2*alpha + chi - psi)**2/2
>>> print(reflected_power)
sin(-2*alpha + chi + psi)**2/2 + sin(2*alpha + chi - psi)**2/2

Please see the description of the individual functions for further details and examples.

References#

R664

https://en.wikipedia.org/wiki/Jones_calculus

R665

https://en.wikipedia.org/wiki/Mueller_calculus

R666

https://en.wikipedia.org/wiki/Stokes_parameters

sympy.physics.optics.polarization.half_wave_retarder(theta)[source]#

A half-wave retarder Jones matrix at angle \(theta\).

Parameters

``theta`` : numeric type or SymPy Symbol

The angle of the fast axis relative to the horizontal plane.

Returns

SymPy Matrix

A Jones matrix representing the retarder.

Examples

A generic half-wave plate.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import half_wave_retarder
>>> theta= symbols("theta", real=True)
>>> HWP = half_wave_retarder(theta)
>>> pprint(HWP, use_unicode=True)
⎡   ⎛     2         2   ⎞                        ⎤
⎢-ⅈ⋅⎝- sin (θ) + cos (θ)⎠    -2⋅ⅈ⋅sin(θ)⋅cos(θ)  ⎥
⎢                                                ⎥
⎢                             ⎛   2         2   ⎞⎥
⎣   -2⋅ⅈ⋅sin(θ)⋅cos(θ)     -ⅈ⋅⎝sin (θ) - cos (θ)⎠⎦
sympy.physics.optics.polarization.jones_2_stokes(e)[source]#

Return the Stokes vector for a Jones vector \(e\).

Parameters

``e`` : SymPy Matrix

A Jones vector.

Returns

SymPy Matrix

A Jones vector.

Examples

The axes on the Poincaré sphere.

>>> from sympy import pprint, pi
>>> from sympy.physics.optics.polarization import jones_vector
>>> from sympy.physics.optics.polarization import jones_2_stokes
>>> H = jones_vector(0, 0)
>>> V = jones_vector(pi/2, 0)
>>> D = jones_vector(pi/4, 0)
>>> A = jones_vector(-pi/4, 0)
>>> R = jones_vector(0, pi/4)
>>> L = jones_vector(0, -pi/4)
>>> pprint([jones_2_stokes(e) for e in [H, V, D, A, R, L]],
...         use_unicode=True)
⎡⎡1⎤  ⎡1 ⎤  ⎡1⎤  ⎡1 ⎤  ⎡1⎤  ⎡1 ⎤⎤
⎢⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥⎥
⎢⎢1⎥  ⎢-1⎥  ⎢0⎥  ⎢0 ⎥  ⎢0⎥  ⎢0 ⎥⎥
⎢⎢ ⎥, ⎢  ⎥, ⎢ ⎥, ⎢  ⎥, ⎢ ⎥, ⎢  ⎥⎥
⎢⎢0⎥  ⎢0 ⎥  ⎢1⎥  ⎢-1⎥  ⎢0⎥  ⎢0 ⎥⎥
⎢⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥⎥
⎣⎣0⎦  ⎣0 ⎦  ⎣0⎦  ⎣0 ⎦  ⎣1⎦  ⎣-1⎦⎦
sympy.physics.optics.polarization.jones_vector(psi, chi)[source]#

A Jones vector corresponding to a polarization ellipse with \(psi\) tilt, and \(chi\) circularity.

Parameters

``psi`` : numeric type or SymPy Symbol

The tilt of the polarization relative to the \(x\) axis.

``chi`` : numeric type or SymPy Symbol

The angle adjacent to the mayor axis of the polarization ellipse.

Returns

Matrix :

A Jones vector.

Examples

The axes on the Poincaré sphere.

>>> from sympy import pprint, symbols, pi
>>> from sympy.physics.optics.polarization import jones_vector
>>> psi, chi = symbols("psi, chi", real=True)

A general Jones vector. >>> pprint(jones_vector(psi, chi), use_unicode=True) ⎡-ⅈ⋅sin(χ)⋅sin(ψ) + cos(χ)⋅cos(ψ)⎤ ⎢ ⎥ ⎣ⅈ⋅sin(χ)⋅cos(ψ) + sin(ψ)⋅cos(χ) ⎦

Horizontal polarization. >>> pprint(jones_vector(0, 0), use_unicode=True) ⎡1⎤ ⎢ ⎥ ⎣0⎦

Vertical polarization. >>> pprint(jones_vector(pi/2, 0), use_unicode=True) ⎡0⎤ ⎢ ⎥ ⎣1⎦

Diagonal polarization. >>> pprint(jones_vector(pi/4, 0), use_unicode=True) ⎡√2⎤ ⎢──⎥ ⎢2 ⎥ ⎢ ⎥ ⎢√2⎥ ⎢──⎥ ⎣2 ⎦

Anti-diagonal polarization. >>> pprint(jones_vector(-pi/4, 0), use_unicode=True) ⎡ √2 ⎤ ⎢ ── ⎥ ⎢ 2 ⎥ ⎢ ⎥ ⎢-√2 ⎥ ⎢────⎥ ⎣ 2 ⎦

Right-hand circular polarization. >>> pprint(jones_vector(0, pi/4), use_unicode=True) ⎡ √2 ⎤ ⎢ ── ⎥ ⎢ 2 ⎥ ⎢ ⎥ ⎢√2⋅ⅈ⎥ ⎢────⎥ ⎣ 2 ⎦

Left-hand circular polarization. >>> pprint(jones_vector(0, -pi/4), use_unicode=True) ⎡ √2 ⎤ ⎢ ── ⎥ ⎢ 2 ⎥ ⎢ ⎥ ⎢-√2⋅ⅈ ⎥ ⎢──────⎥ ⎣ 2 ⎦

sympy.physics.optics.polarization.linear_polarizer(theta=0)[source]#

A linear polarizer Jones matrix with transmission axis at an angle theta.

Parameters

``theta`` : numeric type or SymPy Symbol

The angle of the transmission axis relative to the horizontal plane.

Returns

SymPy Matrix

A Jones matrix representing the polarizer.

Examples

A generic polarizer.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import linear_polarizer
>>> theta = symbols("theta", real=True)
>>> J = linear_polarizer(theta)
>>> pprint(J, use_unicode=True)
⎡      2                     ⎤
⎢   cos (θ)     sin(θ)⋅cos(θ)⎥
⎢                            ⎥
⎢                     2      ⎥
⎣sin(θ)⋅cos(θ)     sin (θ)   ⎦
sympy.physics.optics.polarization.mueller_matrix(J)[source]#

The Mueller matrix corresponding to Jones matrix \(J\).

Parameters

``J`` : SymPy Matrix

A Jones matrix.

Returns

SymPy Matrix

The corresponding Mueller matrix.

Examples

Generic optical components.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import (mueller_matrix,
...     linear_polarizer, half_wave_retarder, quarter_wave_retarder)
>>> theta = symbols("theta", real=True)

A linear_polarizer >>> pprint(mueller_matrix(linear_polarizer(theta)), use_unicode=True) ⎡ cos(2⋅θ) sin(2⋅θ) ⎤ ⎢ 1/2 ──────── ──────── 0⎥ ⎢ 2 2 ⎥ ⎢ ⎥ ⎢cos(2⋅θ) cos(4⋅θ) 1 sin(4⋅θ) ⎥ ⎢──────── ──────── + ─ ──────── 0⎥ ⎢ 2 4 4 4 ⎥ ⎢ ⎥ ⎢sin(2⋅θ) sin(4⋅θ) 1 cos(4⋅θ) ⎥ ⎢──────── ──────── ─ - ──────── 0⎥ ⎢ 2 4 4 4 ⎥ ⎢ ⎥ ⎣ 0 0 0 0⎦

A half-wave plate >>> pprint(mueller_matrix(half_wave_retarder(theta)), use_unicode=True) ⎡1 0 0 0 ⎤ ⎢ ⎥ ⎢ 4 2 ⎥ ⎢0 8⋅sin (θ) - 8⋅sin (θ) + 1 sin(4⋅θ) 0 ⎥ ⎢ ⎥ ⎢ 4 2 ⎥ ⎢0 sin(4⋅θ) - 8⋅sin (θ) + 8⋅sin (θ) - 1 0 ⎥ ⎢ ⎥ ⎣0 0 0 -1⎦

A quarter-wave plate >>> pprint(mueller_matrix(quarter_wave_retarder(theta)), use_unicode=True) ⎡1 0 0 0 ⎤ ⎢ ⎥ ⎢ cos(4⋅θ) 1 sin(4⋅θ) ⎥ ⎢0 ──────── + ─ ──────── -sin(2⋅θ)⎥ ⎢ 2 2 2 ⎥ ⎢ ⎥ ⎢ sin(4⋅θ) 1 cos(4⋅θ) ⎥ ⎢0 ──────── ─ - ──────── cos(2⋅θ) ⎥ ⎢ 2 2 2 ⎥ ⎢ ⎥ ⎣0 sin(2⋅θ) -cos(2⋅θ) 0 ⎦

sympy.physics.optics.polarization.phase_retarder(theta=0, delta=0)[source]#

A phase retarder Jones matrix with retardance \(delta\) at angle \(theta\).

Parameters

``theta`` : numeric type or SymPy Symbol

The angle of the fast axis relative to the horizontal plane.

``delta`` : numeric type or SymPy Symbol

The phase difference between the fast and slow axes of the transmitted light.

Returns

SymPy Matrix :

A Jones matrix representing the retarder.

Examples

A generic retarder.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import phase_retarder
>>> theta, delta = symbols("theta, delta", real=True)
>>> R = phase_retarder(theta, delta)
>>> pprint(R, use_unicode=True)
⎡                          -ⅈ⋅δ               -ⅈ⋅δ               ⎤
⎢                          ─────              ─────              ⎥
⎢⎛ ⅈ⋅δ    2         2   ⎞    2    ⎛     ⅈ⋅δ⎞    2                ⎥
⎢⎝ℯ   ⋅sin (θ) + cos (θ)⎠⋅ℯ       ⎝1 - ℯ   ⎠⋅ℯ     ⋅sin(θ)⋅cos(θ)⎥
⎢                                                                ⎥
⎢            -ⅈ⋅δ                                           -ⅈ⋅δ ⎥
⎢            ─────                                          ─────⎥
⎢⎛     ⅈ⋅δ⎞    2                  ⎛ ⅈ⋅δ    2         2   ⎞    2  ⎥
⎣⎝1 - ℯ   ⎠⋅ℯ     ⋅sin(θ)⋅cos(θ)  ⎝ℯ   ⋅cos (θ) + sin (θ)⎠⋅ℯ     ⎦
sympy.physics.optics.polarization.polarizing_beam_splitter(Tp=1, Rs=1, Ts=0, Rp=0, phia=0, phib=0)[source]#

A polarizing beam splitter Jones matrix at angle \(theta\).

Parameters

``J`` : SymPy Matrix

A Jones matrix.

``Tp`` : numeric type or SymPy Symbol

The transmissivity of the P-polarized component.

``Rs`` : numeric type or SymPy Symbol

The reflectivity of the S-polarized component.

``Ts`` : numeric type or SymPy Symbol

The transmissivity of the S-polarized component.

``Rp`` : numeric type or SymPy Symbol

The reflectivity of the P-polarized component.

``phia`` : numeric type or SymPy Symbol

The phase difference between transmitted and reflected component for output mode a.

``phib`` : numeric type or SymPy Symbol

The phase difference between transmitted and reflected component for output mode b.

Returns

SymPy Matrix

A 4x4 matrix representing the PBS. This matrix acts on a 4x1 vector whose first two entries are the Jones vector on one of the PBS ports, and the last two entries the Jones vector on the other port.

Examples

Generic polarizing beam-splitter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import polarizing_beam_splitter
>>> Ts, Rs, Tp, Rp = symbols(r"Ts, Rs, Tp, Rp", positive=True)
>>> phia, phib = symbols("phi_a, phi_b", real=True)
>>> PBS = polarizing_beam_splitter(Tp, Rs, Ts, Rp, phia, phib)
>>> pprint(PBS, use_unicode=False)
[   ____                           ____                    ]
[ \/ Tp            0           I*\/ Rp           0         ]
[                                                          ]
[                  ____                       ____  I*phi_a]
[   0            \/ Ts            0      -I*\/ Rs *e       ]
[                                                          ]
[    ____                         ____                     ]
[I*\/ Rp           0            \/ Tp            0         ]
[                                                          ]
[               ____  I*phi_b                    ____      ]
[   0      -I*\/ Rs *e            0            \/ Ts       ]
sympy.physics.optics.polarization.quarter_wave_retarder(theta)[source]#

A quarter-wave retarder Jones matrix at angle \(theta\).

Parameters

``theta`` : numeric type or SymPy Symbol

The angle of the fast axis relative to the horizontal plane.

Returns

SymPy Matrix

A Jones matrix representing the retarder.

Examples

A generic quarter-wave plate.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import quarter_wave_retarder
>>> theta= symbols("theta", real=True)
>>> QWP = quarter_wave_retarder(theta)
>>> pprint(QWP, use_unicode=True)
⎡                       -ⅈ⋅π            -ⅈ⋅π               ⎤
⎢                       ─────           ─────              ⎥
⎢⎛     2         2   ⎞    4               4                ⎥
⎢⎝ⅈ⋅sin (θ) + cos (θ)⎠⋅ℯ       (1 - ⅈ)⋅ℯ     ⋅sin(θ)⋅cos(θ)⎥
⎢                                                          ⎥
⎢         -ⅈ⋅π                                        -ⅈ⋅π ⎥
⎢         ─────                                       ─────⎥
⎢           4                  ⎛   2           2   ⎞    4  ⎥
⎣(1 - ⅈ)⋅ℯ     ⋅sin(θ)⋅cos(θ)  ⎝sin (θ) + ⅈ⋅cos (θ)⎠⋅ℯ     ⎦
sympy.physics.optics.polarization.reflective_filter(R)[source]#

A reflective filter Jones matrix with reflectance \(R\).

Parameters

``R`` : numeric type or SymPy Symbol

The reflectance of the filter.

Returns

SymPy Matrix

A Jones matrix representing the filter.

Examples

A generic filter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import reflective_filter
>>> R = symbols("R", real=True)
>>> pprint(reflective_filter(R), use_unicode=True)
⎡√R   0 ⎤
⎢       ⎥
⎣0   -√R⎦
sympy.physics.optics.polarization.stokes_vector(psi, chi, p=1, I=1)[source]#

A Stokes vector corresponding to a polarization ellipse with psi tilt, and chi circularity.

Parameters

``psi`` : numeric type or SymPy Symbol

The tilt of the polarization relative to the x axis.

``chi`` : numeric type or SymPy Symbol

The angle adjacent to the mayor axis of the polarization ellipse.

``p`` : numeric type or SymPy Symbol

The degree of polarization.

``I`` : numeric type or SymPy Symbol

The intensity of the field.

Returns

Matrix :

A Stokes vector.

Examples

The axes on the Poincaré sphere.

>>> from sympy import pprint, symbols, pi
>>> from sympy.physics.optics.polarization import stokes_vector
>>> psi, chi, p, I = symbols("psi, chi, p, I", real=True)
>>> pprint(stokes_vector(psi, chi, p, I), use_unicode=True)
⎡          I          ⎤
⎢                     ⎥
⎢I⋅p⋅cos(2⋅χ)⋅cos(2⋅ψ)⎥
⎢                     ⎥
⎢I⋅p⋅sin(2⋅ψ)⋅cos(2⋅χ)⎥
⎢                     ⎥
⎣    I⋅p⋅sin(2⋅χ)     ⎦

Horizontal polarization >>> pprint(stokes_vector(0, 0), use_unicode=True) ⎡1⎤ ⎢ ⎥ ⎢1⎥ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎣0⎦

Vertical polarization >>> pprint(stokes_vector(pi/2, 0), use_unicode=True) ⎡1 ⎤ ⎢ ⎥ ⎢-1⎥ ⎢ ⎥ ⎢0 ⎥ ⎢ ⎥ ⎣0 ⎦

Diagonal polarization >>> pprint(stokes_vector(pi/4, 0), use_unicode=True) ⎡1⎤ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎢1⎥ ⎢ ⎥ ⎣0⎦

Anti-diagonal polarization >>> pprint(stokes_vector(-pi/4, 0), use_unicode=True) ⎡1 ⎤ ⎢ ⎥ ⎢0 ⎥ ⎢ ⎥ ⎢-1⎥ ⎢ ⎥ ⎣0 ⎦

Right-hand circular polarization >>> pprint(stokes_vector(0, pi/4), use_unicode=True) ⎡1⎤ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎣1⎦

Left-hand circular polarization >>> pprint(stokes_vector(0, -pi/4), use_unicode=True) ⎡1 ⎤ ⎢ ⎥ ⎢0 ⎥ ⎢ ⎥ ⎢0 ⎥ ⎢ ⎥ ⎣-1⎦

Unpolarized light >>> pprint(stokes_vector(0, 0, 0), use_unicode=True) ⎡1⎤ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎢0⎥ ⎢ ⎥ ⎣0⎦

sympy.physics.optics.polarization.transmissive_filter(T)[source]#

An attenuator Jones matrix with transmittance \(T\).

Parameters

``T`` : numeric type or SymPy Symbol

The transmittance of the attenuator.

Returns

SymPy Matrix

A Jones matrix representing the filter.

Examples

A generic filter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import transmissive_filter
>>> T = symbols("T", real=True)
>>> NDF = transmissive_filter(T)
>>> pprint(NDF, use_unicode=True)
⎡√T  0 ⎤
⎢      ⎥
⎣0   √T⎦