{ "cells": [ { "cell_type": "markdown", "id": "0a7bf11e-2620-48d0-bd11-e377baae7ddf", "metadata": {}, "source": [ "# Example - Optimization Using Reciprocal Radii\n", "\n", "### April 2025\n", "\n", "This example demonstrates smooth surface transitions during optimization using the \"reciprocal_radius\" variable. This approach helps design optical systems without initially knowing whether each surface should be concave or convex.\n", "\n", "The \"reciprocal_radius\" is defined as 1/radius (the inverse of the radius of curvature). You define initial conditions using the regular \"radius\" parameter, but the optimization operates on this proxy variable instead.\n", "\n", "While the libary code attempts to handle edge cases, there are limitations. It's best to avoid setting the initial radius to exactly zero (which is physically meaningless) or infinity. If you do create a system with a radius of ±infinity or if you manually set reciprocal_radius to zero, it is possible that the optimization stops prematurely. In this case, just re-run the optimization from where it stopped, using either the same algorithm or a different one." ] }, { "cell_type": "code", "execution_count": 1, "id": "6403783e-b126-406d-8299-339780cfa1c6", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:06.868706Z", "iopub.status.busy": "2026-03-24T08:56:06.867796Z", "iopub.status.idle": "2026-03-24T08:56:10.509438Z", "shell.execute_reply": "2026-03-24T08:56:10.508850Z" } }, "outputs": [], "source": [ "import logging\n", "\n", "import numpy as np\n", "\n", "from optiland import analysis, optic, optimization\n", "\n", "# Disable the warning \"findfont: Font family 'cambria' not found.\" when running on Linux\n", "logging.getLogger(\"matplotlib.font_manager\").disabled = True" ] }, { "cell_type": "markdown", "id": "b5ad6d48-081d-4a54-8501-4811fcda5c99", "metadata": {}, "source": [ " ## 1. Definition of initial system\n", "\n", " We'll define a simple BK7 plano-concave singlet and optimize it to focus on the focal plane.\n", "\n", " We'll try two optimization approaches:\n", " - First using the standard \"radius\" variable\n", " - Then using the \"reciprocal_radius\" variable" ] }, { "cell_type": "code", "execution_count": 2, "id": "099b5744-2fa1-4a40-abf3-9d1220a7b897", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.511591Z", "iopub.status.busy": "2026-03-24T08:56:10.511311Z", "iopub.status.idle": "2026-03-24T08:56:10.515181Z", "shell.execute_reply": "2026-03-24T08:56:10.514819Z" } }, "outputs": [], "source": [ "class Singlet(optic.Optic):\n", " def __init__(self):\n", " super().__init__()\n", "\n", " # Define surfaces\n", " # object plane:\n", " self.surfaces.add(index=0, thickness=np.inf)\n", " # first surface, initially concave:\n", " self.surfaces.add(\n", " index=1, radius=-100, thickness=5, material=\"BK7\", is_stop=True\n", " )\n", " # the second surface is flat:\n", " self.surfaces.add(index=2, radius=np.inf, thickness=45)\n", " # image plane:\n", " self.surfaces.add(index=3)\n", "\n", " # Define aperture\n", " self.set_aperture(aperture_type=\"EPD\", value=10.0)\n", "\n", " # Define fields\n", " self.fields.set_type(field_type=\"angle\")\n", " self.fields.add(y=0)\n", " self.fields.add(y=1)\n", " self.fields.add(y=2)\n", "\n", " # Define wavelengths\n", " # Uncomment the blue and red wavelengths to see chromatic aberration effects\n", " # self.wavelengths.add(value=0.4861)\n", " self.wavelengths.add(value=0.5876, is_primary=True)\n", " # self.wavelengths.add(value=0.6563)" ] }, { "cell_type": "markdown", "id": "d289e9e2-2b62-4447-bf5b-e38ffa18d412", "metadata": {}, "source": [ "Here's our starting lens configuration:" ] }, { "cell_type": "code", "execution_count": 3, "id": "b9284227-b308-40b2-bcfc-2ed4d3449969", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.516635Z", "iopub.status.busy": "2026-03-24T08:56:10.516491Z", "iopub.status.idle": "2026-03-24T08:56:10.636544Z", "shell.execute_reply": "2026-03-24T08:56:10.636159Z" } }, "outputs": [ { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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y3YJhY888gief/75wPYseM9L92Ddm+tUKKkUYjpjneXj4ZQEGb8xc0qfU0qVaOg0uzMVIiIiImqBkCWh5YYbbsDy5cuRSEgHycPnk5/8pBoA+frrr1edV+y+++645pprCtX/3nrrLdXjoEN6Qbz44ovxgx/8ANdee60ajPiKK64I7BhZV330KvT29rIIPIR4PYmIiIhG+DhZb775pgo8kydPLuv4QsayGkpf/OIX1eRl1apVZdsOP/xwNYUBb8TDhyVZREREROFTd8hy2kMRUeMwQBMRERGN8OqCRERERERE5C0oI30Shbq6IEuyiIiIiEZYyPr4xz+O9957r+Yn/cxnPoONGzcO5ryIRgSGLCIiIqIRWl1wx44d+O1vf6t6tavFtm3bYJrmYM+NKPQYsoiIiIhGcJssGZ+KiBqLvQsSERERjdCQ9eSTTw79mRCN4JDlHt+NiIiIiIKNd3ZETWRZlpqzuiARERFReDBkEbUAhiwiIiKi8GDIImoilmQRERERjeCQtWnTpqE9E6IRiL0LEhEREY3gkHXsscdi7dq1Q3s2RCMwZEnAYsgiIiIiGoEh69/+7d9wySWX4IwzzlDjYBFRY6oLMmARERERjdCQdcwxx+COO+5QAUtKtX7zm98M7ZkRjaA2WUREREQ0AgcjFlOmTMH111+Pu+66C6effjre//73wzCMomNuv/32Rp8jUairC3KMLCIiIqIRHLLExo0b8eijj6K7uxuHHnpoWcgiotqZpsnqgkREREQjOWTdf//9uPrqq7HPPvvg7rvvxpgxY4buzIhGUMcXRERERDQCQ9app56K5557TlUTXLRo0dCeFdEIwZIsIiIiohEcsuRmUDq+mDhxIobbP/7xD9x4443YsGEDtmzZgvHjx+PTn/40vvrVryIajfo+7qSTTsLTTz9dtO3zn/88zj777GE4a6LqWJJFRERENIJD1g9+8AM0y6uvvqpuRiUcTZ06Fa+88gouvvhi9PX14Zvf/GbFxx511FH4xje+UVhPJBLDcMZEtWFJFhEREVH41N3xRTMccMABanJI0Hrttddw7733Vg1ZEqqk5IuoVbtwZ++CREREROESiJDlpaenR/VwWM3Pf/5zPPzwwxg3bhwOOeQQnHjiiSzNopbBwYiJiIiIwieQIev1119XY3VVK8VasGABJk+ejAkTJuCvf/0rrrnmGlUCdvnll/s+Jp1Oq8mRSqXUXKorytRMzjk0+zyo8dUFR9I1HQk/Kz+r4cNrGk68ruHDaxo+tutatsK1rfX1mxqyJPTccsstFY+55557MGPGjML6O++8o3o6PPzww1V7q0qkkwvHrFmzVLXBpUuX4o033lBVDr2sWbMGq1evLqxHIhEsXLhQlZxlMhk0+6JKOzTB0o9wkN8vKVnNZrMIO/k5pfRZPkthx89q+PCahhOva/jwmoZPxnX/3dvb2/T7cacApqVD1vHHH48jjjii4jFTpkwpLG/atAknn3wy5s2bh3POOafu15s7d26hJMwvZC1ZsgSLFy8ueiNXrlyJzs5OxONxtEJylnPhH45wkH8I5FpK2Ar7NU0mk9i+fbv6/Q07flbDh9c0nHhdw4fXNHzSrhpmHR0dTb8fr9SzecuELBnMuNYBjaUESwLWnDlzsHz58gF1FvDiiy+qeaWOMGKxmJpK30j5oLbCh9U5j1Y4F2pMdUEnYI2UazqSfs6RdF1HAl7TcOJ1DR9e03DRXNexFa5rra8fiG7NJGBJN+yTJk1S7bDeffddbN68WU3uY77whS/g2WefVetSJVDG1nrhhRfUOFuPP/64Cmd77bUXZs+e3cSfhqg4ZLF3QSIiIqJwCUTHF0888YSq4ieTDELsJgMUC2nTIp1aSJUkIaUD69evVwMoS5UsGUT54x//OL72ta815Wcg8sKQRURERBQ+gQhZ0m6rWtutXXfdtRC4hJR6rVq1ahjOjmjgOBgxERERUfjwK3SiJmJJFhEREVH48O6OqIkYsoiIiIjCh3d3RE3EkEVEREQUPry7I2oitskiIiIiCh+GLKImhyzDMJp9GkRERETUQAxZRE0clZ4lWUREREThw5BF1CQSsARLsoiIiIjChSGLqEkymYyas+MLIiIionDh3R1Rk2SzWTVnyCIiIiIKF97dETUJS7KIiIiIwol3d0RNkk6n1Zwhi4iIiChceHdH1OSSLHZ8QURERBQuDFlETcLqgkREREThxLs7oiZhyCIiIiIKJ97dETW5TRarCxIRERGFC0MWUZOwJIuIiIgonHh3R9TEkiyWYhERERGFT6TZJ0A0UjFkERERBYtt27BsKzfJf7altpm2WbRsw3WcXXIcXMc5zyf/Wbm55/PJcajj+VznWPfzyTJ8nq/SPp/nswf6Wvlzt7M2/hn/jKBhyCJqYnVBhiwiopFF3TTmb8Ar3Wi6l519ZTeuJTe2Zc9n+dzs5/f53uzbdYaHas/nEx5Kb7zLbs49Xsvr+UpfK2tmVV2tWp6vdF/Z+17ycwWNBg26pkPTNBiakVtGblm2yXphQv9xzr7Csmuf+/mcfe7nKd1naIaaonp0QK8FE0g+m0TQBCZkHXHEEdi4cWPRtmXLluErX/mK72NSqRSuvvpq/OIXv1ClBvvttx/OPPNMjBs3bhjOmKgy+f1kyCKigXDfVJbeaFb75rjSzW21b8Trfr4avxGv+1vvSuHBfRPvc/7u58tms9AMbcDf5td67u59QePcFLtvoktvzkv3qRvm/A2+1+Ts87vZ93qtqJa/SY9Ufi0zayIWjcHQjQG9lt+5F0JBhZ/LKzx4vVatQaXa81ULPrIcdOl0Git+sQJBE5iQJU4++WQceeSRhfWOjo6Kx1955ZVYt24dLr30UnR2duKyyy7D6aefjptvvnkYzpaoeklWJBKojyCFTOnNX7VvvQf0rfIQfEvtexPr9Xw1hgfPb9hLXiudSUM39KLH1Pxag6gK5PcN+0j6Nr2em8p6vk2Xc7BMS92QV7pZrvmGuMafqyyoVHm+SkGl1ucbTPAJEvmM9PT0qPu+MAQMCq5A3eG1t7dj/PjxNR0rH7Cf/vSnuOiii7D33nurbcuXL8fRRx+NP//5z9hzzz2H+GyJqn8zE5SQ5VRvUf85y17bXMvOt7Vy4yj3gzusHejVerGxZ2PVb6mrfSNez7fUVZ+vUnjw+ia6UnhwboYtU92QGxGj7LU8b84H+Fq1fpvv93xBU8+3xPV+I13Lzb68ZwZKqrzU8lpyI6zX91oD/Ta9Ud9+j5Rv03lDTkRDJRh3eHm33HILbrrpJkycOBELFizAcccd53uT+sILL6gqAPvuu29h24wZMzBp0iQ888wzviFLbnyd8YucKl1C3Tjazf3m8KKHnsf/fXmz+iaV/xR4sG3osBBBFgZMGLaZn8u6/3a1LPtsExG17Domv13mNqTL9TRsLQNLS8NGFpYsq3lWzbMy17KQW2lT5pqJrGYhK3M5QrOQUZONNExsMnfi/z55F8Zu7oCtSRbR1PfTuWWULHvsk59bkyCTo+ZF++384+yyx/XvL1638r9ccqteeM5G6QRuu/c2NEvuplT9H4Zzc6xuAvtvGjV1c9t/45jbnrt5zB3n3EiW3CyX3ODLGxcxImU31c4NaESPNLZe/EBu7l03wEU3xbr/Ps/zrfLtfaXnqyf4NBNvxgen2f9++nH+bW/V86P68ZqGj+26lq1wbWt9/cCErC9+8YuYM2cORo0ahT/96U+49tprsXnzZnzrW9/yPH7Lli2IRqPo6uoq2j527Fi1z8+aNWuwevXqwrqEuIULF6p/XJ1xjZplcmcEc3ZpU+146v5HXgWQXLDQ7fw8Hybc67oED9nmXs6vlz/WWS/erx6nHp9/7vxzDeyxrsfln0tT39BLaMkirQKMhTRy4SWl6UhqGtKahqSuIaXlpqR7bvSvy7TT2VdyvHoO57g6x7KK2EBMTRpi0BC1dbUchcwjiEBHPGtj4oQYnnnoTew2YxdolsQhlZFU4tHzIUezZXL22Wpd6M42u397/zG5fblbXzk2t0+es2hu2zDyj5GfUB6n5/c789y2/H4ZPDkf23JzwCh6TG656Bi7fz0XguUxEm5z+yP55889V/+5qCn/Pjj7cueQ359fV6/p2td/XPE+Z1uj2XLzX5hyryrLdj6IFe/3mrT88UbRutdkl+03itflJ5a53r9e9Jy6kT/G/zWc43OvVfmcPH92eQ3XeuGYsnNyntdwPU//68i2rO/P77xG6WNK3g/n9ZzXLrxHrmPUe+L182ll/6j29fXlPpMMWaHB6xo+vKbh477/7u3tbfr9uFMA09Ih65prrlGlU5Xcc889qgTq+OOPL2ybPXu2ClCXXHKJ6vwiFos17JyWLFmCxYsXF72RK1euVN9exuNxNNPXsnfC7F2nbkxhZwEzA1gmYGUBS5ZlW9a1buaPyapgMlSymoGUEUUyEkVaN5A0okjpESQN2W4gpRvok2N0CTIy14uCT24ZkF9ZmUs5YhI6UtCQgoEkLKRsEylYSNq5ZaeUpRYSNOJ6FAk9hrgRRdyIIaHH1TxuxJEw4miPJDDWiCMeaUM8kkDcSKjlRFTW29W2hNoux8u+eNGymsvj85OUHlRz66234tEnHsVzjz6FEz97BnbffXc0mqWqiAGmjcK8sGzlSqlMZ7nkmGzJ4+p9fOnjNm3eAj0Sw26zd0fatJDJWkjJ3LSRzpiq5Nk0s8hmTWRMU/UOlTVNmDJls/kvCiRwWYVAZ2hW0bqEuFy4698m+yOajZgBxAwNccNGXAeiOgrb1LJuI6rbiOW3RzQgagBRzc7NZb9s04GIWrbVXI5T6zpgyDYJjpoNK5tGWzyi9hv5Y3IhU847N+XOTz7P8uWBVKt0Jtkmb6rZv01Vu8xPlvtYr0k+9yXb1HPln7docl6jZJ/7tcse57Ov6DG5axFUtkfw6pIbtkKILJ0qBFJ38PR8TMm+stdw9vm9dv68igJsSbj1PN9K5zqY8/UKw7Wc00DOy+e1fa+T7vmNNEsow4PXNHzSrhpm0h9Ds+/HJYO0fMiS4CS9BlYyZcoUz+1z585VN1//+Mc/VAgrJT0IStLdsWNHUWnW1q1bK/YuKIHNHdqcN1I+qM3+sNrt42CPeh8QS0AzIoAeBfQIoJZz6/JNblp3BRgVXGykYEM6v1RBRUILbKRsJ7Rk1ba0bSJpmUjZGSStrNqesjJImpnc3EojZaaRstJImim1nDSTyEqo8z9riWH5KccJIhJu/MJKZ345JoGoZJ8Tdry2uQOQs66qZbXgH1r5vX344YfV8vXXX48TTjgBrcwpDartT0u52dEs9tlnHyxYsNeAHp91ApkKZ2ZhOWNauW2uZWeeLpn3b8891tnWl7WwzfQ4LpNbludWwbCwv//xsn0wIrqGWERXU9TQETN0xJ1lNXf2GyoQqmUjvz+am8fdj3fN43JcREPMMIqfK7/f/zVzxw76c6MCWC5EeoZB3+BXa/hz7/d7jUph1Of1rfLQa8sXPck+xKNSzbP0nKqFXr+fvVqALQ3c2Tpfo9LPXU+w9nhvg6w0PEuglmq1VQNepdDp2u8b8AYSPH1e2zeIDzB4ep5TrYG7lp+92mt4lSbXE+rzxziXOH/P1or/9lP93NexFa5rra/f1JA1ZswYNQ3ESy+9pOr5S/U/Lx/84AdVVb/169fjsMMOU9teffVVvPXWW5g3bx6CaFVHFE92achqvUhlU0hmk0hJ2MmmkLLyc1PiU+3fHksAKQsv7tAS7cCotv7Q4hVoCqU4PqFHBSXXczf7w9Eq5AuCTZs2qeUXX3wRn/jEJwqdtFC5iKEjYgBtUsw04Kg3NN+aqtCVL53LBTUT727vQSSWQNYqDmSFkGaaRYGvEOyyJcGuJODtSGaLQmQma/uGSXntwSgKZIXA5h3scvvzwa40xMl2J+Tlj3M/b/+xEY/XzK+7jjP0JvwNkevc04N4Z2dZVcIRyau0ta5wWUOQG/Rr1BBg5YvFVC48lx8/kC8IKpQA+31BIDVP5Msaj3Or68uBgZxX6WsEuPTZXe23syzIaYMIsUMQYCueV4NKjBsa3gf6GlqV8F7LawT3720g2mRJRxXPPvssPvKRj6geBqV3QOmeXdpKdXd3q2PeeecdLF26FBdccIEq5ZJi4s997nO46qqrVDsuKV68/PLLVcAKcs+CbZE2dMQ7Kpbm+AUhr1KhWqq1UeNJKeyFF15YtE1+d3/2s5817ZxoYORLg5iEj4gOxPuD1+io1fTqKpYEvHwJXX8AdIU4V6mcV7Bzby8NgenCdnl8rmRx585MWQlixuM1Zftg2i1LxvINY2XBrnx/oUSwJCQWlRJGirdLiaOZTmJUt5ULmCWlg87r6M0IgM3g3NwF/d8QhufQlD6711WpcyxaIYjXEdoHEt4Lx2c8nqvS+2sN4r2tcl5BpkkNs2UImkCELKm+JwMKr1q1SlUB3HXXXVXPgu62U9Ke47XXXkMy2T8itHSKIaVd3/nOd1R9zv333x9nnHEGguqkeSexd6sQlWIde+yx6mZcfjfld1yuqTTorDb+G1Gt5IY/oRtISKOyFuNX/bO2YFdSrdNdBVSeyyndy+/vy5jYnvQPgEVVQAdZ/VNCV1G1zZKqmP3BzKP6Z0mw8yolLK4Wmnt80fO7Shrdzykhkf9uUG3hOd+JTVAxOA9T6XO1gGk1LsBmssAjbyJoAhGypFfBH/7whxWPkeC1YcOGom3SME5CVZCDFYXTtGnTVMkVu4WmkSpY1T8l3Jl4r7QKqFdgKwmLZceVlBJK9U93iPSq/unsH0z1T/nzosKXq1TPqf5ZFPhKSv/Kg1159U95vG97vwoljs68KdU/iUaaIJc+p9PAIysQNIEIWURERM2q/inUFyJtze2xzLQkAHp00FLa3i9fopd2BTavaptFJYIl1T9l+860WbH0z719MNU/JWT1BzaPkrz8srv6p2fg8wl2nttdHbxkU0mMTsvzuMJi/lh++UVEA8WQRUREFAASRowWrv7plMRJ9U/P9n4lpXu+1UKd4R1USHRV/8w/Tqp/buvLFAXO8jDZ+Oqffp2+9Ff/lPX+sFhrSV5pVVKnzV+ljmZY/ZOo9TFkERERUQOqf8ogc2jZ6p9eVThT0l6vpxdGLK6qepb25ulZBdRvaAjV+6cTMMtLF0vbEza6+qdne7+S0r9KpYS5QJd7vG97vwoh0TmW1T+JchiyiIiIaERV/3Tk2sVGmlINtLT6p2c7vqIhHzzCouc4gN6lh071z1wpoffjGl/90yPwlQU7r2qhThu//hI9v5BYtE1NGtKpPowxI4hHi9sLsvSPhhNDFhEREdEwa9XqnxI8JQCWl9iVj/lXOpafZ3u/kuqfpdU5a6n+2R82B1/9s2q1Tdd+z/Z+JWP3+bX386v+6fWarP4ZTgxZRERERKTIzX7EkElHu6r+2TrUsCeu4R8KIa5oOV8FNBr3rCra38GLd/VP97HuoR9K2/sVtSc0LRVMG1H907O9n3t8P3fpX7XePF2PLwQ+j/EDy4eZYPXPRmDIIiIiIqJABEDpBTIud68e1T/7q4DGhr0KaKXqn8Xt8fpL9OoZ8qE0LPams/mOZrxLDwuPaUD1z6LAVsdg7tGiTlu0ohI9r2Dn91y6nUUQMWQREREREYW0+qd0suLb3q+OYFfoLdSnN08Jk071z3TR+IHe7Q7lcbWIwMS/tCFwGLKIiIiIiEJISvOcoQhavfpn2mvIB9NCMpnC/9z1BwQNQxYREREREbVc9U+RTqfxPwgevdknQEREREREFCYMWURERERERA3EkEVERERERNRADFlEREREREQNxJBFRERERETUQAxZREREREREDcSQRURERERE1EAMWURERERERCNtMOINGzbg5JNP9tx3yy234EMf+pDnvpNOOglPP/100bbPf/7zOPvss4fkPImIiIiIiAIRsubPn4+1a9cWbbv++uvx5JNPYo899qj42KOOOgrf+MY3CuuJRGLIzpOIiIiIiCgQISsajWL8+PGF9Ww2i8cffxxf/OIXoWlaxcdKqHI/loiIiIiICCM9ZJWSgLVt2zYcccQRVY/9+c9/jocffhjjxo3DIYccghNPPLFiaVY6nVaTI5VKqblt22pqJuccmn0e1Di8puHE6xo+vKbhxOsaPrym4WO7rmUrXNtaXz+QIeunP/0p9ttvP0ycOLHicQsWLMDkyZMxYcIE/PWvf8U111yD1157DZdffrnvY9asWYPVq1cX1iORCBYuXIienh5kMhk0+6L29fWp5WoleBQMvKbhxOsaPrym4cTrGj68puGTcd1/9/b2Nv1+3CmAaemQJaFHOq6o5J577sGMGTMK62+//TZ+//vfY8WKFVWfXzq5cMyaNUtVG1y6dCneeOMNTJ061fMxS5YsweLFi4veyJUrV6KzsxPxeBytkJzlXPiHIxx4TcOJ1zV8eE3Didc1fHhNwyftqmHW0dHR9PtxacbU8iHr+OOPr1rlb8qUKUXrDz74IEaNGoVDDz207tebO3eumr/++uu+ISsWi6mp9I2UD2orfFid82iFc6HG4DUNJ17X8OE1DSde1/DhNQ0XzXUdW+G61vr6TQ1ZY8aMUVM9305IyPrMZz6jqvHV68UXX1RzdoRBRERERERDJVCDEUuX7W+++SaOPPLIsn3vvPMOvvCFL+DZZ59V61Il8MYbb8QLL7yAf/zjH6qzjOXLl2OvvfbC7Nmzm3D2REREREQ0EkSC1uHFvHnzitpoubt1l04tksmkWpeSrvXr1+OOO+5QDSClk4yPf/zj+NrXvtaEMyciIiIiopEiUCHr4osv9t236667YsOGDYX1SZMmYdWqVcN0ZkRERERE1GjRaBRnnnmm6lmw1k4nWkGgqgsSEREREdHIoWma6pROAlazO72oB0MWERERERFRAzFkERERERERNRBDFhERERERUQMxZBERERERETUQQxYREREREVEDMWQRERERERGN1HGymsG2bTVPpVItcS5yHkHrwpL88ZqGE69r+PCahhOva/jwmoaT3ULX1ckETkbww5BVRTqdVvOrrrqq2adCREREREQtkhESiYTvfs2uFsNGOMuy0NPTowZBa3ZylvP4zGc+g4ceegidnZ1NPRdqDF7TcOJ1DR9e03DidQ0fXtNw6mmh6yrRSQKWnIeu+7e8YklWFfLmdXd3oxVkMhlks1nE43E1UfDxmoYTr2v48JqGE69r+PCahlOmxa5rpRIsBzu+ICIiIiIiaiCGLCIiIiIiogZiyAoQaRf29a9/Xc0pHHhNw4nXNXx4TcOJ1zV8eE3DKRbA68qOL4iIiIiIiBqIJVlEREREREQNxJBFRERERETUQAxZREREREREDcSQRURERERE1EAcjDggbrrpJvz2t7/Fiy++iGg0iscee6zsmLfeegsrVqzAhg0b0N7ejkWLFuGUU05BJMLL3Kruvvtu/OhHP8KWLVswe/ZsnH766Zg7d26zT4tq9PTTT6vr98ILL2Dz5s244oor8NGPfrSwX/oVuuGGG3D//fer0ernz5+PM888E+973/uaet7kb82aNXj00Ufx6quvqgEv582bh1NPPRUzZswoHJNKpXD11VfjF7/4BdLpNPbbbz91XceNG9fUcydv99xzj5o2btyo1mfOnIkTTzwRBx54oFrn9Qy+H/7wh1i5ciW+/OUv47TTTlPbeF2D54YbbsDq1auLtk2fPh333ntvIK8pS7ICQka5Puyww3D00Ud77jdNE//xH/+hRsS++eabcf755+PBBx9Uv7DUmuSPxFVXXaW6JL3tttuw++67q5u5rVu3NvvUqEZ9fX0qHJ9xxhme+2+55RbceeedOOuss9RNgIwQL9dY/qGg1g3OxxxzjApb1157rfrbu2zZMnWtHVdeeSV+85vf4NJLL8WqVatUwJYvSKg17bLLLuoayhcit956Kz7ykY+oG/FXXnlF7ef1DLbnnnsO9913n/pb7MbrGkwzZ87E2rVrC5MUMgT2mkoX7hQcDzzwgH3ooYeWbV+3bp29995725s3by5s+8lPfmIfcsghdjqdHuazpFqccMIJ9qWXXlpYN03TXrBggb1mzZqmnhcNzIc//GH70UcfLaxblmV/8pOftG+99dbCth07dtj777+/vXbt2iadJdVr69at6to+9dRThWu477772r/85S8Lx/ztb39TxzzzzDNNPFOqx8c+9jH7/vvv5/UMuN7eXvuoo46yf//739tf//rX7SuuuEJt53UNpuuvv97+8pe/7LkviNeUJVkh8ec//xmzZs0qKjLdf//90dvbW/i2jlqHlDj+5S9/wb777lvYpus69tlnHzzzzDNNPTdqjDfffFNVA5Vr6ujs7FTVQeXzSsEg1TxFd3e3mkvVUCndcn92pSrhpEmT+NkNAKn18cgjj6iSSakKyusZbN/97ndVtU/39RO8rsH197//HQsWLMDnPvc5/Nd//ZdqChPUa8rGOiEhN3Njx44t2uYELtlHreW9995T/9iXXjNZl7YgFHzO5660rrhcY34mg8GyLHzve99TbenkSywh107axXZ1dRUdy+va2l5++WUsWbJEteNoa2vD5ZdfrqolvfTSS7yeASVhWb6slCqgpfg5Daa5c+eq5i7SDkuqAkr7LGk/eddddwXymjJkNdE111yj2mxUIo113Q2uiYho+L4ll5oAN954Y7NPhQZJbtp+/OMfq5LJX//61+pGTtp0UDBJ6YZ8ASLtJqWDGgqHA/Od0QhpYyehSzpx++Uvf6naNAcNQ1YTHX/88TjiiCMq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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lens = Singlet()\n", "lens.draw()" ] }, { "cell_type": "markdown", "id": "eef5a20a-3d32-4460-a9b1-212127a1f4f2", "metadata": {}, "source": [ "## 2. Optimization\n", "\n", "Now we'll define the optimization problem to achieve focus on a specific plane and minimize the RMS spot size." ] }, { "cell_type": "code", "execution_count": 4, "id": "6714b791-563a-40ef-99b2-d404e315b219", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.638267Z", "iopub.status.busy": "2026-03-24T08:56:10.638038Z", "iopub.status.idle": "2026-03-24T08:56:10.641420Z", "shell.execute_reply": "2026-03-24T08:56:10.640795Z" } }, "outputs": [], "source": [ "problem = optimization.OptimizationProblem()\n", "\n", "# Add requirement for spot size\n", "for field in lens.fields.get_field_coords():\n", " input_data = {\n", " \"optic\": lens,\n", " \"Hx\": field[0],\n", " \"Hy\": field[1],\n", " \"num_rays\": 5,\n", " \"wavelength\": \"all\",\n", " \"distribution\": \"hexapolar\",\n", " \"surface_number\": 3,\n", " }\n", " problem.add_operand(\n", " operand_type=\"rms_spot_size\", target=0, weight=1, input_data=input_data\n", " )" ] }, { "cell_type": "markdown", "id": "378b4242-5686-4894-8a6f-c7cb1a8c9245", "metadata": {}, "source": [ "### Approach 1: Optimizing with \"radius\"\n", "\n", "First, let's try optimizing using the standard \"radius\" variable. We don't set limits here because we can't easily specify that radius should be outside an interval (e.g., radius ≥ 10 or radius ≤ -10)." ] }, { "cell_type": "code", "execution_count": 5, "id": "1ee03754-1b53-4cdd-9a20-c5794535d7f1", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.643119Z", "iopub.status.busy": "2026-03-24T08:56:10.642847Z", "iopub.status.idle": "2026-03-24T08:56:10.645332Z", "shell.execute_reply": "2026-03-24T08:56:10.644888Z" } }, "outputs": [], "source": [ "problem.add_variable(lens, \"radius\", surface_number=1)" ] }, { "cell_type": "markdown", "id": "004e9639-324e-408c-bb00-a08d0e251ee6", "metadata": {}, "source": [ "Let's check the initial problem configuration:" ] }, { "cell_type": "code", "execution_count": 6, "id": "12463866-f393-47b9-9148-08b5a8c563aa", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.646944Z", "iopub.status.busy": "2026-03-24T08:56:10.646715Z", "iopub.status.idle": "2026-03-24T08:56:10.672075Z", "shell.execute_reply": "2026-03-24T08:56:10.671694Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "╒════╤════════════════════════╤═══════════════════╕\n", "│ │ Merit Function Value │ Improvement (%) │\n", "╞════╪════════════════════════╪═══════════════════╡\n", "│ 0 │ 69.5755 │ 0 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═══════════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Eff. Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═══════════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 4.815 │ 4.815 │ 33.32 │\n", "│ 1 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 4.816 │ 4.816 │ 33.33 │\n", "│ 2 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 4.817 │ 4.817 │ 33.35 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═══════════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n", "│ 0 │ radius │ 1 │ -100 │ │ │\n", "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n" ] } ], "source": [ "problem.info()" ] }, { "cell_type": "markdown", "id": "88d41f54-a823-401c-981a-ea733250c840", "metadata": {}, "source": [ "Now we'll run the optimization:" ] }, { "cell_type": "code", "execution_count": 7, "id": "a27cb47b-dec8-4410-b205-39ace5477c01", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.673733Z", "iopub.status.busy": "2026-03-24T08:56:10.673464Z", "iopub.status.idle": "2026-03-24T08:56:10.876430Z", "shell.execute_reply": "2026-03-24T08:56:10.875769Z" } }, "outputs": [], "source": [ "optimizer = optimization.OptimizerGeneric(problem)\n", "res = optimizer.optimize(tol=1e-9)" ] }, { "cell_type": "markdown", "id": "42f0544a-eae9-4c58-9381-e2d7bd215833", "metadata": {}, "source": [ "Let's examine the optimization results:" ] }, { "cell_type": "code", "execution_count": 8, "id": "36adbdf7-ec60-41c1-b930-d2239e221463", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.878532Z", "iopub.status.busy": "2026-03-24T08:56:10.878284Z", "iopub.status.idle": "2026-03-24T08:56:10.969009Z", "shell.execute_reply": "2026-03-24T08:56:10.968609Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "╒════╤════════════════════════╤═══════════════════╕\n", "│ │ Merit Function Value │ Improvement (%) │\n", "╞════╪════════════════════════╪═══════════════════╡\n", "│ 0 │ 44.5212 │ 36.0102 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═══════════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Eff. Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═══════════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 3.852 │ 3.852 │ 33.33 │\n", "│ 1 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 3.852 │ 3.852 │ 33.33 │\n", "│ 2 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 3.852 │ 3.852 │ 33.33 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═══════════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n", "│ 0 │ radius │ 1 │ -141387 │ │ │\n", "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n" ] }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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bhfUZAEAAABoSZZlSSQSMQFLt9sFIQsAAAAAGoiQBQAAAAANRMgCAAAAgAYiZAEAAABAAzG6YBW+75t1PB5viWvR62i3jn8ojzINJso1eCjTYKJcg4cyDSa/hco1mwmyGaEcQlYViUTCrC+77LJmXwoAAACAFskIsVis7OOWXy2GjXOe50l/f78ZOrLZyVmv4/Of/7z86le/ku7u7qZeCxqDMg0myjV4KNNgolyDhzINpv4WKleNThqw9Dpsu3zPK2qyqtAfXk9Pj7SCZDIpqVRKotGoWdD+KNNgolyDhzINJso1eCjTYEq2WLlWqsHKYuALAAAAAGggQhYAAAAANBAhq41ov7BvfvObZo1goEyDiXINHso0mCjX4KFMgynShuXKwBcAAAAA0EDUZAEAAABAAxGyAAAAAKCBCFkAAAAA0EDMk9Umrr32Wnn88cfl1VdflXA4LI8++uiQc95991254IILZNmyZdLZ2SkHHHCAnHDCCRIKUcyt6s4775SbbrpJVq1aJdOmTZNTTjlFZs6c2ezLQo2eeeYZU36vvPKKrFy5Ui6++GLZe++9c49rl9err75a7rvvPjOR4uzZs+XUU0+VD3zgA029bpS3ePFieeSRR+T11183c7HMmjVLTjrpJNluu+1y58Tjcbn88svloYceMhNSfvzjHzflOmXKlKZeO0q7++67zbJ8+XKzP3XqVDn22GNljz32MPuUZ/u7/vrrZcGCBXLkkUfKySefbI5Rru3n6quvloULFxYc23bbbeWee+5pyzKlJqtN6ARsn/3sZ+XQQw8t+bjruvKd73zHTNZ23XXXyTnnnCMPPPCA+YVFa9I/EpdddpkZLefmm2+WHXbYwdzMrV69utmXhhpt3LjRhOMf/vCHJR+/4YYb5Pbbb5fTTjvN3ATo5IVaxvo/CrRucD7ssMNM2LriiivM394TTzzRlHXWpZdeKo899phceOGFcs0115iArV+QoDVtuummpgz1C5Ebb7xRdtllF3Mj/re//c08Tnm2t5deeknuvfde87c4H+XanqZOnSpLlizJLVrJ0LZlqqMLon3cf//9/l577TXk+NKlS/1dd93VX7lyZe7YXXfd5X/qU5/yE4nEGF8lanHMMcf4F154YW7fdV1/zpw5/uLFi5t6XRiej370o/4jjzyS2/c8z9933339G2+8MXds3bp1/u67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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "problem.info()\n", "lens.draw()" ] }, { "cell_type": "markdown", "id": "02465ebe-5427-4f35-8589-5273fb1eff1c", "metadata": {}, "source": [ "The optimization struggles to converge to a good solution. This happens because there's no continuous path from a concave to a convex surface when using the \"radius\" directly.\n", "\n", "### Approach 2: Optimizing with \"reciprocal_radius\"" ] }, { "cell_type": "code", "execution_count": 9, "id": "af939f57-77a8-4a33-8ed1-5ac068fc375d", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.970654Z", "iopub.status.busy": "2026-03-24T08:56:10.970440Z", "iopub.status.idle": "2026-03-24T08:56:10.981227Z", "shell.execute_reply": "2026-03-24T08:56:10.980621Z" } }, "outputs": [], "source": [ "lens = Singlet()\n", "\n", "problem = optimization.OptimizationProblem()\n", "\n", "# Add requirement for spot size\n", "for field in lens.fields.get_field_coords():\n", " input_data = {\n", " \"optic\": lens,\n", " \"Hx\": field[0],\n", " \"Hy\": field[1],\n", " \"num_rays\": 5,\n", " \"wavelength\": \"all\",\n", " \"distribution\": \"hexapolar\",\n", " \"surface_number\": 3,\n", " }\n", " problem.add_operand(\n", " operand_type=\"rms_spot_size\", target=0, weight=1, input_data=input_data\n", " )\n", "\n", "# Use reciprocal_radius instead of radius for optimization\n", "problem.add_variable(lens, \"reciprocal_radius\", surface_number=1)" ] }, { "cell_type": "markdown", "id": "350d2910-de1b-4091-9bc2-c3723a49ef0d", "metadata": {}, "source": [ "Let's run the optimization:" ] }, { "cell_type": "code", "execution_count": 10, "id": "13912949-1a8d-44e8-bb07-0b61a31e4b9a", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:10.983037Z", "iopub.status.busy": "2026-03-24T08:56:10.982876Z", "iopub.status.idle": "2026-03-24T08:56:11.042866Z", "shell.execute_reply": "2026-03-24T08:56:11.042257Z" } }, "outputs": [], "source": [ "optimizer = optimization.OptimizerGeneric(problem)\n", "res = optimizer.optimize(tol=1e-9)" ] }, { "cell_type": "markdown", "id": "b27c6e22-eabd-4fe0-881e-ef7e544b6dbc", "metadata": {}, "source": [ "And check the results:" ] }, { "cell_type": "code", "execution_count": 11, "id": "d634712a-58f1-4ff0-aa73-3d8657326fec", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T08:56:11.045042Z", "iopub.status.busy": "2026-03-24T08:56:11.044797Z", "iopub.status.idle": "2026-03-24T08:56:11.133716Z", "shell.execute_reply": "2026-03-24T08:56:11.133071Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "╒════╤════════════════════════╤═══════════════════╕\n", "│ │ Merit Function Value │ Improvement (%) │\n", "╞════╪════════════════════════╪═══════════════════╡\n", "│ 0 │ 0.000455027 │ 99.9993 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═══════════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Eff. Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═══════════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 0.012 │ 0.012 │ 32.21 │\n", "│ 1 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 0.012 │ 0.012 │ 31.48 │\n", "│ 2 │ rms spot size │ 0 │ │ │ 1 │ 1 │ 0.013 │ 0.013 │ 36.31 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═══════════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═══════════════════╤═══════════╤═══════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═══════════════════╪═══════════╪═══════════╪══════════════╪══════════════╡\n", "│ 0 │ reciprocal_radius │ 1 │ 0.0396763 │ │ │\n", "╘════╧═══════════════════╧═══════════╧═══════════╧══════════════╧══════════════╛\n" ] }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "problem.info()\n", "lens.draw()" ] }, { "cell_type": "markdown", "id": "16bb0170-76be-43e0-b52e-69366ae1f8f5", "metadata": {}, "source": [ "## Conclusions\n", "\n", "- When using the \"radius\" variable directly, the optimizer often struggles find solutions that require changing from concave to convex or vice versa.\n", "- The \"reciprocal_radius\" variable allows for smooth transitions between concave and convex surfaces, producing better optimization results in this specific example.\n", "- Initial system conditions are still specified with \"radius\" in the lens definition, but the optimization works on \"reciprocal_radius\" internally.\n", "- For fine tuning, after surfaces have reached the correct concavity/convexity, there is no problem in switching back to \"radius\" for the final optimization steps.\n", "- If the optimization stops prematurely due to edge cases (e.g., initial radius equal to ±infinity), simply re-run the optimization from where it stopped, using either the same algorithm or a different one." ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }