123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- 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
- ==========
- .. [1] https://en.wikipedia.org/wiki/Jones_calculus
- .. [2] https://en.wikipedia.org/wiki/Mueller_calculus
- .. [3] https://en.wikipedia.org/wiki/Stokes_parameters
- """
- from sympy.core.numbers import (I, pi)
- from sympy.functions.elementary.complexes import (Abs, im, re)
- from sympy.functions.elementary.exponential import exp
- from sympy.functions.elementary.miscellaneous import sqrt
- from sympy.functions.elementary.trigonometric import (cos, sin)
- from sympy.matrices.dense import Matrix
- from sympy.simplify.simplify import simplify
- from sympy.physics.quantum import TensorProduct
- def jones_vector(psi, chi):
- """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 ⎦
- """
- return Matrix([-I*sin(chi)*sin(psi) + cos(chi)*cos(psi),
- I*sin(chi)*cos(psi) + sin(psi)*cos(chi)])
- def stokes_vector(psi, chi, p=1, I=1):
- """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⎦
- """
- S0 = I
- S1 = I*p*cos(2*psi)*cos(2*chi)
- S2 = I*p*sin(2*psi)*cos(2*chi)
- S3 = I*p*sin(2*chi)
- return Matrix([S0, S1, S2, S3])
- def jones_2_stokes(e):
- """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⎦⎦
- """
- ex, ey = e
- return Matrix([Abs(ex)**2 + Abs(ey)**2,
- Abs(ex)**2 - Abs(ey)**2,
- 2*re(ex*ey.conjugate()),
- -2*im(ex*ey.conjugate())])
- def linear_polarizer(theta=0):
- """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 (θ) ⎦
- """
- M = Matrix([[cos(theta)**2, sin(theta)*cos(theta)],
- [sin(theta)*cos(theta), sin(theta)**2]])
- return M
- def phase_retarder(theta=0, delta=0):
- """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 (θ)⎠⋅ℯ ⎦
- """
- R = Matrix([[cos(theta)**2 + exp(I*delta)*sin(theta)**2,
- (1-exp(I*delta))*cos(theta)*sin(theta)],
- [(1-exp(I*delta))*cos(theta)*sin(theta),
- sin(theta)**2 + exp(I*delta)*cos(theta)**2]])
- return R*exp(-I*delta/2)
- def half_wave_retarder(theta):
- """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 (θ)⎠⎦
- """
- return phase_retarder(theta, pi)
- def quarter_wave_retarder(theta):
- """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 (θ)⎠⋅ℯ ⎦
- """
- return phase_retarder(theta, pi/2)
- def transmissive_filter(T):
- """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⎦
- """
- return Matrix([[sqrt(T), 0], [0, sqrt(T)]])
- def reflective_filter(R):
- """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⎦
- """
- return Matrix([[sqrt(R), 0], [0, -sqrt(R)]])
- def mueller_matrix(J):
- """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 ⎦
- """
- A = Matrix([[1, 0, 0, 1],
- [1, 0, 0, -1],
- [0, 1, 1, 0],
- [0, -I, I, 0]])
- return simplify(A*TensorProduct(J, J.conjugate())*A.inv())
- def polarizing_beam_splitter(Tp=1, Rs=1, Ts=0, Rp=0, phia=0, phib=0):
- r"""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 ]
- """
- PBS = Matrix([[sqrt(Tp), 0, I*sqrt(Rp), 0],
- [0, sqrt(Ts), 0, -I*sqrt(Rs)*exp(I*phia)],
- [I*sqrt(Rp), 0, sqrt(Tp), 0],
- [0, -I*sqrt(Rs)*exp(I*phib), 0, sqrt(Ts)]])
- return PBS
|