Calculations/GaussianBeamABCD-Calculator/Example.ipynb

590 lines
62 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Gaussian Beam Propagation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import files"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import BeamPropagation as bs # This is the script that handles the propagation\n",
"import sympy as sym # For Symbolic examples\n",
"import numpy as np # Handling of lists and for plotting\n",
"import matplotlib.pyplot as plt # Plotting"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's show what BeamProp_Script has"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on module BeamProp_Script:\n",
"\n",
"NAME\n",
" BeamProp_Script - Created on Wed Feb 19 15:51:54 2020\n",
"\n",
"DESCRIPTION\n",
" @author: wrighta\n",
"\n",
"FUNCTIONS\n",
" W0(zr, lam)\n",
" Parameters\n",
" ----------\n",
" zr : float, integer, symbol\n",
" Rayleigh range in meters\n",
" lam : float, integer, symbol\n",
" Wavelength of light in meters\n",
" \n",
" Returns\n",
" -------\n",
" w0 : float, integer, symbol\n",
" Beam waist radius in meters\n",
" \n",
" Zr(wo, lam)\n",
" Parameters\n",
" ----------\n",
" wo : float, integer, or symbol\n",
" Beam waist radius in meters.\n",
" lam : float, integer, or symbol\n",
" Wavelength of light in meters.\n",
" \n",
" Returns\n",
" -------\n",
" zr : float, int, symbols\n",
" Rayleigh range for given beam waist and wavelength.\n",
" \n",
" lens(f)\n",
" Parameters\n",
" ----------\n",
" f : float or integer or sympy symbol in meters\n",
" Thin lens focal length in meters\n",
" \n",
" Returns\n",
" -------\n",
" mat : 2x2 matrix\n",
" [\n",
" [ 1, 0],\n",
" [-1/f, 1]\n",
" ]\n",
" \n",
" mult(mat1, *argv)\n",
" Parameters\n",
" ----------\n",
" mat1 : 2x2 ABCD matrix\n",
" Last matrix light interacts with.\n",
" *argv : 2x2 ABCD matrices \n",
" From left to right, the matrices should be entered such that the leftmost matrix interacts\n",
" with light temporally after the rightmost matrix.\n",
" \n",
" Returns\n",
" -------\n",
" Mat : 2x2 matrix\n",
" The ABCd matrix describing the whole optical system.\n",
" \n",
" plot(func, var, rang=array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,\n",
" 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,\n",
" 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,\n",
" 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,\n",
" 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,\n",
" 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,\n",
" 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,\n",
" 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,\n",
" 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,\n",
" 0.99, 1. , 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09,\n",
" 1.1 , 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2 ,\n",
" 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3 , 1.31,\n",
" 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4 , 1.41, 1.42,\n",
" 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5 , 1.51, 1.52, 1.53,\n",
" 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6 , 1.61, 1.62, 1.63, 1.64,\n",
" 1.65, 1.66, 1.67, 1.68, 1.69, 1.7 , 1.71, 1.72, 1.73, 1.74, 1.75,\n",
" 1.76, 1.77, 1.78, 1.79, 1.8 , 1.81, 1.82, 1.83, 1.84, 1.85, 1.86,\n",
" 1.87, 1.88, 1.89, 1.9 , 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97,\n",
" 1.98, 1.99, 2. , 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08,\n",
" 2.09, 2.1 , 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19,\n",
" 2.2 , 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3 ,\n",
" 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4 , 2.41,\n",
" 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 , 2.51, 2.52,\n",
" 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59, 2.6 , 2.61, 2.62, 2.63,\n",
" 2.64, 2.65, 2.66, 2.67, 2.68, 2.69, 2.7 , 2.71, 2.72, 2.73, 2.74,\n",
" 2.75, 2.76, 2.77, 2.78, 2.79, 2.8 , 2.81, 2.82, 2.83, 2.84, 2.85,\n",
" 2.86, 2.87, 2.88, 2.89, 2.9 , 2.91, 2.92, 2.93, 2.94, 2.95, 2.96,\n",
" 2.97, 2.98, 2.99]))\n",
" Parameters\n",
" ----------\n",
" func : Sympy function of one variable\n",
" Sympy function defining the beam width after the last optical element.\n",
" var : sympy variable\n",
" Variable in func that will be plotted.\n",
" rang : numpy array\n",
" Array of the values along the optical axis to be plotted\n",
" \n",
" Returns\n",
" -------\n",
" plot : matplotlib graph\n",
" Graph of the beam width of var\n",
" \n",
" prop(d)\n",
" Parameters\n",
" ----------\n",
" d : float or integer or sympy symbol\n",
" Distance light is propagating along the z-axis.\n",
" \n",
" Returns\n",
" -------\n",
" mat: 2x2 matrix\n",
" [\n",
" [1, d],\n",
" [0, 1]\n",
" ]\n",
" \n",
" q1_func(z, w0, lam, mat)\n",
" Parameters\n",
" ----------\n",
" z : float, int, symbol\n",
" Position of the beam waist in meters.\n",
" w0 : float, int, symbol\n",
" Radial waist size in meters (of the embedded Gaussian, i.e. W0/M).\n",
" lam : float, int, symbol\n",
" Wavelength of light in meters.\n",
" mat : float, int, symbol\n",
" The ABCD 2x2 matrix describing the optical system.\n",
" \n",
" Returns\n",
" -------\n",
" z: float, int, symbol\n",
" Position of the beam waist after the optical system\n",
" zr: float, int, symbol\n",
" Rayleigh range of the beam after the optical system\n",
" \n",
" q1_inv_func(z, w0, lam, mat)\n",
" Parameters\n",
" ----------\n",
" z : float, int, symbol\n",
" Position of the beam waist in meters.\n",
" w0 : float, int, symbol\n",
" Radial waist size in meters (of the embedded Gaussian, i.e. W0/M).\n",
" lam : float, int, symbol\n",
" Wavelength of light in meters.\n",
" mat : float, int, symbol\n",
" The ABCD 2x2 matrix describing the optical system.\n",
" \n",
" Returns\n",
" -------\n",
" R : float, int, symbol\n",
" Radius of curvature of the wavefront in meters.\n",
" w : float, int, symbol\n",
" Radius of the beam in meters.\n",
" \n",
" ray(y, theta)\n",
" Parameters\n",
" ----------\n",
" y : float or integer or sympy symbol in meters\n",
" The vertical height of a ray.\n",
" theta : float or integer in radians\n",
" The angle of divergence of the ray.\n",
" \n",
" Returns\n",
" -------\n",
" mat : 2x1 matrix\n",
" [\n",
" [y],\n",
" [teta]\n",
" ]\n",
"\n",
"DATA\n",
" oo = oo\n",
"\n",
"FILE\n",
" c:\\users\\wrighta\\documents\\beamprop\\beamprop_script.py\n",
"\n",
"\n"
]
}
],
"source": [
"help(bs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let's first see how we define a beam and how we can visualize it propagating."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A Gaussian beam can be defined by it's (radial) waist, $w_0$, it's Rayleigh range, $z_R = \\frac{\\pi * w_0^2}{\\lambda}$, and the location of its waist, $z_0$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"w0 = 1E-3 # 1mm beam waist\n",
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
"z0 = 0 # location of waist in m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We now want to define our \"optical system\" using matrices. For this first example, we will just use a free space propagation matrix, and let the beam propagate a distance $d$ which we will define using a symbol."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"d = sym.symbols('d')\n",
"M = bs.prop(d)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We now use the bs script to do all the ABCD and q-parameter math, and return the waist and radius of curvature functions"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"R, w = bs.q1_inv_func(0, w0, lam, M)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"w = 0.001*(0.0127690021685256*d**2 + 1)**0.5\n"
]
}
],
"source": [
"print('w = {}'.format(w))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### And as simple as that, we have a function for our waist. Let's plot it and see what it looks like"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"bs.plot(w, d, rang = np.arange(0,10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's show what happens when a beam travels through a lens. We use the \"mult\" function to multiply multiple ABCD matrices together."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"w0 = 1E-3 # 1mm beam waist\n",
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
"z0 = 0 # location of waist in m\n",
"\n",
"d = sym.symbols('d')\n",
"M = bs.mult(bs.prop(d), bs.lens(.5), bs.prop(1))\n",
" \n",
"R, w = bs.q1_inv_func(0, w0, lam, M)\n",
"\n",
"bs.plot(w, d, rang = np.arange(0,1,.01))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lets look at how to expand and collimate a beam with a two lens system"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"w0 = 1E-3 # 1mm beam waist\n",
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
"z0 = 0 # location of waist in m\n",
"\n",
"d1, d2, d3, f1, f2 = sym.symbols('d1 d2 d3 f1 f2')\n",
"\n",
"M = bs.mult(bs.prop(d3),bs.lens(f2),bs.prop(d2), bs.lens(f1), bs.prop(d1))\n",
"\n",
"R, w = bs.q1_inv_func(0, w0, lam, M)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### For example, lets say the beam travels 1 m before hitting the first lens, and we want the beam to be 5x w0 after coming out of the second lens. We substitute d1 for 1 meter, since the beam propagates 1 meter, and we substitute d3 for 0, since we only care about the beam size right at the second lens. This gives us a relation between f1 and d2 (the separation between the lenses)."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"f = 1.0084642216545e+15*d2*(1.12051580183833e+27*d2 - 4.41556446152598e+29*sqrt(1 - 0.000504320418227052*d2**2) + 8.88733242867719e+28)/(1.13000009595246e+42*d2**2 + 2.26000019190491e+42*d2 - 2.12276362486616e+45)\n"
]
}
],
"source": [
"w = w.subs(d1,1).subs(d3,0)\n",
"f1_eq = sym.solve(w - 5*w0, f1)[0]\n",
"print('f = {}'.format(f1_eq))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Suppose we wanted the distance between the lenses to be 1 meter, we could find what f1 we need."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"f1 = 0.17 m, for a lens separation of 1 meter\n"
]
}
],
"source": [
"print('f1 = {:.2f} m, for a lens separation of 1 meter'.format(f1_eq.subs(d2, 1)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now we need to collimate the beam. Lets still assume the beam propagates 1 m, and f1 = .17 m."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are a couple different ways to think about collimation. One is that the beam size doesn't change over a long distance. The other is that the radius of curvature is infinite (i.e. a plane wave). Lets us the latter interpretation. Thus, we want to find the focal length f2 that makes R infinite, or that makes 1/R =0."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"f2 = 0.83, for a collimated beam, 5x the original waist, after propagating 1m to the first lens of f1 = .17m, and propagating another 1m to the second lens\n"
]
}
],
"source": [
"R_coll = R.subs(d1,1).subs(d2,1).subs(f1,.17).subs(d3,0)\n",
"f2_coll = sym.solve(1/R_coll,f2)[0]\n",
"print('f2 = {:.2f}, for a collimated beam, 5x the original waist, after propagating 1m to the first lens of f1 = .17m, and propagating another 1m to the second lens'.format(f2_coll))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lets plot the beam profile after the second lens, and see if it is collimated."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAEGCAYAAABGnrPVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAavUlEQVR4nO3de7hdVXnv8e/PhPslIQQ3uWGiRNtAa4GcEAzwbIpAtDwEWzgNHjG00rQKp7RHHwXtgZ60tFotiFUuAaOIVqDokVQCGC7rgAiBoGiIIbC5CDHcg0C4dsN7/phj42Jlrb1m9h5rr7XC7/M868mcY44x5ztYYb2ZtzEUEZiZmeXytnYHYGZmWxYnFjMzy8qJxczMsnJiMTOzrJxYzMwsq9HtDqATjB8/PqZOnTqkti+88AI77LBD3oDaxH3pTO5LZ3Jf4M4773wqInarLXdiAaZOncrKlSuH1LZSqdDb25s3oDZxXzqT+9KZ3BeQ9Kt65b4UZmZmWTmxmJlZVk4sZmaWlROLmZll5cRiZmZZObGYmVlWTixmZpaV32MZhttug2uu2Z2HHmpcp9msBGVmLRipOvfcM4F77+2MWIa7j3vvncjq1Z0Ry3CP09c3mZ/9rDNiGW6dBx6YwooVnRHLUOpUb3/wwXdw882dEctw6hx/fPM6m8uJZRguuQTOPfd32h1GRu9pdwAZvbvdAWS0Z7sDyOhd7Q4go2ntDqAUafDt73sfbLtt3mM6sQzDokVw0EG3MXv27EHrNftim20fqTo/+clPmDPnfR0Ry3D3ccsttzBnzpyOiGW4x7n55ps56KCDOiKW4da56aabOPjggzsilqHWGdg+2NvqIxlvDpVK3v05sQzDrrvC7ru/zBCHGes4u+32KhMntjuKPMaO/S9222QEo+60446vMWZMu6PIY5ttXme77dodRR6jRhUf25Rv3puZWVZOLGZmlpUTi5mZZeXEYmZmWTmxmJlZVk4sZmaWlROLmZll5cRiZmZZObGYmVlWTixmZpaVE4uZmWXlxGJmZlm1NbFImitpraQ+SafW2b6NpMvS9hWSplZtOy2Vr5V0RE27UZJ+JumHre+FmZlVa1tikTQK+BrwAWAGcJykGTXVPgY8ExF7AmcDX0htZwDzgb2AucC5aX8DTgHWtLYHZmZWTzvPWGYBfRHxQES8ClwKzKupMw+4OC1fARwqSan80oh4JSIeBPrS/pA0Gfgj4KIR6IOZmdVoZ2KZBDxStb4uldWtExH9wLPArk3afhn4NPB6/pDNzKyZdk70VW9utNoZmhvVqVsu6UjgiYi4U1LvoAeXFgILAXp6eqgMcQq1jRs3Drltp3FfOpP70pncl8bamVjWAVOq1icD6xvUWSdpNDAG2DBI26OAoyR9ENgW2FnStyPiI7UHj4jFwGKAmTNnRqMpRpsZbHrSbuO+dCb3pTO5L42181LYHcB0SdMkbU1xM35pTZ2lwIK0fAxwQ0REKp+fnhqbBkwHbo+I0yJickRMTfu7oV5SMTOz1mnbGUtE9Es6GbgWGAUsiYjVkhYBKyNiKfB14BJJfRRnKvNT29WSLgd+CfQDJ0XEa23piJmZvUk7L4UREcuAZTVlp1ctvwwc26DtmcCZg+y7AlRyxGlmZuX5zXszM8vKicXMzLJyYjEzs6ycWMzMLCsnFjMzy8qJxczMsnJiMTOzrJxYzMwsKycWMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8vKicXMzLJyYjEzs6ycWMzMLCsnFjMzy8qJxczMsnJiMTOzrJxYzMwsKycWMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8vKicXMzLJyYjEzs6ycWMzMLCsnFjMzy8qJxczMsnJiMTOzrJxYzMwsq7YmFklzJa2V1Cfp1Drbt5F0Wdq+QtLUqm2npfK1ko5IZVMk3ShpjaTVkk4Zud6YmRm0MbFIGgV8DfgAMAM4TtKMmmofA56JiD2Bs4EvpLYzgPnAXsBc4Ny0v37gkxHxu8Bs4KQ6+zQzsxZq5xnLLKAvIh6IiFeBS4F5NXXmARen5SuAQyUplV8aEa9ExINAHzArIh6NiJ8CRMTzwBpg0gj0xczMktFtPPYk4JGq9XXA/o3qRES/pGeBXVP5bTVt35RA0mWzfYAV9Q4uaSGwEKCnp4dKpTKkTmzcuHHIbTuN+9KZ3JfO5L401s7EojplUbLOoG0l7Qh8D/ibiHiu3sEjYjGwGGDmzJnR29tbIuRNVSoVhtq207gvncl96UzuS2PtvBS2DphStT4ZWN+ojqTRwBhgw2BtJW1FkVS+ExHfb0nkZmbWUDsTyx3AdEnTJG1NcTN+aU2dpcCCtHwMcENERCqfn54amwZMB25P91++DqyJiLNGpBdmZvYmbbsUlu6ZnAxcC4wClkTEakmLgJURsZQiSVwiqY/iTGV+arta0uXALymeBDspIl6TdCBwPLBK0l3pUJ+NiGUj2zszs7eudt5jIf3gL6spO71q+WXg2AZtzwTOrCn7MfXvv5iZ2Qjxm/dmZpZV0zMWSQcAHwEOAiYALwF3A1cB346IZ1saoZmZdZVBz1gkXQ2cSHEfZC5FYpkB/B2wLXClpKNaHaSZmXWPZmcsx0fEUzVlG4Gfps+/ShrfksjMzKwrDZpYapOKpJ2r20TEhjqJx8zM3sJKPRUm6S+BRRT3VwbecA/gnS2Ky8zMulTZx40/BezlsxMzM2um7OPG9wMvtjIQMzPbMpQ9YzkN+ImkFcArA4UR8dcticrMzLpW2cRyAXADsAp4vXXhmJlZtyubWPoj4n+1NBIzM9silL3HcqOkhZImSBo38GlpZGZm1pXKnrF8OP15WlWZHzc2M7NNlEosETGt1YGYmdmWodlYYQc22b6zpL3zhmRmZt2s2RnLn0j6F+Aa4E7gSYrBJ/cEDgHeAXyypRGamVlXaTZW2N9K2oViWuBj+e2w+WuAC9LEWmZmZm9oeo8lIp4BLkwfMzOzQXkGSTMzy8qJxczMsnJiMTOzrEolFknbS/rfki5M69MlHdna0MzMrBuVPWP5BsWoxgek9XXAP7YkIjMz62plE8u7IuJfgP8CiIiXALUsKjMz61plE8urkrYjTUss6V1UzctiZmY2oOwglH9P8fb9FEnfAeYAJ7QoJjMz62JlB6H8kaQ7gdkUl8BOiYinWhqZmZl1pbJPhV0P7B8RV0XEDyPiKUmLWxybmZl1obL3WKYBn5F0RlXZzBbEY2ZmXa5sYvkNcCjQI+k/JY1pYUxmZtbFyiYWRUR/RHwC+B7wY+DtrQvLzMy6VdnEcv7AQkR8k+KJsB8N9+CS5kpaK6lP0ql1tm8j6bK0fYWkqVXbTkvlayUdUXafZmbWWs1mkNw5Lf6HpHEDH+BB4FPDObCkUcDXgA8AM4DjJM2oqfYx4JmI2BM4G/hCajsDmA/sBcwFzpU0quQ+zcyshZo9bvzvwJEUs0cGb37bPoB3DuPYs4C+iHgAQNKlwDzgl1V15lG8QwNwBfBVSUrll0bEK8CDkvrS/iixTzMza6FmM0gemf6c1oJjTwIeqVpfB+zfqE5E9Et6Ftg1ld9W03ZSWm62TwAkLQQWAvT09FCpVIbUiY0bNw65badxXzqT+9KZ3JfGSr0gKWkOcFdEvCDpI8C+wJcj4uFhHLveWGNRsk6j8nqX9mr3WRRGLAYWA8ycOTN6e3sbBjqYSqXCUNt2GvelM7kvncl9aazszfvzgBclvRf4NPAr4JJhHnsdMKVqfTKwvlEdSaOBMcCGQdqW2aeZmbVQ2cTSHxFBcb/inIg4B9hpmMe+A5guaZqkrSluxi+tqbMUWJCWjwFuSHEsBeanp8amAdOB20vu08zMWqjsIJTPSzoN+AhwcHr6aqvhHDjdMzkZuBYYBSyJiNWSFgErI2Ip8HXgknRzfgNFoiDVu5zipnw/cFJEvAZQb5/DidPMzDZP2cTyp8CHgY9FxGOS9gC+ONyDR8QyYFlN2elVyy8DxzZoeyZwZpl9mpnZyCk7uvFjwFlV6w8D32pVUGZm1r3K3mMxMzMrxYnFzMyycmIxM7Osyk70daSkn0naIOk5Sc9Leq7VwZmZWfcp+1TYl4E/Blal90jMzMzqKnsp7BHgbicVMzNrpuwZy6eBZZL+H/DKQGFEnNW4iZmZvRWVTSxnAhuBbYGtWxeOmZl1u7KJZVxEHN7SSMzMbItQ9h7LdZKcWMzMrKmyieUk4BpJL/lxYzMzG0zZscKGO0S+mZm9RZS9x4KkXSjmPdl2oCwibmpFUGZm1r3KTk18InAKxYyMdwGzgVuBP2xdaGZm1o3K3mM5BfhvwK8i4hBgH+DJlkVlZmZdq2xieTlNuoWkbSLiHuA9rQvLzMy6Vdl7LOskjQV+ACyX9AywvnVhmZlZtyr7VNiH0uLfS7oRGANc07KozMysa23OU2EHAtMj4huSdgMmAQ+2LDIzM+tKZedjOQP4DHBaKtoK+HargjIzs+5V9ub9h4CjgBcAImI94JcmzcxsE2UTy6tpLpYAkLRD60IyM7NuVjaxXC7pAmCspL8ArgMubF1YZmbWrco+FfYlSYcBz1G8v3J6RCxvaWRmZtaVSj8VlhLJcknjgadbF5KZmXWzQS+FSZotqSLp+5L2kXQ3cDfwuKS5IxOimZl1k2ZnLF8FPkvxQuQNwAci4jZJvwN8F78kaWZmNZrdvB8dET+KiP8AHouI2wDSWGFmZmabaJZYXq9afqlmW2SOxczMtgDNLoW9N01BLGC7qumIRdWEX2ZmZgMGPWOJiFERsXNE7BQRo9PywPpWQz2opHGSlku6L/25S4N6C1Kd+yQtqCrfT9IqSX2SviJJqfyLku6R9AtJ/zeNyGxmZiOo7AuSuZ0KXB8R04Hr0/qbSBoHnAHsD8wCzqhKQOcBCymmSp4ODDyhthzYOyJ+H7iX345tZmZmI6RdiWUecHFavhg4uk6dI4DlEbEhIp6hSBpzJU0Ado6IW9MwM98aaJ8eNOhP7W+jmErZzMxGUOkXJDPriYhHASLiUUlvr1NnEvBI1fq6VDYpLdeW1/pz4LJGAUhaSHHWQ09PD5VKZXPif8PGjRuH3LbTuC+dyX3pTO5LYy1LLJKuA3avs+lzZXdRpywGKa8+9ueAfuA7jXYeEYuBxQAzZ86M3t7ekmG9WaVSYahtO4370pncl87kvjTWssQSEe9vtE3S45ImpLOVCcATdaqtA3qr1icDlVQ+uab8jWmS003+I4FD06UyMzMbQe26x7IUGHjKawFwZZ061wKHS9ol3bQ/HLg2XUJ7Pg03I+CjA+3TMDOfAY6KiBdb3QkzM9tUuxLL54HDJN0HHJbWkTRT0kUAEbEB+AfgjvRZlMoAPg5cBPQB9wNXp/KvUkxAtlzSXZLOH6H+mJlZ0pab9xHxNHBonfKVwIlV60uAJQ3q7V2nfM+8kZqZ2eZq1xmLmZltoZxYzMwsKycWMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8vKicXMzLJyYjEzs6ycWMzMLCsnFjMzy8qJxczMsnJiMTOzrJxYzMwsKycWMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8vKicXMzLJyYjEzs6ycWMzMLCsnFjMzy8qJxczMsnJiMTOzrJxYzMwsKycWMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8uqLYlF0jhJyyXdl/7cpUG9BanOfZIWVJXvJ2mVpD5JX5GkmnafkhSSxre6L2Zm9mbtOmM5Fbg+IqYD16f1N5E0DjgD2B+YBZxRlYDOAxYC09NnblW7KcBhwMOt7ICZmdXXrsQyD7g4LV8MHF2nzhHA8ojYEBHPAMuBuZImADtHxK0REcC3atqfDXwaiJZFb2ZmDbUrsfRExKMA6c+316kzCXikan1dKpuUlmvLkXQU8OuI+HkrgjYzs+ZGt2rHkq4Ddq+z6XNld1GnLBqVS9o+7fvwkvEtpLicRk9PD5VKpWRYb7Zx48Yht+007ktncl86k/syiIgY8Q+wFpiQlicAa+vUOQ64oGr9glQ2Abinth7we8ATwEPp009xn2X3ZvHst99+MVQ33njjkNt2GvelM7kvncl9iQBWRp3f1HZdClsKDDzltQC4sk6da4HDJe2SbtofDlwbxaWz5yXNTk+DfRS4MiJWRcTbI2JqREyluES2b0Q81vLemJnZG9qVWD4PHCbpPoonuD4PIGmmpIsAImID8A/AHemzKJUBfBy4COgD7geuHtnwzcyskZbdYxlMRDwNHFqnfCVwYtX6EmBJg3p7NznG1GEHamZmm81v3puZWVZOLGZmlpUTi5mZZeXEYmZmWTmxmJlZVk4sZmaWlROLmZll5cRiZmZZObGYmVlWTixmZpaVE4uZmWXlxGJmZlm1ZRDKLcUpp8B55x3M25qkZ9Wbmmwzto9UnddeO5DRJf5GjFS8w9lHf/+cN/rS7liGe5xXXz2ArbfujFiGW+eVV2azzTadEctQ6wxsf+mlWWy3XWfEMpw6F1zQfB+by4llGA45BJ58ch177LFHwzrFXGSNNds+knUefvhRpkyZ0hGxDHcfv/7140yaNLkjYhnucdavf5qJEyd2RCzDrfPYY8+w++4TOiKWodSp3v7448/T07N9R8QynDo77QS/+U3zepvDiWUYjj4axo59gN7exomlm1Qq99PbO3hi6RaVSh+9vZPbHUYWlcq99PZObHcYWVQqa+ntndC8YheoVNbQ29vT7jCyyD3Dsu+xmJlZVk4sZmaWlROLmZll5cRiZmZZObGYmVlWTixmZpaVE4uZmWXlxGJmZlkpyryauYWT9CTwqyE2Hw88lTGcdnJfOpP70pncF3hHROxWW+jEMkySVkbEzHbHkYP70pncl87kvjTmS2FmZpaVE4uZmWXlxDJ8i9sdQEbuS2dyXzqT+9KA77GYmVlWPmMxM7OsnFjMzCwrJ5aSJM2VtFZSn6RT62zfRtJlafsKSVNHPspySvTlBElPSrorfU5sR5zNSFoi6QlJdzfYLklfSf38haR9RzrGskr0pVfSs1XfyekjHWNZkqZIulHSGkmrJZ1Sp07Hfzcl+9EV34ukbSXdLunnqS//p06dfL9hEeFPkw8wCrgfeCewNfBzYEZNnU8A56fl+cBl7Y57GH05Afhqu2Mt0ZeDgX2Buxts/yBwNSBgNrCi3TEPoy+9wA/bHWfJvkwA9k3LOwH31vk71vHfTcl+dMX3kv4775iWtwJWALNr6mT7DfMZSzmzgL6IeCAiXgUuBebV1JkHXJyWrwAOlaQRjLGsMn3pChFxE7BhkCrzgG9F4TZgrKSOnBe3RF+6RkQ8GhE/TcvPA2uASTXVOv67KdmPrpD+O29Mq1ulT+2TW9l+w5xYypkEPFK1vo5N/4K9USci+oFngV1HJLrNU6YvAH+SLlFcIWnKyISWXdm+dosD0qWMqyXt1e5gykiXU/ah+Bdyta76bgbpB3TJ9yJplKS7gCeA5RHR8DsZ7m+YE0s59bJ2bbYvU6cTlInzP4GpEfH7wHX89l8x3aZbvpMyfkoxLtN7gX8DftDmeJqStCPwPeBvIuK52s11mnTkd9OkH13zvUTEaxHxB8BkYJakvWuqZPtOnFjKWQdU/6t9MrC+UR1Jo4ExdOaljaZ9iYinI+KVtHohsN8IxZZbme+tK0TEcwOXMiJiGbCVpPFtDqshSVtR/Bh/JyK+X6dKV3w3zfrRbd8LQET8BqgAc2s2ZfsNc2Ip5w5guqRpkramuLG1tKbOUmBBWj4GuCHSXbAO07QvNde6j6K4ttyNlgIfTU8gzQaejYhH2x3UUEjafeB6t6RZFP/vPt3eqOpLcX4dWBMRZzWo1vHfTZl+dMv3Imk3SWPT8nbA+4F7aqpl+w0bPdRA30oiol/SycC1FE9VLYmI1ZIWASsjYinFX8BLJPVRZPn57Yu4sZJ9+WtJRwH9FH05oW0BD0LSdymeyhkvaR1wBsVNSSLifGAZxdNHfcCLwJ+1J9LmSvTlGODjkvqBl4D5HfoPF4A5wPHAqnRNH+CzwB7QVd9NmX50y/cyAbhY0iiK5Hd5RPywVb9hHtLFzMyy8qUwMzPLyonFzMyycmIxM7OsnFjMzCwrJxYzM8vKicWsDkmTJV0p6T5J90s6J733M1ibsZI+UbU+UdIVm3nc0ZKekvTPJesvG3g/oWT9L0s6eDPq7ybpmrL1zcCJxWwT6YW37wM/iIjpwLuBHYEzmzQdSzFCLAARsT4ijtnMwx8OrAX+e5kBACPig+lN6qYkjaMY0famssFExJPAo5LmlG1j5sRitqk/BF6OiG9AMcYS8LfAn0vaXsV8NVdKukbFvDZnpHafB96V5uX4oqSpSvOrpAEAvyRpVRrc8382OPZxwDnAwxTDySNpTDrOe9L6dyX9RVp+SNJ4STtIuioNhni3pD+ts+9jgDfOPlLbf5J0q6SVkvaVdG06Q/urqnY/AP7HkP5L2luS37w329RewJ3VBRHxnKSHgT1T0Sxgb4q3xu+QdBVwKrB3GuhvYETcAQuBacA+afSDcbUHTUNtHAr8JcXZz3HArRHxbBot4ZuSzgF2iYgLa5rPBdZHxB+lfY2p0685FMOhV3skIg6QdDbwzVRnW2A1cH6qsxL4xzr7M6vLZyxmmxL1R3WtLl+eBut8ieKy2YFN9vl+ikmU+gEiot7gfkcCN0bEixQDH34oDcFBRCwHVgFfA+rN6LkKeL+kL0g6KCKerVNnAvBkTdnAOHGrKCbbej5d/nq56t7NE8DEJv0ze4MTi9mmVgMzqwsk7Uwx8uv9qag28TQbG6lRsqp2HEVyeIjijGlX4JB0/LcBv0sxHtUmZzsRcS/FKNSrgH9W/SlyX6I4G6k2MIr161XLA+sDVzS2TW3NSnFiMdvU9cD2kj4Kxf0R4F+Bb6azCYDDJI1Ll6+OBm4BnqeYwraeHwF/pWI4cmovhaXEdSCwR0RMjYipwEkUyQaKezxr0voSFcO5V7efCLwYEd8GvkQxzXGtNfz2Ut7meDdw9xDa2VuUE4tZjTQ67YeAYyXdRzHX+csUI9sO+DFwCXAX8L2IWBkRTwO3pJvnX6zZ7UUUN+R/IennwIdrtv8xxTDl1WcNVwJHpZv2JwKfjIibgZuAv6tp/3vA7WkU3s9R/57IVRQjKG+uQ1Jbs1I8urHZZpJ0AjAzIk5udyybS9KPgSPLPqKc2twEzIuIZ1oXmW1JfMZi9tbySdJ8ImVI2g04y0nFNofPWMzMLCufsZiZWVZOLGZmlpUTi5mZZeXEYmZmWTmxmJlZVv8fTvxhMlcc9sUAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"M = bs.mult(bs.prop(d3),bs.lens(.83),bs.prop(1), bs.lens(.17), bs.prop(1))\n",
"\n",
"R, w = bs.q1_inv_func(0, w0, lam, M)\n",
"\n",
"bs.plot(w,d3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Looks very collimated. Lets check the beam size (to make sure its 5* w0) and check the collimation"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"beam is w = 4.90 x w0\n"
]
}
],
"source": [
"expansion_factor = w.subs(d3,0)/ w0\n",
"print('beam is w = {:.2f} x w0'.format(expansion_factor))"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Over 10 m after second lens, beam changes by 1%\n"
]
}
],
"source": [
"beam_size_change = (w.subs(d3,10) - w.subs(d3,0)) / w.subs(d3,0) * 100\n",
"print('Over 10 m after second lens, beam changes by {:.0f}%'.format(beam_size_change))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}