The Jones Matrices

Scott Prahl

March 2020

Basic tests for polarizing elements (polarizers and retarders) present in the pypolar.jones module.

This module and most optics texts (including Fowles) define angles based on the reciever point-of-view. This means that the electric field is viewed against the direction of propagation or on looking into the source. Complete details of the assumptions used by pypolar can be found in [Jupyter notebook on Conventions](./02-Jones-Conventions.html

[1]:
import numpy as np
import matplotlib.pyplot as plt

import pypolar.jones as jones

np.set_printoptions(suppress=True)  # print 1e-16 as zero

Jones matrices for linear polarizers

These are the matrix operators needed for a theoretically perfect linear polarizer. The polarizer is normal to the beam and it rotated around the axis of the beam. The angle is measured from the horizontal plane.

Matches Kliger Appendix B, page 281. These match Wikipedia because there are no complex valued in the matrices.

[2]:
for theta in [0,45,90,-45]:
    print('Jones Matrix for linear polarizer oriented at %.1f°' % theta)
    L = jones.op_linear_polarizer(np.radians(theta))
    print(L)
Jones Matrix for linear polarizer oriented at 0.0°
[[1. 0.]
 [0. 0.]]
Jones Matrix for linear polarizer oriented at 45.0°
[[0.5 0.5]
 [0.5 0.5]]
Jones Matrix for linear polarizer oriented at 90.0°
[[0. 0.]
 [0. 1.]]
Jones Matrix for linear polarizer oriented at -45.0°
[[ 0.5 -0.5]
 [-0.5  0.5]]

Quarter-Wave Plates

These match those on Kliger page 282, \(\delta=90\)° and rotation angles \(\rho\)

[3]:
for theta in [0,45,90,-45]:
    print('Jones Matrix for QWP with fast axis at %.1f°' % theta)
    L = jones.op_quarter_wave_plate(np.radians(theta))
    print(L)
    print()
Jones Matrix for QWP with fast axis at 0.0°
[[0.70710678+0.70710678j 0.        +0.j        ]
 [0.        +0.j         0.70710678-0.70710678j]]

Jones Matrix for QWP with fast axis at 45.0°
[[0.70710678+0.j         0.        +0.70710678j]
 [0.        +0.70710678j 0.70710678-0.j        ]]

Jones Matrix for QWP with fast axis at 90.0°
[[0.70710678-0.70710678j 0.        +0.j        ]
 [0.        +0.j         0.70710678+0.70710678j]]

Jones Matrix for QWP with fast axis at -45.0°
[[ 0.70710678+0.j         -0.        -0.70710678j]
 [-0.        -0.70710678j  0.70710678-0.j        ]]

Here are the matrices from Fowles Table 2.1 page 35

[4]:
jones.use_alternate_convention(True)

for theta in [0,45,90,-45]:
    print('Jones Matrix for QWP with fast axis at %.1f°' % theta)
    L = jones.op_quarter_wave_plate(np.radians(theta))
    print(L)
    print()
    norm = L[0,0]
    print("... and when scaled by so top left element is unity")
    print(L/norm)
    print()

# restore default setting
jones.use_alternate_convention(False)


Jones Matrix for QWP with fast axis at 0.0°
[[ 0.70710678-0.70710678j -0.        -0.j        ]
 [-0.        -0.j          0.70710678+0.70710678j]]

... and when scaled by so top left element is unity
[[1.+0.j 0.-0.j]
 [0.-0.j 0.+1.j]]

Jones Matrix for QWP with fast axis at 45.0°
[[ 0.70710678-0.j         -0.        +0.70710678j]
 [-0.        +0.70710678j  0.70710678+0.j        ]]

... and when scaled by so top left element is unity
[[ 1.+0.j -0.+1.j]
 [-0.+1.j  1.+0.j]]

Jones Matrix for QWP with fast axis at 90.0°
[[ 0.70710678+0.70710678j -0.        +0.j        ]
 [-0.        +0.j          0.70710678-0.70710678j]]

... and when scaled by so top left element is unity
[[1.+0.j 0.+0.j]
 [0.+0.j 0.-1.j]]

Jones Matrix for QWP with fast axis at -45.0°
[[0.70710678-0.j         0.        -0.70710678j]
 [0.        -0.70710678j 0.70710678+0.j        ]]

... and when scaled by so top left element is unity
[[1.+0.j 0.-1.j]
 [0.-1.j 1.+0.j]]

Here are the matrices from Wikipedia

[5]:
jones.use_alternate_convention(True)

for theta in [0,45,90,-45]:
    print('Jones Matrix for QWP with fast axis at %.1f°' % theta)
    L = jones.op_quarter_wave_plate(np.radians(theta))
    print(L)
    print()
    norm = L[0,0]
    print("... and when scaled by so top left element is unity")
    print(L/norm)
    print()

jones.use_alternate_convention(False)


Jones Matrix for QWP with fast axis at 0.0°
[[ 0.70710678-0.70710678j -0.        -0.j        ]
 [-0.        -0.j          0.70710678+0.70710678j]]

... and when scaled by so top left element is unity
[[1.+0.j 0.-0.j]
 [0.-0.j 0.+1.j]]

Jones Matrix for QWP with fast axis at 45.0°
[[ 0.70710678-0.j         -0.        +0.70710678j]
 [-0.        +0.70710678j  0.70710678+0.j        ]]

... and when scaled by so top left element is unity
[[ 1.+0.j -0.+1.j]
 [-0.+1.j  1.+0.j]]

Jones Matrix for QWP with fast axis at 90.0°
[[ 0.70710678+0.70710678j -0.        +0.j        ]
 [-0.        +0.j          0.70710678-0.70710678j]]

... and when scaled by so top left element is unity
[[1.+0.j 0.+0.j]
 [0.+0.j 0.-1.j]]

Jones Matrix for QWP with fast axis at -45.0°
[[0.70710678-0.j         0.        -0.70710678j]
 [0.        -0.70710678j 0.70710678+0.j        ]]

... and when scaled by so top left element is unity
[[1.+0.j 0.-1.j]
 [0.-1.j 1.+0.j]]

Half-Wave Plates

Here, once again, both conventions match because there are no imaginary numbers involved

[6]:
for theta in [0,90]:
    print('Jones Matrix for HWP with fast axis at %.1f°' % theta)
    L = jones.op_half_wave_plate(np.radians(theta))
    print(L)
    norm = L[0,0]
    print("... and when scaled by so top left element is unity")
    print(L/norm)
    print()

for theta in [45,-45]:
    print('Jones Matrix for HWP with fast axis at %.1f°' % theta)
    L = jones.op_half_wave_plate(np.radians(theta))
    print(L)
    norm = L[0,1]
    print("... and when scaled by so top right element is unity")
    print(L/norm)
    print()
Jones Matrix for HWP with fast axis at 0.0°
[[0.+1.j 0.+0.j]
 [0.+0.j 0.-1.j]]
... and when scaled by so top left element is unity
[[ 1.+0.j  0.+0.j]
 [ 0.+0.j -1.-0.j]]

Jones Matrix for HWP with fast axis at 90.0°
[[0.-1.j 0.+0.j]
 [0.+0.j 0.+1.j]]
... and when scaled by so top left element is unity
[[ 1.-0.j -0.+0.j]
 [-0.+0.j -1.+0.j]]

Jones Matrix for HWP with fast axis at 45.0°
[[0.+0.j 0.+1.j]
 [0.+1.j 0.-0.j]]
... and when scaled by so top right element is unity
[[ 0.-0.j  1.+0.j]
 [ 1.+0.j -0.-0.j]]

Jones Matrix for HWP with fast axis at -45.0°
[[ 0.+0.j -0.-1.j]
 [-0.-1.j  0.-0.j]]
... and when scaled by so top right element is unity
[[-0.+0.j  1.-0.j]
 [ 1.-0.j  0.+0.j]]