Instantly share code, notes, and snippets.

Last active December 16, 2021 03:10
Analytical solutions for the dynamics of a two-level system (Rabi cycling)

We solve the Schrödinger equation for the dynamics of a two-level system analytically.

See also: Analytical Ramsey Scheme for a single TLS, which includes the solution of the TLS dynamics for arbitrary initial conditions.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 .ipynb_checkpoints
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 { "cells": [ { "cell_type": "markdown", "id": "e8b420fc", "metadata": {}, "source": [ "# Rabi Cycling in the Two-Level-System — From Scratch " ] }, { "cell_type": "markdown", "id": "6d870f6f", "metadata": {}, "source": [ "This notebook uses sympy to symbolically solve the Schrödinger equation for a two-level system, resulting in the exact analytic expressions for the complex amplitudes and the population dynamics of Rabi cycling.\n", "\n", "Having this written out in a computer algebra system allows to easily adapt the calculation to variations in the form of the two-level-system Hamiltonian, or different boundary conditions." ] }, { "cell_type": "code", "execution_count": 1, "id": "099e6f02", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:09.576682Z", "start_time": "2021-12-15T20:45:09.266346Z" } }, "outputs": [], "source": [ "from sympy import Function, symbols, sqrt, Eq, Abs, exp, cos, sin, Matrix, dsolve, solve" ] }, { "cell_type": "code", "execution_count": 2, "id": "392d26c5", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:09.579927Z", "start_time": "2021-12-15T20:45:09.577819Z" } }, "outputs": [], "source": [ "from sympy import I as 𝕚" ] }, { "cell_type": "code", "execution_count": 3, "id": "22151c90", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:09.583750Z", "start_time": "2021-12-15T20:45:09.580729Z" } }, "outputs": [], "source": [ "g = Function('g')\n", "e = Function('e')\n", "t = symbols('t', positive=True)\n", "Δ = symbols('Delta', real=True)\n", "Ω0 = symbols('Ω_0', real=True)\n", "Ω = symbols('Omega', real=True)" ] }, { "cell_type": "code", "execution_count": 4, "id": "b7ac0d90", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:09.716024Z", "start_time": "2021-12-15T20:45:09.585275Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}0 & - \\frac{Ω_{0}}{2}\\\\- \\frac{Ω_{0}}{2} & \\Delta\\end{matrix}\\right]$" ], "text/plain": [ "Matrix([\n", "[ 0, -Ω_0/2],\n", "[-Ω_0/2, Delta]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ĥ = Matrix([\n", " [ 0 , -Ω0/2],\n", " [-Ω0/2, Δ ]\n", "])\n", "Ĥ" ] }, { "cell_type": "code", "execution_count": 5, "id": "4d51a2cf", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:09.721307Z", "start_time": "2021-12-15T20:45:09.717074Z" } }, "outputs": [], "source": [ "TDSE_system = [\n", " g(t).diff(t) + 𝕚 * (Ĥ[0,0] * g(t) + Ĥ[0,1] * e(t)),\n", " e(t).diff(t) + 𝕚 * (Ĥ[1,0]* g(t) + Ĥ[1,1] * e(t)),\n", "]" ] }, { "cell_type": "code", "execution_count": 6, "id": "74fa6ba2", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.060209Z", "start_time": "2021-12-15T20:45:09.722256Z" } }, "outputs": [], "source": [ "sols_gen = dsolve(TDSE_system, [g(t), e(t)])" ] }, { "cell_type": "markdown", "id": "a501c1d6", "metadata": {}, "source": [ "Note that dsolve allows to specify boundary conditions, but the resulting expressions are hard to simply. We do better by solving for the integration constants \"manually\" later on." ] }, { "cell_type": "code", "execution_count": 7, "id": "2718f04e", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.063009Z", "start_time": "2021-12-15T20:45:10.061017Z" } }, "outputs": [], "source": [ "effective_rabi_freq = {\n", " Ω: sqrt(Δ**2 + Ω0**2)\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "id": "75ee2c2a", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.068994Z", "start_time": "2021-12-15T20:45:10.064272Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\Omega = \\sqrt{\\Delta^{2} + Ω_{0}^{2}}$" ], "text/plain": [ "Eq(Omega, sqrt(Delta**2 + Ω_0**2))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Eq(Ω, effective_rabi_freq[Ω])" ] }, { "cell_type": "code", "execution_count": 9, "id": "79b723c4", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.071767Z", "start_time": "2021-12-15T20:45:10.069861Z" } }, "outputs": [], "source": [ "find_Ω = {\n", " effective_rabi_freq[Ω]: Ω\n", "}" ] }, { "cell_type": "code", "execution_count": 10, "id": "b05f056e", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.098172Z", "start_time": "2021-12-15T20:45:10.074005Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle g{\\left(t \\right)} = - \\frac{C_{1} Ω_{0} e^{- \\frac{t \\left(i \\Delta - i \\Omega\\right)}{2}}}{\\Delta - \\Omega} - \\frac{C_{2} Ω_{0} e^{- \\frac{t \\left(i \\Delta + i \\Omega\\right)}{2}}}{\\Delta + \\Omega}$" ], "text/plain": [ "Eq(g(t), -C1*Ω_0*exp(-t*(I*Delta - I*Omega)/2)/(Delta - Omega) - C2*Ω_0*exp(-t*(I*Delta + I*Omega)/2)/(Delta + Omega))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sols_gen[0].subs(find_Ω)" ] }, { "cell_type": "code", "execution_count": 11, "id": "e8e0977b", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.129875Z", "start_time": "2021-12-15T20:45:10.099175Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle e{\\left(t \\right)} = C_{1} e^{- \\frac{i \\Delta t}{2}} e^{\\frac{i \\Omega t}{2}} + C_{2} e^{- \\frac{i \\Delta t}{2}} e^{- \\frac{i \\Omega t}{2}}$" ], "text/plain": [ "Eq(e(t), C1*exp(-I*Delta*t/2)*exp(I*Omega*t/2) + C2*exp(-I*Delta*t/2)*exp(-I*Omega*t/2))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sols_gen[1].subs(find_Ω).expand()" ] }, { "cell_type": "code", "execution_count": 12, "id": "394f4efd", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.133217Z", "start_time": "2021-12-15T20:45:10.130725Z" } }, "outputs": [], "source": [ "boundary_conditions = {\n", " t: 0,\n", " g(t): 1,\n", " e(t) : 0,\n", "}" ] }, { "cell_type": "code", "execution_count": 13, "id": "23be389b", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.136309Z", "start_time": "2021-12-15T20:45:10.134102Z" } }, "outputs": [], "source": [ "find_Ω0sq = {\n", " Ω**2 - Δ**2: Ω0**2\n", "}" ] }, { "cell_type": "code", "execution_count": 14, "id": "be349bd8", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.138733Z", "start_time": "2021-12-15T20:45:10.137171Z" } }, "outputs": [], "source": [ "C1, C2 = symbols(\"C1, C2\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "7d321d1e", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.176835Z", "start_time": "2021-12-15T20:45:10.139910Z" } }, "outputs": [], "source": [ "_integration_constants = solve(\n", " [sol.subs(find_Ω).subs(boundary_conditions) for sol in sols_gen],\n", " [C1, C2]\n", ")\n", "integration_constants = {\n", " k: v.subs(find_Ω0sq)\n", " for (k, v) in _integration_constants.items()\n", "}" ] }, { "cell_type": "code", "execution_count": 16, "id": "894eeee2", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.182662Z", "start_time": "2021-12-15T20:45:10.177878Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle C_{1} = \\frac{Ω_{0}}{2 \\Omega}$" ], "text/plain": [ "Eq(C1, Ω_0/(2*Omega))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Eq(C1, integration_constants[C1])" ] }, { "cell_type": "code", "execution_count": 17, "id": "851352b3", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.188218Z", "start_time": "2021-12-15T20:45:10.183516Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle C_{2} = - \\frac{Ω_{0}}{2 \\Omega}$" ], "text/plain": [ "Eq(C2, -Ω_0/(2*Omega))" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Eq(C2, integration_constants[C2])" ] }, { "cell_type": "code", "execution_count": 18, "id": "339ee928", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.191145Z", "start_time": "2021-12-15T20:45:10.189072Z" } }, "outputs": [], "source": [ "global_phase = exp(-𝕚 * Δ * t / 2)" ] }, { "cell_type": "code", "execution_count": 19, "id": "21dc5c9c", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.194138Z", "start_time": "2021-12-15T20:45:10.191962Z" } }, "outputs": [], "source": [ "def remove_global_phase(eq, global_phase=global_phase):\n", " return Eq(eq.lhs, eq.rhs * global_phase.conjugate())\n", "\n", "def restore_global_phase(eq, global_phase=global_phase):\n", " return Eq(eq.lhs, eq.rhs * global_phase)" ] }, { "cell_type": "code", "execution_count": 20, "id": "43fb88d4", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.196779Z", "start_time": "2021-12-15T20:45:10.195038Z" } }, "outputs": [], "source": [ "def collect(eq, term):\n", " return Eq(eq.lhs, eq.rhs.collect(term))" ] }, { "cell_type": "code", "execution_count": 21, "id": "78cc5307", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.199875Z", "start_time": "2021-12-15T20:45:10.197590Z" } }, "outputs": [], "source": [ "def simplify_sol_g(sol_g):\n", " rhs = (\n", " sol_g\n", " .rhs\n", " .rewrite(sin)\n", " .expand()\n", " .collect(𝕚)\n", " .subs(effective_rabi_freq)\n", " .simplify()\n", " .subs(find_Ω)\n", " )\n", " return Eq(sol_g.lhs, rhs)" ] }, { "cell_type": "code", "execution_count": 22, "id": "3a034ee0", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.602923Z", "start_time": "2021-12-15T20:45:10.200800Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle g{\\left(t \\right)} = \\left(\\frac{i \\Delta \\sin{\\left(\\frac{\\Omega t}{2} \\right)}}{\\Omega} + \\cos{\\left(\\frac{\\Omega t}{2} \\right)}\\right) e^{- \\frac{i \\Delta t}{2}}$" ], "text/plain": [ "Eq(g(t), (I*Delta*sin(Omega*t/2)/Omega + cos(Omega*t/2))*exp(-I*Delta*t/2))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol_g = restore_global_phase(\n", " simplify_sol_g(\n", " collect(\n", " remove_global_phase(\n", " sols_gen[0]\n", " .subs(find_Ω)\n", " .subs(integration_constants)\n", " ).expand(),\n", " exp(𝕚 * Ω * t / 2 )\n", " )\n", " )\n", ")\n", "sol_g" ] }, { "cell_type": "code", "execution_count": 23, "id": "143d31e9", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.660312Z", "start_time": "2021-12-15T20:45:10.603849Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle e{\\left(t \\right)} = \\frac{i Ω_{0} e^{- \\frac{i \\Delta t}{2}} \\sin{\\left(\\frac{\\Omega t}{2} \\right)}}{\\Omega}$" ], "text/plain": [ "Eq(e(t), I*Ω_0*exp(-I*Delta*t/2)*sin(Omega*t/2)/Omega)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol_e = restore_global_phase(\n", " remove_global_phase(\n", " sols_gen[1].subs(find_Ω).subs(integration_constants)\n", " ).expand().rewrite(sin).expand()\n", ")\n", "sol_e" ] }, { "cell_type": "code", "execution_count": 24, "id": "5480adc7", "metadata": { "ExecuteTime": { "end_time": "2021-12-15T20:45:10.670174Z", "start_time": "2021-12-15T20:45:10.661098Z" } }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\left|{e{\\left(t \\right)}}\\right|^{2} = \\frac{Ω_{0}^{2} \\sin^{2}{\\left(\\frac{\\Omega t}{2} \\right)}}{\\Omega^{2}}$" ], "text/plain": [ "Eq(Abs(e(t))**2, Ω_0**2*sin(Omega*t/2)**2/Omega**2)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_e = (sol_e.rhs * sol_e.rhs.conjugate())\n", "Eq(Abs(e(t))**2, pop_e)" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
to join this conversation on GitHub. Already have an account? Sign in to comment