Skip to content

Instantly share code, notes, and snippets.

@goerz
Last active December 16, 2021 03:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save goerz/720669c9fffe2a8a7f4263b74d625140 to your computer and use it in GitHub Desktop.
Save goerz/720669c9fffe2a8a7f4263b74d625140 to your computer and use it in GitHub Desktop.
Analytical solutions for the dynamics of a two-level system (Rabi cycling)
.ipynb_checkpoints
Display the source blob
Display the rendered blob
Raw
{
"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": [
"Ĥ = Matrix([\n",
" [ 0 , -Ω0/2],\n",
" [-Ω0/2, Δ ]\n",
"])\n",
"Ĥ"
]
},
{
"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) + 𝕚 * (Ĥ[0,0] * g(t) + Ĥ[0,1] * e(t)),\n",
" e(t).diff(t) + 𝕚 * (Ĥ[1,0]* g(t) + Ĥ[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
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment