Difference between revisions of "Schrödinger equation"
Line 1: | Line 1: | ||
− | + | Go back to [[Medusa#Examples|Examples]]. | |
− | = | + | == 2D infinite square well == |
− | + | We are solving a Schrödinger equation for a quantum particle that is confined to a 2-dimensional square box, 0<x<L and 0<y<L. Within this square the particle behaves as a free particle, but the walls are impenetrable, so the wave function is zero at the walls. This is described by the infinite potential | |
− | \[ | + | \[ |
+ | V(x)= | ||
+ | \begin{cases} | ||
+ | 0, &0<x<L,\: 0<y<L, | ||
+ | \\ | ||
+ | \infty, &{\text{otherwise.}} | ||
+ | \end{cases} | ||
+ | \] | ||
− | + | With this potential Schrodinger equation simplifies to | |
+ | \[ | ||
+ | -{\hbar^2 \over 2m} \nabla^2 \Psi(x,y;t) = i\hbar {\partial \over \partial t}\Psi(x,y;t), | ||
+ | \] | ||
+ | where $m$ is the mass of the particle, \hbar is reduced Planck constant and $\Psi(x,y;t)$ is the wave function. We set $\hbar / 2m = 1 and L=1$. | ||
− | The | + | The solution \Psi(x,y;t) must therefore satisfy |
+ | \[ | ||
+ | \nabla^2 \Psi = -i{\partial \over \partial t}\Psi \quad \text{in} \quad \Omega, | ||
+ | \] | ||
+ | with Dirichlet boundary condition | ||
+ | \[ | ||
+ | \Psi = 0 \quad \text{on} \quad \partial \Omega, | ||
+ | \] | ||
+ | where $\Omega=[0, 1]\times[0, 1]$ denotes the square box domain and $\partial \Omega$ is the boundary of the domain. In order to get the unique solution for the time propagation of the wave function the initial state \Psi(x, y,\, 0) has to be selected. We choose | ||
+ | \[ | ||
+ | \Psi(x,y;t=0) = \sin{(\pi x)} \sin{(\pi y)}. | ||
+ | \] | ||
− | + | Once we prepare the domain and operators, we can turn the Schrodinger equation into code. As we are solving the time propagation implicitly, we will have to solve a matrix equation for every step. For this reason a space matrix M is constructed. Next the equations are implemented, psi denotes the matrix solution for each step and rhs the right-hand side of the matrix equation which is in our case equivalent to the previous state psi . | |
− | + | <syntaxhighlight lang="c++" line> | |
+ | Eigen::SparseMatrix<std::complex<double>, Eigen::RowMajor> M(N, N); | ||
+ | // set initial state | ||
+ | for(int i : domain.interior()) { | ||
+ | double x = domain.pos(i, 0); | ||
+ | double y = domain.pos(i, 1); | ||
+ | rhs(i) = sin(PI * x) * sin(PI * y); | ||
+ | } | ||
+ | // set equation on interior | ||
+ | for(int i : domain.interior()) { | ||
+ | op.value(i) + (-1.0i) * dt * op.lap(i) = rhs(i); | ||
+ | } | ||
− | + | // set equation on boundary | |
+ | for (int i: domain.boundary()){ | ||
+ | op.value(i) = 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | At each time step the matrix equation is solved using an Eigen linear equation solver, in this case, the BICGStab algorithm. | |
− | + | <syntaxhighlight lang="c++" line> | |
+ | // solve matrix system | ||
+ | psi = solver.solve(rhs); | ||
− | + | // update rhs | |
+ | rhs = psi; | ||
+ | </syntaxhighlight> | ||
− | \ | + | The animation of the real part of solution $\Re \Psi(x,y; t)$ is presented below. |
− | |||
− | + | [[File:video.avi|400px]] | |
− | + | Go back to [[Medusa#Examples|Examples]]. | |
− | |||
− | |||
− | |||
− | }\] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Revision as of 11:25, 17 June 2019
Go back to Examples.
2D infinite square well
We are solving a Schrödinger equation for a quantum particle that is confined to a 2-dimensional square box, 0<x<L and 0<y<L. Within this square the particle behaves as a free particle, but the walls are impenetrable, so the wave function is zero at the walls. This is described by the infinite potential
V(x)= \begin{cases} 0, &0<x<L,\: 0<y<L, \\ \infty, &{\text{otherwise.}} \end{cases}
With this potential Schrodinger equation simplifies to -{\hbar^2 \over 2m} \nabla^2 \Psi(x,y;t) = i\hbar {\partial \over \partial t}\Psi(x,y;t),
The solution \Psi(x,y;t) must therefore satisfy \nabla^2 \Psi = -i{\partial \over \partial t}\Psi \quad \text{in} \quad \Omega,
Once we prepare the domain and operators, we can turn the Schrodinger equation into code. As we are solving the time propagation implicitly, we will have to solve a matrix equation for every step. For this reason a space matrix M is constructed. Next the equations are implemented, psi denotes the matrix solution for each step and rhs the right-hand side of the matrix equation which is in our case equivalent to the previous state psi .
1 Eigen::SparseMatrix<std::complex<double>, Eigen::RowMajor> M(N, N);
2 // set initial state
3 for(int i : domain.interior()) {
4 double x = domain.pos(i, 0);
5 double y = domain.pos(i, 1);
6 rhs(i) = sin(PI * x) * sin(PI * y);
7 }
8
9 // set equation on interior
10 for(int i : domain.interior()) {
11 op.value(i) + (-1.0i) * dt * op.lap(i) = rhs(i);
12 }
13
14 // set equation on boundary
15 for (int i: domain.boundary()){
16 op.value(i) = 0;
17 }
At each time step the matrix equation is solved using an Eigen linear equation solver, in this case, the BICGStab algorithm.
1 // solve matrix system
2 psi = solver.solve(rhs);
3
4 // update rhs
5 rhs = psi;
The animation of the real part of solution \Re \Psi(x,y; t) is presented below.
Go back to Examples.