Compare commits

..

No commits in common. "main" and "coryab/code" have entirely different histories.

37 changed files with 891 additions and 541 deletions

1
.gitattributes vendored
View File

@ -1 +0,0 @@
. !text !filter !merge !diff

2
.gitignore vendored
View File

@ -50,5 +50,3 @@ test
# Score-p
scorep*
data/animation.txt

BIN
args/args.txt (Stored with Git LFS)

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
data/probability_deviation_no_slits.txt (Stored with Git LFS)

Binary file not shown.

BIN
data/probability_deviation_slits.txt (Stored with Git LFS)

Binary file not shown.

BIN
data/screen/double_slit.txt (Stored with Git LFS)

File diff suppressed because one or more lines are too long

BIN
data/screen/single_slit.txt (Stored with Git LFS)

File diff suppressed because one or more lines are too long

BIN
data/screen/triple_slit.txt (Stored with Git LFS)

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -187,29 +187,6 @@
pages = {3021}
}
@article{harris:2020:numpy,
title = {Array programming with {NumPy}},
author = {Charles R. Harris and K. Jarrod Millman and St{\'{e}}fan J.
van der Walt and Ralf Gommers and Pauli Virtanen and David
Cournapeau and Eric Wieser and Julian Taylor and Sebastian
Berg and Nathaniel J. Smith and Robert Kern and Matti Picus
and Stephan Hoyer and Marten H. van Kerkwijk and Matthew
Brett and Allan Haldane and Jaime Fern{\'{a}}ndez del
R{\'{i}}o and Mark Wiebe and Pearu Peterson and Pierre
G{\'{e}}rard-Marchant and Kevin Sheppard and Tyler Reddy and
Warren Weckesser and Hameer Abbasi and Christoph Gohlke and
Travis E. Oliphant},
year = {2020},
month = sep,
journal = {Nature},
volume = {585},
number = {7825},
pages = {357--362},
doi = {10.1038/s41586-020-2649-2},
publisher = {Springer Science and Business Media {LLC}},
url = {https://doi.org/10.1038/s41586-020-2649-2}
}
# C++ libraries
@misc{openmp:2018,
author = {OpenMP},

View File

@ -82,8 +82,8 @@
\begin{document}
\title{Simulating the Schrödinger wave equation using the Crank-Nicolson scheme in 2+1 dimensions} % self-explanatory
\author{Cory Alexander Balaton \& Janita Ovidie Sandtrøen Willumsen \\ \faGithub \, \url{https://gitea.balaton.dev/FYS3150/Project-5}} % self-explanatory
\title{Simulating the Schrödinger wave equation using the Crank-Nicolson method in 2+1 dimensions} % self-explanatory
\author{Cory Alexander Balaton \& Janita Ovidie Sandtrøen Willumsen \\ \faGithub \, \url{https://github.uio.no/FYS3150-G2-2023/Project-4}} % self-explanatory
\date{\today} % self-explanatory
\noaffiliation % ignore this, but keep it.
@ -102,7 +102,7 @@
\subfile{sections/results}
% Conclusion
\subfile{sections/conclusion}
% \subfile{sections/conclusion}
% Notes
% \subfile{draft}
@ -122,14 +122,12 @@
\end{document}
% Abstract: OK!
% Introduction: Hyugen, Heisenberg
% Methods: OK!
% Results: OK
% Conclusion: OK!
% Appendices:
% Methods
% P1: Theory, imag i = i, index i, j = \hat{i}, \hat{j}
% P2:
%
% Results
% P7: OK!
% P8: OK!
% P9: OK
% P7:
% P8:
% P9:

View File

@ -3,18 +3,16 @@
\begin{document}
\begin{abstract}
We have simulated the two-dimensional time-dependent Schrödinger equation, to study
variations of the double-slit experiment. To derive a discretized equation
we applied the Crank-Nicolson scheme in 2+1 dimensions. In addition, we have used
Dirichlet boundary conditions to express the equation in matrix form, and solve
it using the sparse matrix solver \verb|superlu|. Our implementation, and choice
of solver method, resulted in a deviation from conserved total probability on the
scale $10^{-14}$, for both the single and double slit setup. To illustrate the time
evolution of the probability function, we created colormap plots for time steps
$t=\{0, 0.001, 0.002\}$. We also included separate plots for each time step of
Re$(u_{\ivec, \jvec})$ and Im$(u_{\ivec, \jvec})$. In addition, we determined the
normalized particle detection probability $p(y \ | \ x=0.8, t=0.002)$, for single-,
double- and triple-slit.
variations of the double-slit experiment. To solve the partial differential equations
we have applied the Crank-Nicolson scheme in 2+1 dimensions, to derive a discretized
equation. In addition, we have used Dirichlet boundary conditions to express the
equation in matrix form and solve it using the sparse matrix solver \verb|superlu|.
Our implementation, and choice of solver method, resulted in conserved total
probability $\sum_{\ivec, \jvec} p_{\ivec, \jvec}^{n}=1$ for both the single and
double slit setup. To illustrate the time evolution of the probability function,
we created colormap plots at time steps $t = [0, 0.001, 0.002]$. We also included
separate plots for each time step of Re$(u_{\ivec, \jvec})$ and Im$(u_{\ivec, \jvec})$.
In addition, we determined the normalized particle detection probability $p(y \ | \ x=0.8, t=0.002)$,
for single-, double- and triple-slit.
\end{abstract}
\end{document}
% $| \sum_{\ivec, \jvec} p_{\ivec, \jvec}^{n} - 1 | \approx $

View File

@ -3,8 +3,7 @@
\begin{document}
\appendix
\section{The Crank-Nicholson method}\label{ap:crank_nicolson}
The Crank-Nicolson (CN) approach consider both the forward difference, an explicit
scheme,
The Crank-Nicolson (CN) approach consider both the forward difference, an explicit scheme,
\begin{equation*}
\frac{u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n}}{\Delta t} = F_{\ivec, \jvec}^{n} \ ,
\end{equation*}
@ -21,17 +20,15 @@ The parameter $\theta$ is introduced for a general approach, however, for CN $\t
\frac{u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n}}{\Delta t} &= \frac{1}{2} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] \\
\end{align*}
We need the first derivative in respect to both time and position, as well as the
second derivative in respect to position. Taylor expanding will result in a discretized
version.
We need the first derivative in respect to both time and position, as well as the second derivative in respect to position. Taylor expanding will result in a discretized version, assume this is known...
The Schrödinger equation contains $i$ on the left hand side, we rewrite it as
Schrödinger contain $i$ at the lhs, factor it as
\begin{align*}
\frac{u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n}}{\Delta t} &= \frac{1}{2i} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] \\
&= -\frac{i}{2} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] \ ,
&= -\frac{i}{2} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] & \text{, where $\frac{1}{i} = -i$}
\end{align*}
where $1/i = -i$. Using Equation \eqref{eq:schrodinger_dimensionless}, which is
found in Section \ref{ssec:schrodinger}, we get
Using Equation \eqref{eq:schrodinger_dimensionless}, we get
\begin{align*}
u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n} & -\frac{i \Delta t}{2} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] \\
&= -\frac{i \Delta t}{2} \bigg[ - \frac{u_{\ivec+1, \jvec}^{n+1} - 2u_{\ivec, \jvec}^{n+1} + u_{\ivec-1, \jvec}^{n+1}}{2 \Delta x^{2}} \\
@ -47,7 +44,8 @@ the left hand side, and the terms containing $n$ time step on the right hand sid
&= u_{\ivec, \jvec}^{n} + \frac{i \Delta t}{2 \Delta x^{2}} \big[ u_{\ivec+1, \jvec}^{n} - 2u_{\ivec, \jvec}^{n} + u_{\ivec-1, \jvec}^{n} \big] \\
& \quad + \frac{i \Delta t}{2 \Delta y^{2}} \big[ u_{\ivec, \jvec+1}^{n} - 2u_{\ivec, \jvec}^{n} + u_{\ivec, \jvec-1}^{n} \big] - \frac{i \Delta t}{2} v_{\ivec, \jvec} u_{\ivec, \jvec}^{n}
\end{align*}
Since we use an equal step size $h$ in both $x$ and $y$ direction, we can use
In addition, since we will use an equal step size $h$ in both $x$ and $y$ direction,
we can use
\begin{align*}
\frac{i \Delta t}{2 \Delta h^{2}} = \frac{i \Delta t}{2 \Delta x^{2}} = \frac{i \Delta t}{2 \Delta y^{2}} \ ,
\end{align*}
@ -55,7 +53,7 @@ and define
\begin{align*}
r \equiv \frac{i \Delta t}{2 \Delta h^{2}}
\end{align*}
Now, the discretized Schrödinger equation can be rewritten as
Now, the discretized Schrödinger equation can be written as
\begin{align*}
& u_{\ivec, \jvec}^{n+1} - r \big[ u_{\ivec+1, \jvec}^{n+1} - 2u_{\ivec, \jvec}^{n+1} + u_{\ivec-1, \jvec}^{n+1} \big] \\
& - r \big[ u_{\ivec, \jvec+1}^{n+1} - 2u_{\ivec, \jvec}^{n+1} + u_{\ivec, \jvec-1}^{n+1} \big] + \frac{i \Delta t}{2} v_{\ivec, \jvec} u_{\ivec, \jvec}^{n+1} \\
@ -65,7 +63,7 @@ Now, the discretized Schrödinger equation can be rewritten as
\section{Matrix structure}\label{ap:matrix_structure}
For a $u$ vector of length $(M-2) = 3$, the matrices $A$ and $B$ have size
For $u$ vector of length $(M-2) = 3$, the matrices $A$ and $B$ have size
$(M-2)^{2} \times (M-2)^{2} = 9 \times 9$ given by
\begin{align*}
A =
@ -96,65 +94,4 @@ $(M-2)^{2} \times (M-2)^{2} = 9 \times 9$ given by
0 & 0 & 0 & 0 & 0 & r & 0 & r & b_{8} \\
\end{bmatrix}
\end{align*}
\section{Figures}\label{ap:figures}
We created colormap plots of the real and imaginary part of $u_{\ivec, \jvec}$,
in Figure \ref{fig:colormap_real_imag}.
\begin{figure*}
\centering
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_0_real.pdf}
\caption{Re$(u_{\ivec, \jvec})$ at time $t=0$.}
\label{fig:colormap_0_real}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_1_real.pdf}
\caption{Re$(u_{\ivec, \jvec})$ at time $t=0.001$.}
\label{fig:colormap_1_real}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_2_real.pdf}
\caption{Re$(u_{\ivec, \jvec})$ at time $t=0.002$.}
\label{fig:colormap_2_real}
\end{subfigure}
\newline
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_0_imag.pdf}
\caption{Im$(u_{\ivec, \jvec})$ at time $t=0$.}
\label{fig:colormap_0_imag}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_1_imag.pdf}
\caption{Im$(u_{\ivec, \jvec})$ at time $t=0.001$.}
\label{fig:colormap_1_imag}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{images/color_map_2_imag.pdf}
\caption{Im$(u_{\ivec, \jvec})$ at time $t=0.002$.}
\label{fig:colormap_2_imag}
\end{subfigure}
\caption{The time evolution of Re($u_{\ivec, \jvec}$) and Im($u_{\ivec, \jvec}$),
for time steps $t=[0, 0.001, 0.002]$.}
\label{fig:colormap_real_imag}
\end{figure*}
% \begin{figure*}
% \centering
% \includegraphics[width=0.9\textwidth]{images/color_map_all.pdf}
% \caption{The time evolution of the probability function $p_{\ivec, \jvec}^{n}$ (top row),
% Re($u_{\ivec, \jvec}^{n}$) (middle row), and Im($u_{\ivec, \jvec}^{n}$) (bottom row).
% Time step $t=0$ in the left column, $t=0.001$ in the middle column, and $t=0.002$
% in the right column.}
% \label{fig:colormap_all}
% \end{figure*}
\end{document}

View File

@ -2,23 +2,24 @@
\begin{document}
\section{Conclusion}\label{sec:conclusion}
We simulated the two-dimensional time-dependent Schrödinger equation, and studied
% Rewrite this section to differ from the abstract
We have simulated the two-dimensional time-dependent Schrödinger equation, to study
variations of the double-slit experiment. To solve the partial differential equations
we applied the Crank-Nicolson scheme in 2+1 dimensions, and derived a discretized
equation. We used Dirichlet boundary conditions to simplify the equation,
expressed the equation in matrix form and solved it using the sparse matrix solver
\verb|superlu|. The total probability $\sum_{\ivec, \jvec} p_{\ivec, \jvec}^{n}$
deviated from $1.0$ by a factor of $10^{-14}$ for both the single and double slit
setup. % Add something about computational accuracy?
we have applied the Crank-Nicolson scheme in 2+1 dimensions, and derived a discretized
equation. In addition, we have used Dirichlet boundary conditions to express the
equation in matrix form and solve it using the sparse matrix solver \verb|superlu|.
Our implementation, and choice of solver method, resulted in conserved total
probability $\sum_{\ivec, \jvec} p_{\ivec, \jvec}^{n}=1$ for both the single and
double slit setup.
We illustrated the time evolution of the probability function $p_{\ivec, \jvec}^{n} = u_{\ivec, \jvec}^{n*} u_{\ivec, \jvec}^{n}$,
using colormap plots for time steps $t = \{0, 0.001, 0.002\}$. In addition, we included
separate plots for each time step of Re$(u_{\ivec, \jvec})$ and Im$(u_{\ivec, \jvec})$,
to show the components of the complex values. This resulted in visible diffraction
patterns for the double-slit experiment.
To illustrate the time evolution of the probability function $p_{\ivec, \jvec}^{n} = u_{\ivec, \jvec}^{n*} u_{\ivec, \jvec}^{n}$,
we created colormap plots at time steps $t = [0, 0.001, 0.002]$. Since we are working
with complex numbers, we included separate plots for each time step of Re$(u_{\ivec, \jvec})$
and Im$(u_{\ivec, \jvec})$.
% We observed something...
In addition, we determined the normalized particle detection probability $p(y \ | \ x=0.8, t=0.002)$,
for single-, double- and triple-slit.
% We observed something here as well...
In addition, we studied the normalized particle detection probability $p(y \ | \ x=0.8, t=0.002)$,
for single-, double- and triple-slit setups. We found that increasing the number of slits
in the barrier, resulted in an increased number of areas of both high and low probability
for particle detection. It also increased the variance of particle detection probability.
\end{document}

View File

@ -2,70 +2,42 @@
\begin{document}
\section{Introduction}\label{sec:introduction}
% Light: wave particle
The nature of light has long been a subject of interest and discussion. In classical
mechanics, we study the kinematics and dynamics of physical objects, while ignoring
their intrinsic properties for simplicity. Elementary particles, such as photons
and electrons, do not abide by the laws of classical mechanics. A solution was
proposed by Max Planck with the radiation law, which he later derived using Boltzmann's
statistical interpretation of the second law of thermodynamics. Planck's findings
gave rise to the quantum hypothesis, and later Einstein's wave-particle duality \cite{britannica:1998:planck}.
The particle theory was the leading theory in the beginning of the 1800s, when
Thomas Young demonstrated the interference of light, through his double-slit experiment,
while postulating light as waves \cite{young:1804:double_slit}. The study of
interference of light, and Gustav R. Kirchhoff's study of ideal blackbodies,
showed that light exhibits both wavelike and particle-like characteristics. The
wave-particle duality was later proposed to apply to particles by Louis de Broglie,
which inspired Erwin Schrödinger, who proposed a wave function to describe the quantum
state of particles, resulting in the wave equation.
We will simulate the time-dependent Schrödinger equation in two dimensions, to
study the light wave interference in the double-slit experiment. In addition, we
will include variations of barriers with single-slit and triple-slits. To solve the equation,
we will apply the Crank-Nicolson method in 2+1 dimensions.
In Section \ref{sec:methods}, we will present the theoretical background for
this experiment, as well as the methods and tools used in the implementation.
Continuing with Section \ref{sec:results}, we will present our results and
discuss our findings. Lastly, we will conclude our findings in Section \ref{sec:conclusion}.
\end{document}
The nature of light has long been a subject of interest and discussion. %
% Important part of human behavior is observing and understanding our surroundings.
% Many big discoveries have been made through observations, verified by mathematical
% explanations. Classical physics is based on calculation predicting something we
% verify by observation etc. But what happens when we move down to the microscopic
% scale, can we still predict the position of a microscopic ball, also called an atom?
% In classical mechanics, we study the kinematics and dynamics of physical objects,
% while ignoring their intrinsic properties for simplicity. Newton's second law can be
% applied to an object to describe its trajectory. It allows us to describe the
In classical mechanics, we study the kinematics and dynamics of physical objects,
while ignoring their intrinsic properties for simplicity. Newton's second law can be
applied to an object to describe its trajectory. % It allows us to describe the
% forces acting on an object as well as the motion of the object. We can describe
% a planets orbital movement \cite{britannica:2023:kepler}, calculate the ... necessary
% to launch satellites into orbit, or simply figure out where a ball is going to land
% when you throw it... However, when want to study an object at a microscopic level,
% e.g. a single atom, classical mechanics falls short.
% Elementary particles such as electrons, does not abide by the laws of classical mechanics.
% For several years, scientists did not agree on whether light was a particle or a
% wave. Through the study of interference of light, and radiation of ideal blackbodies,
% it has been shown that light has both wavelike and particle-like characteristics.
% This is known as the wave-particle duality, and was showed by Albert Einstein in
% 1905.
Elementary particles such as electrons, does not abide by the laws of classical mechanics.
For several years, scientists did not agree on whether light was a particle or a
wave. Through the study of interference of light, and radiation of ideal blackbodies,
it has been shown that light has both wavelike and particle-like characteristics.
This is known as the wave-particle duality, and was showed by Albert Einstein in
1905. %
% Thomas Young studied the interference of light, and found that light to showed
% wavelike characteristics \cite{young:1804:double_slit}. This did not agree with
% Newtons particle-theory
% Erwin Schrödinger wanted to find a mathematical description of the wave characteristics
% of matter, supporting the wave-particle idea. He postulated a wave function which varies
% with position, where the function squared can be interpreted as the probability
% of finding an electron at a given position. This resulted in the Schrödinger equation,
% a wave eqution of the energy levels for a hydrogen atom. It also shows how a quantum
% state evolves with time \cite[p. 81]{wu:2023:quantum}.
Erwin Schrödinger wanted to find a mathematical description of the wave characteristics
of matter, supporting the wave-particle idea. He postulated a wave function which varies
with position, where the function squared can be interpreted as the probability
of finding an electron at a given position. This resulted in the Schrödinger equation,
a wave eqution of the energy levels for a hydrogen atom. It also shows how a quantum
state evolves with time \cite[p. 81]{wu:2023:quantum}.
% We will simulate the time-dependent Schrödinger equation in two dimensions, to
% study the light wave interference in the double-slit experiment. In addition, we
% will include variations of walls such as single- and triple-slit. To solve the equation,
% we will apply the Crank-Nicolson method in 2+1 dimensions.
We will simulate the time-dependent Schrödinger equation in two dimensions, to
study the light wave interference in the double-slit experiment. In addition, we
will include variations of walls such as single- and triple-slit. To solve the equation,
we will apply the Crank-Nicolson method in 2+1 dimensions.
% However, according to the Heisenberg uncertainty principle, we can't find dx and/or
% dp = 0. dx = sqrt{Var(x)} "spread in position", dp = hat{\Psi}(p) = sqrt{Var(p)}
@ -83,7 +55,11 @@ discuss our findings. Lastly, we will conclude our findings in Section \ref{sec:
% Instead of finding the path of a ball, we find all the possible paths a ball can take.
% The world is not one-dimensional, and modelling it require partial diff eqs
In Section \ref{sec:methods}, we will present the theoretical background for
this experiment, as well as the algorithms and tools used in the implementation.
Continuing with Section \ref{sec:results}, we will present our results and
discuss our findings. Lastly, we will conclude our findings in Section \ref{sec:conclusion}.
\end{document}
% crank-nicolson method!
% wave equation

View File

@ -3,81 +3,70 @@
\begin{document}
\section{Methods}\label{sec:methods} %
\subsection{The Schrödinger equation}\label{ssec:schrodinger} %
Erwin Schrödinger wanted to find a mathematical description of the wave characteristics
of matter, which supported the wave-particle idea. He postulated a wave function which varies
with position, where the function squared can be interpreted as the probability
of finding an electron at a given position. This resulted in the Schrödinger equation,
a wave eqution of the energy levels for a hydrogen atom. It also shows how a quantum
state evolves with time \cite[p. 81]{wu:2023:quantum}. The Schrödinger equation
has a general form
% Add something that takes Planck to Schrödinger
% In classical mechanics, we have Newton laws and conservation of energy. In quantum
% mechanics, we have Schrödinger equation.
The Schrödinger equation has a general form
\begin{align}
i \hbar \frac{\partial}{\partial t} | \Psi \rangle &= \hat{H} | \Psi \rangle \ ,
\label{eq:schrodinger_general}
\end{align}
where $i$ is the imaginary unit, and $\hbar$ is the reduced Planck's constant. $\hat{H}$ is
a Hamiltonian operator, which represents the energy for the system, and $| \Psi \rangle$
where $i$ is the imaginary number, and $\hbar$ is Plancks constant. $\hat{H}$ is
a Hamiltonian operator, which represent the energy for the system, and $| \Psi \rangle$
is the quantum state. In two-dimensional position space, the quantum state can
be expressed using the time-dependent complex-valued wave function $\Psi (x, y, t)$.
Using the Born rule, the square modulus of the wave function is proportional to the
probability density of detecting a particle at position $(x, y)$ at time $t$. The
relation is given by
Using Born rule, the square modulus of the wave function is proportional to the
probability density of finding a particle at position $(x, y)$ at time t. The relation
is given by
\begin{align}
p(x, y \ | \ t) &= |\Psi(x, y, t)|^{2} = \Psi^{*}(x, y, t) \Psi(x, y, t) \ ,
\label{eq:born_rule}
\end{align}
where $\Psi^{*}$ denotes the complex conjugate of the wave function. When the potential
is time-independent, and the particle is non-relativistic, the Schrödinger equation
can be expressed as
where $\Psi^{*}$ denotes the complex conjugated wave function.
% Add something about kinetic and potential energy, to introduce the potential V
When the potential is time-independent, the Schrödinger equation can be expressed as
\begin{align*}
i \hbar \frac{\partial}{\partial t} \Psi (x, y, t) &= - \frac{\hbar^{2}}{2m} \bigg( \frac{\partial^{2}}{\partial x^{2}} + \frac{\partial^{2}}{\partial y^{2}} \bigg) \Psi (x, y, t) \\
& \quad + V(x, y, t) \Psi (x, y, t) \numberthis \ .
\label{eq:schrodinger_special}
\end{align*}
The partial derivatives are expressions of the kinetic energy, and the potental $V$
encodes the external environment. In this experiment we will only consider the case where
the potential is time-independent, resulting in $V = V(x, y)$.
When we scale the Schrödinger equation by the dimensionful variables, we are left with
the wave function $u$ and the potential $v$. The dimensionless equation is given by
The partial derivatives (...) gives the kinetic energy, and the potental $V$ is
the external environment. In this experiment we will only consider the case where
the potential is time-independent, resulting in $V = V(x, y)$
When we scale Schrödinger equation by the dimensionful variables, we are left with
a wave function $u$, potential $v$ and the dimensionless equation
\begin{align}
i \frac{\partial u}{\partial t} &= - \frac{\partial^{2} u}{\partial x^{2}} - \frac{\partial^{2} u}{\partial y^{2}} + v(x, y) u \ .
\label{eq:schrodinger_dimensionless}
\end{align} %
As a result of working in position space, the Born rule is given by
This gives us the Born rule
\begin{align}
p(x, y \ | \ t) &= |u(x, y, t)|^{2} = u^{*}(x, y, t) u(x, y, t) \ ,
p(x, y \ | \ t) &= |u(x, y, t)|^{2} = u^{*}(x, y, t) u(x, y, t) \ .
\label{eq:born_rule_scaled}
\end{align}
where we assume a normalized wave function $u(x, y, t)$. We will initialize the wave
function, using a Gaussian wavepacket, given by
\begin{align*}
u(x, y, t=0) &= e^{- \frac{(x-x_{c})^{2}}{2 \sigma_{x}^{2}} - \frac{(y-y_{c})^{2}}{2 \sigma_{y}^{2}} + ip_{x}x + ip_{y}y} \ .
\end{align*}
$x_{c}$ and $y_{c}$ are the coordinates of the center of the wavepacket, $\sigma_{x}$
and $\sigma_{y}$ are the width of the wavepacket. The wave packet momenta are
given by $p_{x}$ and $p_{y}$.
\subsection{The Crank-Nicolson scheme}\label{ssec:crank_nicolson} %
When we evaluate a particle's position, we have to consider partial differential
equations (PDEs). To solve these numerically, we have to discretize Equation \eqref{eq:schrodinger_dimensionless}.
We use the $\theta$-rule \footnote{We can derive Forward Euler using $\theta = 1$, and Backward Euler using $\theta = 0$, in the $\theta$-rule.},
to combine the forward (explicit) and backward (implicit) finite difference methods.
When we evaluate a particle in position space, we have to consider partial differential
equations (PDE). To solve these numerically, we have to discretize Equation \eqref{eq:schrodinger_dimensionless}.
We use the $\theta$-rule \footnote{Using the $\theta$-rule, we can derive Forward Euler using $\theta = 1$, and Backward Euler using $\theta = 0$},
to combine the forward (explicit) and backward (implicit) finite difference method.
The result is a linear combination of the explicit and implicit scheme, given by
\begin{align}
\frac{u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n}}{\Delta t} &= \theta F_{\ivec, \jvec}^{n+1} + (1 - \theta) F_{\ivec, \jvec}^{n} \ ,
\label{eq:theta_rule}
\end{align} %
where $\theta \in [0, 1]$.
To simplify the notation, and avoid any confusion of the indices with the imaginary unit $i$,
To simplify notation and avoid confusion of indices with the imaginary number $i$,
we have used the notation $\ivec, \jvec$ in subscript to indicate the commonly named indices $i, j$
in x- and y-direction. In addition, the superscript $n, n+1$ indicate position in time.
We derive the Crank-Nicolson scheme (CN) by using $\theta = 1/2$, given by
We get the Crank-Nicolson method (CN) when $\theta = 1/2$ gives Crank-Nicolson
\begin{align}
\frac{u_{\ivec, \jvec}^{n+1} - u_{\ivec, \jvec}^{n}}{\Delta t} &= \frac{1}{2} \bigg[ F_{\ivec, \jvec}^{n+1} + F_{\ivec, \jvec}^{n} \bigg] \ .
\label{eq:crank_nicolson_scheme}
\label{eq:crank_nicolson_method}
\end{align} %
Using CN, we derive the discretized Schrödinger equation, given by
Using CN, we derive the discretized Schrödinger equation given by
\begin{align*}
& u_{\ivec, \jvec}^{n+1} - r \big[ u_{\ivec+1, \jvec}^{n+1} - 2u_{\ivec, \jvec}^{n+1} + u_{\ivec-1, \jvec}^{n+1} \big] \\
& - r \big[ u_{\ivec, \jvec+1}^{n+1} - 2u_{\ivec, \jvec}^{n+1} + u_{\ivec, \jvec-1}^{n+1} \big] + \frac{i \Delta t}{2} v_{\ivec, \jvec} u_{\ivec, \jvec}^{n+1} \\
@ -87,35 +76,34 @@ Using CN, we derive the discretized Schrödinger equation, given by
\end{align*} %
where $r$ is defined as
\begin{align*}
r \equiv \frac{i \Delta t}{2 \Delta h^{2}} \ .
r \equiv \frac{i \Delta t}{2 \Delta h^{2}}
\end{align*} %
The full derivation of both Equation \eqref{eq:crank_nicolson_scheme} and Equation \eqref{eq:schrodinger_discretized}
The full derivation of both Equation \eqref{eq:crank_nicolson_method} and Equation \eqref{eq:schrodinger_discretized}
can be found in Appendix \ref{ap:crank_nicolson}.
\subsection{The double-slit experiment}\label{ssec:double_slit} %
Thomas Young first performed the double-slit experiment in 1801 to demonstrate the
principle of the interference of light \cite{britannica:2023:young}, while postulating
light as waves rather than particles. The double-slit experiment results in a diffraction
principle of interference of light \cite{britannica:2023:young}, while postulating
light as waves rather than particles. The double-slit experiment result in a diffraction
pattern on a detector screen, where constructive interference of light result in
bright spots, and destructive interference result in dark spots. An illustration
of Thomas Young's setup can be found in Figure \ref{fig:youngs_double_slit}.
bright spots, and destructive interference result in dark spots as showed in Figure
\ref{fig:youngs_double_slit}.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/youngs_double_slit.pdf}
\caption{The setup of Thomas Young's double slit experiment, where $S_{0}$ denotes
the light source, $S_{1}$ and $S_{2}$ denotes the slits in the barrier \cite[p. 4]{mit:2004:physics}.}
the light source, $S_{1}$ and $S_{2}$ denotes the slits in the wall.}
\label{fig:youngs_double_slit}
\end{figure}
After the wave passes through the barrier, the pattern observed is determined by
the path difference given by
\begin{align}
After the wave passes through the two slits, the pattern observed is determined by
the path difference determined by
\begin{align*}
\delta = d \sin (\theta) = m \lambda \ ,
\label{eq:interference}
\end{align}
\end{align*}
where $\lambda$ is the wavelength and $m$ is called the order number. $d$ is the
distance between the center of the two slits, while assuming that the distance between
distance between the center of the two slits, assuming that the distance between
the wall and the detector screen $L >> \delta$ \cite[p. 6]{mit:2004:physics}. In
this case, we observe constructive interference when
\begin{align*}
@ -123,31 +111,23 @@ this case, we observe constructive interference when
\end{align*}
and destructive interference when
\begin{align*}
\delta = (m + \frac{1}{2}) \lambda && m = 0, \pm 1, \pm 2 \dots \ .
\delta = (m + \frac{1}{2}) \lambda && m = 0, \pm 1, \pm 2 \dots \ ,
\end{align*}
% Something about Heisenberg uncertainty principle
\subsection{Implementation}\label{ssec:implementation} %
In this experiment, we set up the grid with an equal step size in the x- and y-direction $h$,
and step size in the t-direction $\Delta t$, such that
\begin{align*}
x \in [0, 1] && x \rightarrow x_{\ivec} = \ivec h && \ivec = 0, 1, \dots, M-1 \\
y \in [0, 1] && y \rightarrow y_{\jvec} = \jvec h && \jvec = 0, 1, \dots, M-1 \\
t \in [0, T] && t \rightarrow t_{n} = n \Delta t && n = 0, 1, \dots, N_{t}-1 \ .
\end{align*}
In addition, we simplify the indices such that
\begin{align*}
u(x, y, t) \rightarrow u(\ivec h, \jvec h, n \Delta t) \equiv u_{\ivec, \jvec}^{n} \\
v(x, y) \rightarrow u(\ivec h, \jvec h) \equiv v_{\ivec, \jvec} \ ,
\end{align*}
which results in a matrix $U^{n}$ that contains elements $u_{\ivec, \jvec}^{n}$, and
a matrix $V$ that contains elements $v_{\ivec, \jvec}$. We used Dirichlet boundary
conditions, given by
\begin{align*}
u(x=0, y, t) &= 0 & u(x=1, y, t) &= 0 \\
u(x, y=0, t) &= 0 & u(x, y=1, t) &= 0 \ ,
\end{align*}
% Add tables of parameters used, initial conditions, notation etc.
A, B are sparse csc matrix
- theory of csc matrix?
% \begin{equation*}
% \begin{pNiceArray}{ccc|ccc}
% \bullet & \bullet & & \bullet & & & & & \\
% \bullet & \bullet & \bullet & & \bullet & & & & \\
% & \bullet & \bullet & & & \bullet & & &
% \end{pNiceArray}
% \end{equation*}
We use Dirichlet boundary conditions, as given in Table \ref{tab:boundary_conditions},
which allows us to express Equation \eqref{eq:schrodinger_discretized} as a matrix
equation
\begin{align}
@ -157,8 +137,8 @@ Here, both $u^{n+1}$ and $u^{n}$ are column vectors containing the internal poin
of the $xy$ grid at time step $n+1$ and $n$, respectively. Since we have $M$ points
in $x$- and $y$-direction, we have $M-2$ internal points. Both $u$ vectors have
length $(M-2)^{2}$, and the matrices $A$ and $B$ have size $(M-2)^{2} \times (M-2)^{2}$.
The matrices are sparse and can be decomposed as submatrices of size $(M-2) \times (M-2)$,
with the following pattern
The matrices can be decomposed as submatrices of size $(M-2) \times (M-2)$, with
the following pattern
\begin{align*}
A, B =
\begin{bmatrix}
@ -215,18 +195,46 @@ with the following pattern
\bullet & \bullet & \bullet \\
\phantom{\bullet} & \bullet & \bullet
\end{matrix}
\end{bmatrix} \ .
\end{bmatrix}
\end{align*}
To fill the matrices $A$ and $B$, we use
To fill the matrices $A$ and $B$, we used
\begin{align*}
a_{k} &= 1 + 4r + \frac{i \Delta t}{2} v_{\ivec, \jvec} \\
b_{k} &= 1 - 4r - \frac{i \Delta t}{2} v_{\ivec, \jvec} \ .
\end{align*}
An example of a pair of filled matrices can be found in Appendix \ref{ap:matrix_structure}.
An example of filled matrices can be found in Appendix \ref{ap:matrix_structure}.
For the general setup of the barrier, we used the values in Table \ref{tab:barrier_setup},
and for the simulations, we used the parameter settings in Table \ref{tab:sim_settings}.
% Insert Heisenberg uncertainty here? Or refer to it?
Notations:
In addition, we use an equal step size in x- and y-direction, $h$ such that
\begin{align*}
x \in [0, 1] && x \rightarrow x_{\ivec} = \ivec h && \ivec = 0, 1, \dots, M-1 \\
y \in [0, 1] && y \rightarrow y_{\jvec} = \jvec h && \jvec = 0, 1, \dots, M-1 \\
t \in [0, T] && t \rightarrow t_{n} = n \Delta t && n = 0, 1, \dots, N_{t}-1
\end{align*}
And simplify indices such that
\begin{align*}
u(x, y, t) \rightarrow u(\ivec h, \jvec h, n \Delta t) \equiv u_{\ivec, \jvec}^{n} \\
v(x, y) \rightarrow u(\ivec h, \jvec h) \equiv v_{\ivec, \jvec}
\end{align*}
which gives a matrix $U^{n}$ that contains elements $u_{\ivec, \jvec}^{n}$, and
a matrix $V$ that contains elements $v_{\ivec, \jvec}$.
\begin{table}[H]
\centering
\begin{tabular}{l r} % @{\extracolsep{\fill}}
\hline
Position & Value \\
\hline
$u(x=0, y, t)$ & $0$ \\
$u(x=1, y, t)$ & $0$ \\
$u(x, y=0, t)$ & $0$ \\
$u(x, y=1, t)$ & $0$ \\
\hline
\end{tabular}
\caption{Boundary conditions in the xy-plane, also known as Dirichlet boundary conditions.}
\label{tab:boundary_conditions}
\end{table}
For the general setup of the wall, we used
\begin{table}[H]
\centering
\begin{tabular}{l r} % @{\extracolsep{\fill}}
@ -239,14 +247,15 @@ and for the simulations, we used the parameter settings in Table \ref{tab:sim_se
Slit aperture & $0.05$ \\
\hline
\end{tabular}
\caption{Barrier parameters and values.}
\label{tab:barrier_setup}
\caption{Wall setup.}
\label{tab:wall_setup}
\end{table}
\begin{table}[H]
\centering
\begin{tabular}{l r r} % @{\extracolsep{\fill}}
\hline
Parameter & Setting 1 & Setting 2 \\
Simulation & $1$ & $2$ \\
\hline
$h$ & $0.005$ & $0.005$ \\
$\Delta t$ & $2.5 \times 10^{-5}$ & $2.5 \times 10^{-5}$ \\
@ -260,39 +269,12 @@ and for the simulations, we used the parameter settings in Table \ref{tab:sim_se
$v_{0}$ & $0$ & $1 \times10^{10}$ \\
\hline
\end{tabular}
\caption{Simulation settings used in the double slit experiment. Setting 1 is
applied when the barrier is switched off and setting 2 is applied when the barrier
switched on.}
\label{tab:sim_settings}
\caption{Wall setup.}
\label{tab:sim_setup}
\end{table}
To check if the total probability is conserved over time, and that the implementation
was correct, we computed the deviation from $1.0$ given by
\begin{align*}
s^{n} &= |1.0 - \sum_{\ivec , \jvec} p_{\ivec , \jvec}^{n}| \\
&= |1.0 - \sum_{\ivec , \jvec} u_{\ivec , \jvec}^{n*} u_{\ivec , \jvec}^{n}| \ .
\end{align*}
\subsection{Tools}\label{ssec:tools} %
The double-slit experiment is implemented in C++. We use the Python library
\verb|NumPy| \cite{harris:2020:numpy}, \verb|matplotlib| \cite{hunter:2007:matplotlib} to produce all the plots, and
\verb|matplotlib| \cite{hunter:2007:matplotlib} to produce all the plots, and
\verb|seaborn| \cite{waskom:2021:seaborn} to set the theme in the figures.
\end{document}
% \begin{table}[H]
% \centering
% \begin{tabular}{l r} % @{\extracolsep{\fill}}
% \hline
% Position & Value \\
% \hline
% $u(x=0, y, t)$ & $0$ \\
% $u(x=1, y, t)$ & $0$ \\
% $u(x, y=0, t)$ & $0$ \\
% $u(x, y=1, t)$ & $0$ \\
% \hline
% \end{tabular}
% \caption{Boundary conditions in the xy-plane, also known as Dirichlet boundary conditions.}
% \label{tab:boundary_conditions}
% \end{table}

View File

@ -4,125 +4,32 @@
\section{Results}\label{sec:results}
\subsection{Deviation}\label{ssec:deviation}
% Problem 3: Discuss approaches to solve Au^{n+1} = b, dealing with sparse matrix...
We used the \verb|superlu| solver, which is a solver for sparse matrices. It is
generally used to solve nonsymmetric, sparse matrices. However, as the alternative
solver \verb|lapack| converts a sparse matrix to a dense matrix, it will increase
memory usage compared to \verb|superlu|.
We used the superlu solver, which is a dedicated solver for sparse matrices. It is
generally used to solve nonsymmetric, sparse matrices. However, as the lapack solver
converts the sparse matrix to a dense matrix, it will increase memory usage compared
to superlu.
% Problem 7: Consequenses of solver choice, in regards to accuracy of probability conserved
% Add plot of deviation for both single- and double-slit
Since we used a solver for sparse matrices, we decrease the number of computations performed
compared to the number of computations using a solver for dense matrices.
We checked if the total probability was conserved over time, by plotting the deviation
from $1.0$.
Since we use a solver for sparse matrices, we decrease number of computations performed
compared to solver using dense matrix. We check if the total probability is conserved
over time, by plotting the deviation $s$ as
\begin{align*}
s^{n} = 1 - \sum_{\ivec , \jvec} p_{\ivec , \jvec}^{n} = 1 - \sum_{\ivec , \jvec} u_{\ivec , \jvec}^{n*} u_{\ivec , \jvec}^{n} \ .
\end{align*}
The deviation as a function of time is plotted in Figure \ref{fig:deviation}.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/probability_deviation.pdf}
\caption{Deviation of total probability, for time $t \in [0, T]$ where $T=0.008$.}
\caption{Deviation for $t \in [0, T]$ where $T=0.008$.}
\label{fig:deviation}
\end{figure}
We simulated the wave equation with the barrier switched off, using setting 1 in
Table \ref{tab:sim_settings} found in Section \ref{ssec:implementation}. When the
barrier was switched on, we used setting 2 in \ref{tab:sim_settings}. We observed
a larger deviation of total probability for a barrier with double slits compared
to no barrier. The result can found in Figure \ref{fig:deviation}. When the wave interacts
with the barrier, it results in a larger change in kinetic energy. The result is more prone
to computational errors, than if the wave propagates without interacting with a
barrier. No interaction results in a more stable deviation from the total probability.
In addition, we have to consider the limitations of the computer, therefore some computational
error is to be expected.
\subsection{Time evolution}\label{ssec:time_evolution}
% Problem 8: Colormap, include plot of both Re and Im for different time steps
% Account for color scale
We studied the time evolution of the probability function, using setting 2 in
Table \ref{tab:sim_settings}, found in Section \ref{ssec:implementation}. To visualize
the time evolution, we created colormap plots for different time steps. Figure \ref{fig:colormap_0_prob},
Figure \ref{fig:colormap_1_prob}, and Figure \ref{fig:colormap_2_prob} show the
results for time steps $t=\{0, 0.001, 0.002\}$, respectively. In addition, we created
separate plots for the real and imaginary part of $u_{\ivec, \jvec}$, for the same
time steps. The results can be found in Appendix \ref{ap:figures}, in Figure \ref{fig:colormap_real_imag}.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/color_map_0_prob.pdf}
\caption{The probability function $p_{\ivec, \jvec}^{n}$, at time $t=0$.}
\label{fig:colormap_0_prob}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/color_map_1_prob.pdf}
\caption{The probability function $p_{\ivec, \jvec}^{n}$, at time $t=0.001$.}
\label{fig:colormap_1_prob}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/color_map_2_prob.pdf}
\caption{The probability function $p_{\ivec, \jvec}^{n}$, at time $t=0.002$.}
\label{fig:colormap_2_prob}
\end{figure}
At time step $t=0.001$, Figure \ref{fig:colormap_1_prob}, when the wave interacts
with the double slit barrier, we observe a clear diffraction pattern in the
probability function. At time step $t=0$ (Figure \ref{fig:colormap_0_prob}) and
$t=0.002$ (Figure \ref{fig:colormap_2_prob}), the diffraction pattern is not as
clear. It is, however, more visible when we observe the real and imaginary part
separately in Figure \ref{fig:colormap_real_imag}. Since the probability function
is a product of $u_{\ivec, \jvec}$ and its conjugate $u_{\ivec, \jvec}^{*}$,
initialized by a Gaussian wavepacket, the result is a sum of the real and imaginary part.
% This can be found using Euler's formula, and the diffraction pattern is determined by interference given by \eqref{eq:interference}
In Figure \ref{fig:colormap_2_prob}, the probability function result in positive
areas at both sides of the barries. Some of the probability function is reflected
by the barrier, while the the rest spread out after passing the barrier. This is
a consequence of the wave-particle duality.
To compare the probability function $p_{\ivec, \jvec}$ for all the time steps in
a colormap plot, with the real and imaginary part of $u_{\ivec, \jvec}$, we created
Figure \ref{fig:colormap_all}. Where we excluded all x- and y-ticks, and labels, to
better visualize the diffraction pattern.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/color_map_all.pdf}
\caption{The time evolution of the probability function $p_{\ivec, \jvec}^{n}$ (top row),
Re($u_{\ivec, \jvec}$) (middle row), and Im($u_{\ivec, \jvec}$) (bottom row).
Time step $t=0$ in the left column, $t=0.001$ in the middle column, and $t=0.002$
in the right column.}
\label{fig:colormap_all}
\end{figure}
\subsection{Particle detection}\label{ssec:particle_detection}
% Problem 9: Plot detection probability for single-, double- and triple-slit
We simulated the wave equation using setting 2 in Table \ref{tab:sim_settings},
and assumed a detector screen located at $x=0.8$. To visualize the pattern of constructive
and destructive interference, we plotted the probability of particle detection,
along the screen, at time $t=0.002$. We adjusted the parameters to include single-, double-, and triple-slit
barriers. The results are found in Figure \ref{fig:particle_detection_single},
Figure \ref{fig:particle_detection_double}, and Figure \ref{fig:particle_detection_triple},
respectively.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/single_slit_detector.pdf}
\caption{Probability of particle detection along a detector screen at time $t=0.002$,
when using a single-slit barrier.}
\label{fig:particle_detection_single}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/double_slit_detector.pdf}
\caption{Probability of particle detection along a detector screen at time $t=0.002$,
when using a double-slit barrier.}
\label{fig:particle_detection_double}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/triple_slit_detector.pdf}
\caption{Probability of particle detection along a detector screen at time $t=0.002$,
when using a triple-slit barrier.}
\label{fig:particle_detection_triple}
\end{figure}
When the barrier has a single slit, there is no destructive interference and we
observe a single peak in the probability of particle detection. Adding another slit
result in more peaks, as there is both constructive and destructive interference.
When we used a triple-slit barrier, we observed an increase in interference which
resulted in narrow peaks. In addition, the probability of detecting a particle at
the ends of the screen increased with the number of slits.
\end{document}

View File

@ -19,7 +19,6 @@ plt.rcParams.update(params)
def plot():
ticks = [0, 0.25, 0.5, 0.75, 1.0]
with open("data/color_map.txt") as f:
lines = f.readlines()
size = int(lines[0])
@ -39,19 +38,16 @@ def plot():
np.multiply(arr, arr.conj()).real,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True),
extent=[0, 1.0, 0, 1.0]
)
color_map2 = ax2.imshow(
arr.real,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True),
extent=[0, 1.0, 0, 1.0]
)
color_map3 = ax3.imshow(
arr.imag,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True),
extent=[0, 1.0, 0, 1.0]
)
# Create color bar
@ -64,26 +60,10 @@ def plot():
ax2.grid(False)
ax3.grid(False)
# Set custom ticks
ax1.set_xticks(ticks)
ax1.set_yticks(ticks)
ax2.set_xticks(ticks)
ax2.set_yticks(ticks)
ax3.set_xticks(ticks)
ax3.set_yticks(ticks)
# Set labels
ax1.set_xlabel("x-axis")
ax1.set_ylabel("y-axis")
ax2.set_xlabel("x-axis")
ax2.set_ylabel("y-axis")
ax3.set_xlabel("x-axis")
ax3.set_ylabel("y-axis")
# Save the figures
fig1.savefig(f"latex/images/color_map_{i}_prob.pdf", bbox_inches="tight")
fig2.savefig(f"latex/images/color_map_{i}_real.pdf", bbox_inches="tight")
fig3.savefig(f"latex/images/color_map_{i}_imag.pdf", bbox_inches="tight")
fig1.savefig(f"latex/images/color_map_{i}_prob.pdf")
fig2.savefig(f"latex/images/color_map_{i}_real.pdf")
fig3.savefig(f"latex/images/color_map_{i}_imag.pdf")
# Close figures
plt.close(fig1)

View File

@ -1,62 +0,0 @@
import ast
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set_theme()
params = {
"font.family": "Serif",
"font.serif": "Roman",
"text.usetex": True,
"xtick.bottom": False,
"xtick.labelbottom": False,
"ytick.left": False,
"ytick.labelleft": False,
"axes.grid": False,
# "figure.autolayout": True
# "figure.constrained_layout.use": False,
# "figure.constrained_layout.h_pad": 0.04167,
# "figure.constrained_layout.w_pad": 0.04167
# "figure.subplot.wspace": 0,
# "figure.subplot.hspace": 0
}
plt.rcParams.update(params)
def plot():
fig, axes = plt.subplots(figsize=(6,6), nrows=3, ncols=3)
with open("data/color_map.txt") as f:
lines = f.readlines()
size = int(lines[0])
for i, line in enumerate(lines[1:]):
arr = line.strip().split("\t")
arr = np.asarray(list(map(lambda x: complex(*ast.literal_eval(x)), arr)))
# Reshape and transpose array
arr = arr.reshape(size, size).T
# Plot color maps
axes[0, i].imshow(
np.multiply(arr, arr.conj()).real,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True)
)
axes[1, i].imshow(
arr.real,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True)
)
axes[2, i].imshow(
arr.imag,
interpolation="nearest",
cmap=sns.color_palette("mako", as_cmap=True)
)
# Create tight subplots and save figure
fig.subplots_adjust(wspace=0, hspace=0)
fig.savefig(f"latex/images/color_map_all.pdf", bbox_inches="tight")
if __name__ == "__main__":
plot()

View File

@ -27,7 +27,6 @@ def plot():
"latex/images/double_slit_detector.pdf",
"latex/images/triple_slit_detector.pdf",
]
colors = sns.color_palette("mako", n_colors=2)
for file, output in zip(files, outputs):
with open(file) as f:
lines = f.readlines();
@ -44,10 +43,8 @@ def plot():
slice *= norm
slice = np.asarray([i * i.conjugate() for i in slice])
ax.plot(x, slice, color=colors[0])
ax.set_xlabel("Detector screen (y-axis)")
ax.set_ylabel("Detection probability")
fig.savefig(output, bbox_inches="tight")
ax.plot(x, slice)
plt.savefig(output)
plt.close(fig)

View File

@ -21,17 +21,9 @@ def plot():
"data/probability_deviation_no_slits.txt",
"data/probability_deviation_slits.txt",
]
labels = [
"none",
"double-slit"
]
colors = sns.color_palette("mako", n_colors=2)
fig, ax = plt.subplots()
for file, label, color in zip(files, labels, colors):
for file in files:
with open(file) as f:
lines = f.readlines()
lines = f.readlines();
x = []
arr = []
for line in lines:
@ -39,13 +31,10 @@ def plot():
x.append(float(tmp[0]))
arr.append(float(tmp[1]))
ax.plot(x, arr, label=label, color=color)
ax.legend(title="Barrier")
ax.set_xlabel("Time (t)")
ax.set_ylabel("Deviation")
fig.savefig("latex/images/probability_deviation.pdf", bbox_inches="tight")
plt.plot(x,arr)
plt.savefig("latex/images/probability_deviation.pdf")
if __name__ == "__main__":
plot()
plot()

40
python_scripts/plot_v.py Normal file
View File

@ -0,0 +1,40 @@
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.animation import FuncAnimation
import ast
import seaborn as sns
params = {
"font.family": "Serif",
"font.serif": "Roman",
"text.usetex": True,
"axes.titlesize": "large",
"axes.labelsize": "large",
"xtick.labelsize": "large",
"ytick.labelsize": "large",
"legend.fontsize": "medium",
}
plt.rcParams.update(params)
def plot():
with open("v.txt") as f:
lines = f.readlines();
size = int(lines[0])
for line in lines[1:]:
arr = line.strip().split("\t")
arr = np.asarray(list(map(lambda x: ((a := complex(*ast.literal_eval(x)))*a.conjugate()).real, arr)))
# print(sum(arr))
arr = arr.reshape(size,size)
# print(arr)
plt.imshow(arr.T, cmap="hot", interpolation="nearest")
plt.show()
if __name__ == "__main__":
plot()

BIN
requirements.txt (Stored with Git LFS)

Binary file not shown.