Final: Do task 4.5

This commit is contained in:
2022-04-04 20:40:20 +02:00
parent 4de898ff78
commit 87b964db3d

View File

@ -1693,7 +1693,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 20,
"metadata": { "metadata": {
"deletable": false, "deletable": false,
"nbgrader": { "nbgrader": {
@ -1711,7 +1711,31 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"def getU_TZ(tau, H):\n", "def getU_TZ(tau, H):\n",
" # TODO: Add docstring.\n", " \"\"\"\n",
" Calculates the time-propagation matrix for time-step tau using\n",
" the Trotter-Suzuki algorithm for a known shape of the hamiltonian\n",
" \n",
" Args:\n",
" tau: time-step numeric to calculate the time-propagation matrix at\n",
" H: n by n array representing the hamiltonian matrix\n",
"\n",
" Returns:\n",
" The time-propagation matrix U(tau).\n",
" \n",
" Note:\n",
" Only the size of H is taken into account, as the decomposition is\n",
" pre-defined.\n",
" \"\"\"\n",
" \n",
" # We assume that H is n by n in the form with constant hopping parameter\n",
" # t on the upper and lower diagonal, and the rest zero.\n",
" n = len(H)\n",
" assert len(H[0] == n)\n",
" \n",
" t = H[0][1]\n",
" H_tb = (np.eye(n, n, -1) + np.eye(n, n, 1))*t\n",
" assert np.allclose(H, H_tb)\n",
" \n",
" \n", " \n",
" # First we calculate the exponent of the block.\n", " # First we calculate the exponent of the block.\n",
" exp_block = np.array([\n", " exp_block = np.array([\n",
@ -1721,23 +1745,59 @@
" \n", " \n",
" # Now we use the block to calculate the exponent of matrices\n", " # Now we use the block to calculate the exponent of matrices\n",
" # H_1 and H_2.\n", " # H_1 and H_2.\n",
" n = len(H)\n", " \n",
" exp_H_1 = np.block([\n", " # If n is even.\n",
" [1, 0],\n", " if n % 2 == 0:\n",
" [0, np.kron(np.eye(n//2, dtype=int), exp_block)]\n", " num = n//2\n",
" ])\n", " exp_H_1 = np.kron(np.eye(num, dtype=int), exp_block)\n",
" \n",
" num = n//2 - 1\n",
" exp_H_2 = np.block([\n", " exp_H_2 = np.block([\n",
" [1, 0],\n", " [1, np.zeros((1, num*2)), 0 ],\n",
" [0, np.kron(np.eye(n//2, dtype=int), exp_block)]\n", " [np.zeros((num*2, 1)), np.kron(np.eye(num, dtype=int), exp_block), np.zeros((num*2, 1))],\n",
" [0, np.zeros((1, num*2)), 1 ]\n",
" ])\n", " ])\n",
" \n", " \n",
" # YOUR CODE HERE\n", " # If n is odd.\n",
" raise NotImplementedError()\n", " else:\n",
" num = n//2\n",
" exp_H_1 = np.block([\n",
" [np.kron(np.eye(num, dtype=int), exp_block), np.zeros((num*2, 1))],\n",
" [np.zeros((1, num*2)), 1 ]\n",
" ])\n",
"\n",
" num = n//2\n",
" exp_H_2 = np.block([\n",
" [1, np.zeros((1, num*2)) ],\n",
" [np.zeros((num*2, 1)), np.kron(np.eye(num, dtype=int), exp_block)]\n",
" ])\n",
"\n",
" U_TZ = exp_H_1@exp_H_2\n",
" return U_TZ\n",
"\n", "\n",
"# Yann mentions again that this is slightly different wrong what\n", "# Yann mentions again that this is slightly different wrong what\n",
"# is in the slides/lecture." "# is in the slides/lecture."
] ]
}, },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"n = 10\n",
"sigma = .25\n",
"tau = 1.5\n",
"H = TBHamiltonian(n, sigma)\n",
"U = getU_TZ(tau, H)\n",
"\n",
"exp_block = np.array([\n",
" [ np.cos(tau*t), -1j*np.sin(tau*t)],\n",
" [-1j*np.sin(tau*t), np.cos(tau*t)]\n",
" ])\n",
"exp_block.shape"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": { "metadata": {