ó
~9­\c           @  s´  d  Z  d d l m Z m Z d d d d d d d	 d
 d d d d d d d d g Z d d l m Z m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m Z m Z m Z d d l m Z d e
 f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d „  ƒ  YZ d
 e
 f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d  „  Z d! „  Z e Z  d" „  Z! d# „  Z" d$ S(%   sÜ  
Gaussian optics.

The module implements:

- Ray transfer matrices for geometrical and gaussian optics.

  See RayTransferMatrix, GeometricRay and BeamParameter

- Conjugation relations for geometrical and gaussian optics.

  See geometric_conj*, gauss_conj and conjugate_gauss_beams

The conventions for the distances are as follows:

focal distance
    positive for convergent lenses
object distance
    positive for real objects
image distance
    positive for real images
iÿÿÿÿ(   t   print_functiont   divisiont   RayTransferMatrixt	   FreeSpacet   FlatRefractiont   CurvedRefractiont
   FlatMirrort   CurvedMirrort   ThinLenst   GeometricRayt   BeamParametert   waist2rayleight   rayleigh2waistt   geometric_conj_abt   geometric_conj_aft   geometric_conj_bft   gaussian_conjt   conjugate_gauss_beams(   t   atan2t   Exprt   It   imt   Matrixt   oot   pit   ret   sqrtt   sympifyt   together(   t
   filldedentc           B  s\   e  Z d  Z d „  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 RS(   sÕ  
    Base class for a Ray Transfer Matrix.

    It should be used if there isn't already a more specific subclass mentioned
    in See Also.

    Parameters
    ==========

    parameters : A, B, C and D or 2x2 matrix (Matrix(2, 2, [A, B, C, D]))

    Examples
    ========

    >>> from sympy.physics.optics import RayTransferMatrix, ThinLens
    >>> from sympy import Symbol, Matrix

    >>> mat = RayTransferMatrix(1, 2, 3, 4)
    >>> mat
    Matrix([
    [1, 2],
    [3, 4]])

    >>> RayTransferMatrix(Matrix([[1, 2], [3, 4]]))
    Matrix([
    [1, 2],
    [3, 4]])

    >>> mat.A
    1

    >>> f = Symbol('f')
    >>> lens = ThinLens(f)
    >>> lens
    Matrix([
    [   1, 0],
    [-1/f, 1]])

    >>> lens.C
    -1/f

    See Also
    ========

    GeometricRay, BeamParameter,
    FreeSpace, FlatRefraction, CurvedRefraction,
    FlatMirror, CurvedMirror, ThinLens

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Ray_transfer_matrix_analysis
    c         G  s®   t  | ƒ d k r= | d | d f | d | d f f } na t  | ƒ d k r‚ t | d t ƒ r‚ | d j d k r‚ | d } n t t d t | ƒ ƒ ƒ ‚ t j |  | ƒ S(   Ni   i    i   i   i   s`   
                Expecting 2x2 Matrix or the 4 elements of
                the Matrix but got %s(   i   i   (   t   lent
   isinstanceR   t   shapet
   ValueErrorR   t   strt   __new__(   t   clst   argst   temp(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   o   s    +c         C  sÕ   t  | t ƒ r% t t j |  | ƒ ƒ St  | t ƒ rJ t t j |  | ƒ ƒ St  | t ƒ rÁ |  t | j f d f ƒ } | d | d j d t ƒ } t | j	 t
 t | ƒ ƒ d t
 t | ƒ ƒ ƒSt j |  | ƒ Sd  S(   Ni   i    t   complext   z_r(   i   (   R   R   R   t   __mul__R	   R
   t   qt   expandt   Truet   wavelenR   R   R   (   t   selft   otherR&   R*   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR)   }   s    	c         C  s   |  d S(   sß   
        The A parameter of the Matrix.

        Examples
        ========

        >>> from sympy.physics.optics import RayTransferMatrix
        >>> mat = RayTransferMatrix(1, 2, 3, 4)
        >>> mat.A
        1
        i    (   i    i    (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   A‹   s    c         C  s   |  d S(   sß   
        The B parameter of the Matrix.

        Examples
        ========

        >>> from sympy.physics.optics import RayTransferMatrix
        >>> mat = RayTransferMatrix(1, 2, 3, 4)
        >>> mat.B
        2
        i    i   (   i    i   (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   Bš   s    c         C  s   |  d S(   sß   
        The C parameter of the Matrix.

        Examples
        ========

        >>> from sympy.physics.optics import RayTransferMatrix
        >>> mat = RayTransferMatrix(1, 2, 3, 4)
        >>> mat.C
        3
        i   i    (   i   i    (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   C©   s    c         C  s   |  d S(   sß   
        The D parameter of the Matrix.

        Examples
        ========

        >>> from sympy.physics.optics import RayTransferMatrix
        >>> mat = RayTransferMatrix(1, 2, 3, 4)
        >>> mat.D
        4
        i   (   i   i   (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   D¸   s    (
   t   __name__t
   __module__t   __doc__R#   R)   t   propertyR0   R1   R2   R3   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   8   s   5		c           B  s   e  Z d  Z d „  Z RS(   sQ  
    Ray Transfer Matrix for free space.

    Parameters
    ==========

    distance

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import FreeSpace
    >>> from sympy import symbols
    >>> d = symbols('d')
    >>> FreeSpace(d)
    Matrix([
    [1, d],
    [0, 1]])
    c         C  s   t  j |  d | d d ƒ S(   Ni   i    (   R   R#   (   R$   t   d(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   á   s    (   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   È   s   c           B  s   e  Z d  Z d „  Z RS(   s¶  
    Ray Transfer Matrix for refraction.

    Parameters
    ==========

    n1 : refractive index of one medium
    n2 : refractive index of other medium

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import FlatRefraction
    >>> from sympy import symbols
    >>> n1, n2 = symbols('n1 n2')
    >>> FlatRefraction(n1, n2)
    Matrix([
    [1,     0],
    [0, n1/n2]])
    c         C  s8   t  t | | f ƒ \ } } t j |  d d d | | ƒ S(   Ni   i    (   t   mapR   R   R#   (   R$   t   n1t   n2(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   ÿ   s    (   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   å   s   c           B  s   e  Z d  Z d „  Z RS(   s'  
    Ray Transfer Matrix for refraction on curved interface.

    Parameters
    ==========

    R : radius of curvature (positive for concave)
    n1 : refractive index of one medium
    n2 : refractive index of other medium

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import CurvedRefraction
    >>> from sympy import symbols
    >>> R, n1, n2 = symbols('R n1 n2')
    >>> CurvedRefraction(R, n1, n2)
    Matrix([
    [               1,     0],
    [(n1 - n2)/(R*n2), n1/n2]])
    c         C  sJ   t  t | | | f ƒ \ } } } t j |  d d | | | | | | ƒ S(   Ni   i    (   R9   R   R   R#   (   R$   t   RR:   R;   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#     s    !(   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR     s   c           B  s   e  Z d  Z d „  Z RS(   sê   
    Ray Transfer Matrix for reflection.

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import FlatMirror
    >>> FlatMirror()
    Matrix([
    [1, 0],
    [0, 1]])
    c         C  s   t  j |  d d d d ƒ S(   Ni   i    (   R   R#   (   R$   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   6  s    (   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   $  s   c           B  s   e  Z d  Z d „  Z RS(   s—  
    Ray Transfer Matrix for reflection from curved surface.

    Parameters
    ==========

    R : radius of curvature (positive for concave)

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import CurvedMirror
    >>> from sympy import symbols
    >>> R = symbols('R')
    >>> CurvedMirror(R)
    Matrix([
    [   1, 0],
    [-2/R, 1]])
    c         C  s)   t  | ƒ } t j |  d d d | d ƒ S(   Ni   i    iþÿÿÿ(   R   R   R#   (   R$   R<   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   S  s    (   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   :  s   c           B  s   e  Z d  Z d „  Z RS(   sd  
    Ray Transfer Matrix for a thin lens.

    Parameters
    ==========

    f : the focal distance

    See Also
    ========

    RayTransferMatrix

    Examples
    ========

    >>> from sympy.physics.optics import ThinLens
    >>> from sympy import symbols
    >>> f = symbols('f')
    >>> ThinLens(f)
    Matrix([
    [   1, 0],
    [-1/f, 1]])
    c         C  s)   t  | ƒ } t j |  d d d | d ƒ S(   Ni   i    iÿÿÿÿ(   R   R   R#   (   R$   t   f(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   q  s    (   R4   R5   R6   R#   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   X  s   c           B  s5   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z RS(   sÂ  
    Representation for a geometric ray in the Ray Transfer Matrix formalism.

    Parameters
    ==========

    h : height, and
    angle : angle, or
    matrix : a 2x1 matrix (Matrix(2, 1, [height, angle]))

    Examples
    ========

    >>> from sympy.physics.optics import GeometricRay, FreeSpace
    >>> from sympy import symbols, Matrix
    >>> d, h, angle = symbols('d, h, angle')

    >>> GeometricRay(h, angle)
    Matrix([
    [    h],
    [angle]])

    >>> FreeSpace(d)*GeometricRay(h, angle)
    Matrix([
    [angle*d + h],
    [      angle]])

    >>> GeometricRay( Matrix( ((h,), (angle,)) ) )
    Matrix([
    [    h],
    [angle]])

    See Also
    ========

    RayTransferMatrix

    c         G  s    t  | ƒ d k rE t | d t ƒ rE | d j d k rE | d } nK t  | ƒ d k rt | d f | d f f } n t t d t | ƒ ƒ ƒ ‚ t j |  | ƒ S(   Ni   i    i   s`   
                Expecting 2x1 Matrix or the 2 elements of
                the Matrix but got %s(   i   i   (   R   R   R   R    R!   R   R"   R#   (   R$   R%   R&   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   ¢  s    %c         C  s   |  d S(   s0  
        The distance from the optical axis.

        Examples
        ========

        >>> from sympy.physics.optics import GeometricRay
        >>> from sympy import symbols
        >>> h, angle = symbols('h, angle')
        >>> gRay = GeometricRay(h, angle)
        >>> gRay.height
        h
        i    (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   height®  s    c         C  s   |  d S(   s0  
        The angle with the optical axis.

        Examples
        ========

        >>> from sympy.physics.optics import GeometricRay
        >>> from sympy import symbols
        >>> h, angle = symbols('h, angle')
        >>> gRay = GeometricRay(h, angle)
        >>> gRay.angle
        angle
        i   (    (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   angle¿  s    (   R4   R5   R6   R#   R7   R>   R?   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR	   z  s   &	c           B  s   e  Z d  Z d d d g Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d	 „  ƒ Z
 e d
 „  ƒ Z e d „  ƒ Z RS(   s‰  
    Representation for a gaussian ray in the Ray Transfer Matrix formalism.

    Parameters
    ==========

    wavelen : the wavelength,
    z : the distance to waist, and
    w : the waist, or
    z_r : the rayleigh range

    Examples
    ========

    >>> from sympy.physics.optics import BeamParameter
    >>> p = BeamParameter(530e-9, 1, w=1e-3)
    >>> p.q
    1 + 1.88679245283019*I*pi

    >>> p.q.n()
    1.0 + 5.92753330865999*I
    >>> p.w_0.n()
    0.00100000000000000
    >>> p.z_r.n()
    5.92753330865999

    >>> from sympy.physics.optics import FreeSpace
    >>> fs = FreeSpace(10)
    >>> p1 = fs*p
    >>> p.w.n()
    0.00101413072159615
    >>> p1.w.n()
    0.00210803120913829

    See Also
    ========

    RayTransferMatrix

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Complex_beam_parameter
    .. [2] https://en.wikipedia.org/wiki/Gaussian_beam
    t   zR(   R-   c         K  sÀ   t  t | | f ƒ \ } } t j |  | | ƒ } | | _ | | _ t | ƒ d k rc t d ƒ ‚ nY d | k r… t | d ƒ | _ n7 d | k r° t	 t | d ƒ | ƒ | _ n t d ƒ ‚ | S(   Ni   s/   Constructor expects exactly one named argument.R(   t   ws-   The constructor needs named argument w or z_r(
   R9   R   R   R#   R-   R@   R   R!   R(   R   (   R$   R-   R@   t   kwargst   inst(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR#   	  s    		c         C  s   |  j  t |  j S(   s   
        The complex parameter representing the beam.

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.q
        1 + 1.88679245283019*I*pi
        (   R@   R   R(   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR*     s    c         C  s   |  j  d |  j |  j  d S(   s  
        The radius of curvature of the phase front.

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.radius
        1 + 3.55998576005696*pi**2
        i   i   (   R@   R(   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   radius'  s    c         C  s#   |  j  t d |  j |  j d ƒ S(   sI  
        The beam radius at `1/e^2` intensity.

        See Also
        ========

        w_0 : the minimal radius of beam

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.w
        0.001*sqrt(0.2809/pi**2 + 1)
        i   i   (   t   w_0R   R@   R(   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyRA   6  s    c         C  s   t  |  j t |  j ƒ S(   sE  
        The beam waist (minimal radius).

        See Also
        ========

        w : the beam radius at `1/e^2` intensity

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.w_0
        0.00100000000000000
        (   R   R(   R   R-   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyRE   J  s    c         C  s   |  j  t |  j S(   sï   
        Half of the total angular spread.

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.divergence
        0.00053/pi
        (   R-   R   RE   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt
   divergence^  s    c         C  s   t  |  j |  j ƒ S(   sÚ   
        The Gouy phase.

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.gouy
        atan(0.53/pi)
        (   R   R@   R(   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   gouym  s    c         C  s   d |  j  t S(   sª  
        The minimal waist for which the gauss beam approximation is valid.

        The gauss beam is a solution to the paraxial equation. For curvatures
        that are too great it is not a valid approximation.

        Examples
        ========

        >>> from sympy.physics.optics import BeamParameter
        >>> p = BeamParameter(530e-9, 1, w=1e-3)
        >>> p.waist_approximation_limit
        1.06e-6/pi
        i   (   R-   R   (   R.   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   waist_approximation_limit|  s    (   R4   R5   R6   t	   __slots__R#   R7   R*   RD   RA   RE   RF   RG   RH   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR
   Õ  s   -	c         C  s+   t  t |  | f ƒ \ }  } |  d t | S(   s^  
    Calculate the rayleigh range from the waist of a gaussian beam.

    See Also
    ========

    rayleigh2waist, BeamParameter

    Examples
    ========

    >>> from sympy.physics.optics import waist2rayleigh
    >>> from sympy import symbols
    >>> w, wavelen = symbols('w wavelen')
    >>> waist2rayleigh(w, wavelen)
    pi*w**2/wavelen
    i   (   R9   R   R   (   RA   R-   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   “  s    c         C  s-   t  t |  | f ƒ \ }  } t |  t | ƒ S(   sj  Calculate the waist from the rayleigh range of a gaussian beam.

    See Also
    ========

    waist2rayleigh, BeamParameter

    Examples
    ========

    >>> from sympy.physics.optics import rayleigh2waist
    >>> from sympy import symbols
    >>> z_r, wavelen = symbols('z_r wavelen')
    >>> rayleigh2waist(z_r, wavelen)
    sqrt(wavelen*z_r)/sqrt(pi)
    (   R9   R   R   R   (   R(   R-   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   ©  s    c         C  sm   t  t |  | f ƒ \ }  } t |  ƒ t k s? t | ƒ t k rY t | ƒ t k rU |  S| S|  | |  | Sd S(   s¶  
    Conjugation relation for geometrical beams under paraxial conditions.

    Takes the distances to the optical element and returns the needed
    focal distance.

    See Also
    ========

    geometric_conj_af, geometric_conj_bf

    Examples
    ========

    >>> from sympy.physics.optics import geometric_conj_ab
    >>> from sympy import symbols
    >>> a, b = symbols('a b')
    >>> geometric_conj_ab(a, b)
    a*b/(a + b)
    N(   R9   R   t   absR   (   t   at   b(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   ¾  s    $c         C  s*   t  t |  | f ƒ \ }  } t |  | ƒ S(   sp  
    Conjugation relation for geometrical beams under paraxial conditions.

    Takes the object distance (for geometric_conj_af) or the image distance
    (for geometric_conj_bf) to the optical element and the focal distance.
    Then it returns the other distance needed for conjugation.

    See Also
    ========

    geometric_conj_ab

    Examples
    ========

    >>> from sympy.physics.optics.gaussopt import geometric_conj_af, geometric_conj_bf
    >>> from sympy import symbols
    >>> a, b, f = symbols('a b f')
    >>> geometric_conj_af(a, f)
    a*f/(a - f)
    >>> geometric_conj_bf(b, f)
    b*f/(b - f)
    (   R9   R   R   (   RK   R=   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   Ú  s    c         C  sž   t  t |  | | f ƒ \ }  } } d d |  | d |  | d | } d t d |  | d | | d ƒ } | d |  | d | | d } | | | f S(   sŸ  
    Conjugation relation for gaussian beams.

    Parameters
    ==========

    s_in : the distance to optical element from the waist
    z_r_in : the rayleigh range of the incident beam
    f : the focal length of the optical element

    Returns
    =======

    a tuple containing (s_out, z_r_out, m)
    s_out : the distance between the new waist and the optical element
    z_r_out : the rayleigh range of the emergent beam
    m : the ration between the new and the old waists

    Examples
    ========

    >>> from sympy.physics.optics import gaussian_conj
    >>> from sympy import symbols
    >>> s_in, z_r_in, f = symbols('s_in z_r_in f')

    >>> gaussian_conj(s_in, z_r_in, f)[0]
    1/(-1/(s_in + z_r_in**2/(-f + s_in)) + 1/f)

    >>> gaussian_conj(s_in, z_r_in, f)[1]
    z_r_in/(1 - s_in**2/f**2 + z_r_in**2/f**2)

    >>> gaussian_conj(s_in, z_r_in, f)[2]
    1/sqrt(1 - s_in**2/f**2 + z_r_in**2/f**2)
    i   iÿÿÿÿi   (   R9   R   R   (   t   s_int   z_r_inR=   t   s_outt   mt   z_r_out(    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   ø  s
    #!&("c   	      K  s  t  t |  | | f ƒ \ }  } } | | } t | |  ƒ } t | ƒ d k r[ t d ƒ ‚ nµ d | k r| t t d ƒ ƒ ‚ n” d | k rÝ t | d ƒ } | d t d | d | d | d ƒ } t | | | ƒ d } n3 d | k rþ t t d ƒ ƒ ‚ n t t d	 ƒ ƒ ‚ | | | f S(
   sà  
    Find the optical setup conjugating the object/image waists.

    Parameters
    ==========

    wavelen : the wavelength of the beam
    waist_in and waist_out : the waists to be conjugated
    f : the focal distance of the element used in the conjugation

    Returns
    =======

    a tuple containing (s_in, s_out, f)
    s_in : the distance before the optical element
    s_out : the distance after the optical element
    f : the focal distance of the optical element

    Examples
    ========

    >>> from sympy.physics.optics import conjugate_gauss_beams
    >>> from sympy import symbols, factor
    >>> l, w_i, w_o, f = symbols('l w_i w_o f')

    >>> conjugate_gauss_beams(l, w_i, w_o, f=f)[0]
    f*(1 - sqrt(w_i**2/w_o**2 - pi**2*w_i**4/(f**2*l**2)))

    >>> factor(conjugate_gauss_beams(l, w_i, w_o, f=f)[1])
    f*w_o**2*(w_i**2/w_o**2 - sqrt(w_i**2/w_o**2 -
              pi**2*w_i**4/(f**2*l**2)))/w_i**2

    >>> conjugate_gauss_beams(l, w_i, w_o, f=f)[2]
    f
    i   s,   The function expects only one named argumentt   distsD   
            Currently only focal length is supported as a parameterR=   i   i    RM   sG   
            The functions expects the focal length as a named argument(	   R9   R   R   R   R!   t   NotImplementedErrorR   R   R   (	   R-   t   waist_int	   waist_outRB   RP   R@   R=   RM   RO   (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyR   "  s$    %!
,N(#   R6   t
   __future__R    R   t   __all__t   sympyR   R   R   R   R   R   R   R   R   R   R   t   sympy.utilities.miscR   R   R   R   R   R   R   R   R	   R
   R   R   R   R   R   R   R   (    (    (    s<   lib/python2.7/site-packages/sympy/physics/optics/gaussopt.pyt   <module>   sF   	L "[¾					*