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