\documentclass[notitlepage]{article}
\usepackage{titling}
\usepackage[utf8]{inputenc}
\usepackage{titling}
\usepackage{fullpage}
\usepackage{mathtools}
\usepackage{sagetex}
\usepackage{url}
\usepackage{cite}
\usepackage{hyperref}
\usepackage{xcolor}
\hypersetup{
colorlinks,
linkcolor={red!50!black},
citecolor={blue!50!black},
urlcolor={blue!80!black}
}
\usepackage{breqn}
\usepackage{collect}
\setlength{\parskip}{1ex}
\title{Discretization of Poirier's Quantum Dynamical Equations of Motion}
\author{Bill Page \small{(\href{mailto:bill.page@newsynthesis.org}{bill.page@newsynthesis.org})}}
\date{\today}
\begin{document}
\maketitle
\thispagestyle{empty}
\begin{abstract}
\textbf{From Poirier’s Bohmian Mechanics without Wavefunctions, to Hall’s Many Interacting Worlds in More Than One Dimension}
In this note we show that Hall's "toy" model of quantum mechanics as many interacting interacting classical worlds one dimension follows directly from the approximation of Poirier's quantum mechanical equations of motion as difference equations with a judicious choice of difference operators. Using the same approach we can construct similar models for the two- and three-dimensional case. We observe that the discretization of Poirier's expression for the quantum force is identical to the gradient of the discretization of the quantum potential in both the 1-D case and in the 2 and 3-D cases when using a symmetric difference operator.
\end{abstract}
\setcounter{section}{-1}
\section{Preliminary}
\begin{sagesilent}
import numpy
import mpmath
\end{sagesilent}
In this document we have used the computer algebra system
Sage\footnote{\sagestr{version()}\cite{SageMath2016} on SageMathCloud\cite{SageMathCloud2016}} with components of
SciPy\footnote{numpy Version \sagestr{numpy.version.version} \cite{SciPy2016}}
and
mpmath\footnote{mpmath Version \sagestr{mpmath.__version__} \cite{mpmath2016}}
for both symbolic and numeric calculations. The source code for this document can be found
online\footnote{\url{https://cloud.sagemath.com/projects/b04b5777-e269-4c8f-a4b8-b21dbe1c93c6/files/discretization.tex}}. The inset bolded text below and many of the formulas in this paper are input and output produced directly by the Sage system.
\begin{sageblock}
from numpy import array,concatenate,isnan
from mpmath import erfinv
\end{sageblock}
It is convenient to define a compact notation for functions and some special symbols:
\definecollection{prelim}
\begin{sagesilent}
begincol=chr(92)+"begin { collect* } { prelim }"
endcol=chr(92)+"end { collect* }"
\end{sagesilent}
ok { \sagestr{begincol} }
\begin{sageblock}
def fun(*y):
cache={}
def upd(f,x,y):
try: return cache[x]
except KeyError:
try: cache[x] = f.subs(dict([[y[i],x[i]] for i in range(len(y))]))
except AttributeError:
def sub(f): return f.subs(dict([[y[i],x[i]] for i in range(len(y))]))
cache[x] = map(sub,f)
return cache[x]
return lambda f: lambda *x: upd(f,x,y)
def argscript(self, *args): return "%s_{%s}"%(self.name(),','.join(map(repr, args)))
def functions(*names):
return map(lambda nam:function(nam, print_latex_func=argscript),names)
def detJscript(self, *args):
return "\\begin{vmatrix}\\scriptstyle{J}\\end{vmatrix}_{%s}"% (
','.join(map(repr, args)))
detJ = function('detJ', print_latex_func=detJscript)
def squared(x): return x.dot(x)
hbar = var('hbar',latex_name='\\hbar')
mu = var('mu',latex_name='\\mu')
\end{sageblock}
\sagestr{endcol}
The following is a work-round for a bug\footnote{Some commands for manipulating and simplifying expressions do not respect the \textbf{\rm print\_latex\_func} option. \url{https://trac.sagemath.org/ticket/19151}} in Sage.
\begin{sageblock}
def fix(it):
return it.subs(dict([[function('x')(n+i,m+j),X[0](n+i,m+j)]
for i in range(-1,2) for j in range(-1,2)] +
[[function('y')(n+i,m+j),X[1](n+i,m+j)]
for i in range(-1,2) for j in range(-1,2)]))
\end{sageblock}
\section{2-Dimensional System}
In Schiff and Poirier \cite{schiff2012communication} eq. (18), the quantum dynamical equation of motion
\begin{equation}
\mu \ddot{x^i}+\frac{\partial V(x)}{\partial x^i}- \frac{\hbar^2}{4 m}\frac{\partial}{\partial C^m}\left(K^k_i K^m_j \frac{\partial^2 K^l_j}{\partial C^k \partial C^l}\right)=0
\end{equation}
when specialized to 2-D and discretized by replacing derivatives with difference operators is the 2-D analog of Hall’s \cite{hall2014quantum} “toy” expression eq. (24).
By discretized we mean that the "uniformizing co-ordinate" $\mathbf{C}$ will be replaced with discrete values representing a finite number of "worlds". Derivatives with respect to $\mathbf{C}$ will be replaced with difference operators in the expressions for the quantum potential and quantum force.
Let $E =[x_{n,m},y_{n,m}]$ represent the configuration space of one particle in 2-D space or two particles in 1-D space in the world with co-ordinates $n,m$. In Sage this can be represented as:
\begin{sageblock}
X = functions('x','y')
d = len(X)
C = var('n,m')
E = tuple([x(*C) for x in X])
\end{sageblock}
\begin{equation} \sage{E} \end{equation}
Forward and backward difference approximations to the derivatives are
\begin{sageblock}
def DM(x,n):return x-x.subs(n==n-1)
def DP(x,n):return x.subs(n==n+1)-x
\end{sageblock}
Similarly the central difference approximation to this derivative is
\begin{sageblock}
def D(x,n):return x.subs(n==n+1)/2-x.subs(n==n-1)/2
\end{sageblock}
To derive Hall's equations for a finite number of interacting worlds we replace derivatives with difference operators so the Jacobian becomes:
\begin{sageblock}
J=fun(n,m)(matrix([[DM(E[j],C[i]) for i in range(d)] for j in range(d)]))
\end{sageblock}
\begin{equation} \sage{J(n,m)} \end{equation}
It will be convenient for our calculations to represent the inverse of the Jacobian in terms of its adjugate and delay evaluation of the determinant until needed. The adjugate matrix is
\begin{sageblock}
A=fun(n,m)(fix(J(n,m).adjoint()))
\end{sageblock}
\begin{equation} \sage{A(n,m)} \end{equation}
The inverse is
\begin{sageblock}
K=fun(n,m)(A(n,m)/detJ(n,m))
\end{sageblock}
\begin{equation} \sage{K(n,m)} \end{equation}
The determinant of the Jacobian is
\begin{sageblock}
Jdet=fun(n,m)(fix(J(n,m).determinant().expand()))
dets = {detJ(n+i,m+j):Jdet(n+i,m+j) for i in range(-2,3) for j in range(-2,3)}
\end{sageblock}
\sage{Jdet(n,m)} \end{equation}
It is $\sage{fix(factor(J(n,m)^(-1)))==K(n,m).subs(detJ(n,m)==Jdet(n,m))}$ that $J(n,m)^{-1}=K(n,m) \text{ where }{\sage{detJ(n,m)}=\operatorname{Jdet}(n,m)}$.
\subsection{Quantum Force}
The Schiff and Poirier expression eq. (18) in 2-D has many more terms than in the 1-D case!
\begin{sageblock}
R=fun(n,m) (vector([ (hbar^2/4/mu)*sum( sum( sum( sum(
DP( K(n,m)[k,i] * K(n,m)[p,j] * DP( DM( K(n,m)[l,j],C[l] ),C[k] ),C[p] )
for p in range(d)) for k in range(d)) for j in range(d)) for l in range(d))
for i in range(d)])
\end{sageblock}
\subsection{Quantum Potential}
\begin{sageblock}
U=fun(n,m)(
sum( sum( sum(
-(hbar^2/4/mu) *
(K(n,m)[k,j] * DM( DP( K(n,m)[l,j],C[l] ),C[k] ) +
1/2 * DP(K(n,m)[l,j],D[l]) * DP(K(n,m)[k,j],C[k]))
for k in range(d)) for j in range(d)) for l in range(d)) )
\end{sageblock}
\begin{dmath}
\sage{ eq20.subs({hbar:1,mu:1}) }
\end{dmath}
\begin{sageblock}
U2=fun(n,m)(
sum( sum( sum( -(hbar^2/4/mu)*(1/2 * DP(K(n,m)[l,j],C[l]) * DP(K(n,m)[k,j],C[k]))
for k in range(d)) for j in range(d)) for l in range(d)) )
\end{sageblock}
\begin{dmath}
\sage{ eq20n2 }
\end{dmath}
\begin{sageblock}
U3=fun(n,m)(
sum( sum( sum( -(hbar^2/4/mu)*(K(n,m)[k,j] * DM( DP( K(n,m)[l,j],C[l] ),C[k] ))
for k in range(d)) for j in range(d)) for l in range(d)) )
\end{sageblock}
\begin{dmath}
\sage{ eq20n3 }
\end{dmath}
It is $\sage{bool(eq20 == eq20n2+eq20n3)}$ that $eq20 = eq20n2+eq20n3$.
In the discretized expressions it will be convenient to replace the $X$ co-ordinates with scalar quantities. The forward and backward difference approximations will then require $2x5x5 = 50$ scalar quantities.
\begin{sageblock}
xyk = [X[i](n+j,m+k)
for j in range(-2,3) for k in range(-2,3) for i in range(d)]
xyv = [var(X[i].name()+str(2+j)+str(2+k))
for j in range(-2,3) for k in range(-2,3) for i in range(d)]
\end{sageblock}
\begin{sageblock}
xnm = X[0](n,m).subs(dict(zip(xyk,xyv)))
ynm = X[1](n,m).subs(dict(zip(xyk,xyv)))
\end{sageblock}
\begin{dmath}
\sage{[xnm,ynm]}
\end{dmath}
\bibliographystyle{bibstyles/utphys}
\bibliography{bibliography}
\end{document}
We can compute the discretized quantum force as the gradient of the discretized quantum potential symbolically. We would like to compare this with the discretization of Poirier's expression for the force.
Let $U(n,m)$ be the potential at $n,m$ with $U2(n,m)$ and $U3(n,m)$ being just the 2nd and 3rd order terms respectively.
\begin{sageblock}
def U(n,m): return eq20.subs({var('n'):n,var('m'):m})
def U2(n,m): return eq20n2.subs({var('n'):n,var('m'):m})
def U3(n,m): return eq20n3.subs({var('n'):n,var('m'):m})
\end{sageblock}
Gradients:
\begin{sageblock}
dets = {detJ(n+i,m+j):Jdet(n+i,m+j) for i in range(-2,3) for j in range(-1,3)}
rrx = -sum(U(n+i,m+j) for i in range(-2,3) for j in range(-2,3)
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rry = -sum([U(n+i,m+j) for i in range(-2,3) for j in range(-2,3)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
\end{sageblock}
Or computing the gradients of the 2nd and 3rd order terms separately:
\begin{sageblock}
rr2x = -sum([U2(n+i,m+j) for i in range(-2,3) for j in range(-2,3)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rr2y = -sum([U2(n+i,m+j) for i in range(-2,3) for j in range(-2,3)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
rr3x = -sum([U3(n+i,m+j) for i in range(-2,3) for j in range(-2,3)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rr3y = -sum([U3(n+i,m+j) for i in range(-2,3) for j in range(-2,3)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
\end{sageblock}
It is $\sage{bool(rr2x.expand()+rr3x.expand() == rrx.expand())}$ that $rrx = rr2x+rr3x$.
It is $\sage{bool(rr2y.expand()+rr3y.expand() == rry.expand())}$ that $rrx = rr2y+rr3y$.
Surprisingly, just like in the 1-D case, the force term from the 3rd order term is exactly -2 times the force term obtained from the 2nd order term so the difference between the force from just the 2nd order term so the force from the full expression for the quantum potential is differs from the 2nd term by only a sign.
It is $\sage{bool(rr3x.expand() == -2*rr2x.expand())}$ that $rr3x = -2 rr2x$.
It is $ \sage{bool(rr3y.expand() == -2*rr2y.expand())}$ that $rr3y = -2 rr2y$.
But unlike the 1-D case, the result for the full expression is not the same as the expression we obtained directly by substituting difference operators for derivatives in Poirier's expression (eq18n) for the quantum force!
\begin{sageblock}
test=dict(zip(xyv,[random() for i in xyv]))
\end{sageblock}
It is $\sage{bool(eq18[0].subs(dets).subs(dict(zip(xyk,xyv))).subs(test)==rrx.subs(test))}$ that $eq18[0] = rrx$.
It is $\sage{bool(eq18[1].subs(dets).subs(dict(zip(xyk,xyv))).subs(test)==rry.subs(test))}$ that $eq18[1] = rry$.
Repeating all of the above using a symmetric difference approximation to the derivatives we find however that the two expressions for the quantum force turn out to be the same.
\begin{sageblock}
@CachedFunction
def J(n,m):
return matrix([[D(E[j],i).subs({var('n'):n,var('m'):m})
for i in range(d)]
for j in range(d)])
@CachedFunction
def A(n,m): return fix(J(n,m).adjoint()).subs({var('n'):n,var('m'):m})
@CachedFunction
def K(n,m): return (A(n,m)/detJ(n,m)).subs({var('n'):n,var('m'):m})
@CachedFunction
def Jdet(n,m): return J(n,m).determinant().expand()
\end{sageblock}
\begin{equation} \sage{J(n,m)} \end{equation}
\begin{equation} \sage{A(n,m)} \end{equation}
\begin{equation} \sage{K(n,m)} \end{equation}
\begin{sageblock}
eq18 = [ (hbar^2/4/mu)*sum( sum( sum( sum(
D( K(n,m)[k,i] * K(n,m)[p,j] * D( D( K(n,m)[l,j],l ),k ),p )
for p in range(d))
for k in range(d))
for j in range(d))
for l in range(d)) for i in range(d)]
eq20 = sum( sum( sum(
-(hbar^2/4/mu) *
(K(n,m)[k,j] * D( D( K(n,m)[l,j],l ),k ) +
1/2 * D(K(n,m)[l,j],l) * D(K(n,m)[k,j],k))
for k in range(d)) for j in range(d)) for l in range(d))
eq20n2 = sum( sum( sum( -(hbar^2/4/mu)*(1/2 * DP(K(n,m)[l,j],l) * DP(K(n,m)[k,j],k))
for k in range(d)) for j in range(d)) for l in range(d))
eq20n3 = sum( sum( sum( -(hbar^2/4/mu)*(K(n,m)[k,j] * DM( DP( K(n,m)[l,j],l ),k ))
for k in range(d)) for j in range(d)) for l in range(d))
\end{sageblock}
\begin{dmath} \sage{eq20} \end{dmath}
\begin{sageblock}
xyk = [X[i](n+j,m+k)
for j in range(-4,5) for k in range(-4,5) for i in range(d)]
xyv = [var(X[i].name()+str(5+j)+str(5+k))
for j in range(-4,5) for k in range(-4,5) for i in range(d)]
xnm = X[0](n,m).subs(dict(zip(xyk,xyv)))
ynm = X[1](n,m).subs(dict(zip(xyk,xyv)))
\end{sageblock}
\begin{dmath}
\sage{[xnm,ynm]}
\end{dmath}
\begin{sageblock}
def U(n,m): return eq20.subs({var('n'):n,var('m'):m})
def U2(n,m): return eq20n2.subs({var('n'):n,var('m'):m})
def U3(n,m): return eq20n3.subs({var('n'):n,var('m'):m})
dets = {detJ(n+i,m+j):Jdet(n+i,m+j) for i in range(-6,7) for j in range(-6,7)}
rrx = -sum(U(n+i,m+j) for i in range(-3,4) for j in range(-3,4)
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rry = -sum([U(n+i,m+j) for i in range(-3,4) for j in range(-3,4)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
rr2x = -sum([U2(n+i,m+j) for i in range(-3,4) for j in range(-3,4)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rr2y = -sum([U2(n+i,m+j) for i in range(-3,4) for j in range(-3,4)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
rr3x = -sum([U3(n+i,m+j) for i in range(-3,4) for j in range(-3,4)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(xnm)
rr3y = -sum([U3(n+i,m+j) for i in range(-3,4) for j in range(-3,4)]
).subs(dets).subs(dict(zip(xyk,xyv))).diff(ynm)
\end{sageblock}
\begin{sageblock}
vals=[RDF(random()) for i in xyv]
test=dict(zip(xyv,vals))
constants = {hbar:0.2,mu:1.0}
\end{sageblock}
It is $\sage{squared(map(lambda x:x.subs(test).subs(constants),array([rr2x,rr2y]) - array([rrx,rry])))<1e-15}$ that $[rrx,rry] = [rr2x,rr2y]+[rr3x,rr3y]$.
The force term from the 3rd order term is still exactly -2 times the force term obtained from the 2nd order term.
It is $\sage{squared(map(lambda x:x.subs(test).subs(constants),array([rr3x,rr3y]) - -2*array([rr2x,rr2y])))<1e-15}$ that $[rr3x,rr3y] = -2 [rr2x,rr2y]$.
But now the full expression is the same as the expression we obtained directly by substituting difference operators for derivatives in Poirier's expression (eq18n) for the quantum force. It is very time consuming to show this symbolically but numerical serve as a practical demonstration.
\begin{sageblock}
ff0=fast_callable(rrx.subs(constants), vars=xyv, domain=RDF)
ff1=fast_callable(rry.subs(constants), vars=xyv, domain=RDF)
def ff(p): return array([ff0(*p),ff1(*p)])
gg0=fast_callable(eq18[0].subs(dets).subs(dict(zip(xyk,xyv))).subs(constants), vars=xyv, domain=RDF)
gg1=fast_callable(eq18[1].subs(dets).subs(dict(zip(xyk,xyv))).subs(constants), vars=xyv, domain=RDF)
def gg(p): return array([gg0(*p),gg1(*p)])
\end{sageblock}
It is $\sage{ abs(ff0(*vals)-gg0(*vals)) < 1.0e-12 and abs(ff1(*vals)-gg1(*vals)) < 1.0e-12 }$ that $eq18 = [rrx,rry]$.
\section{Simulation}
Using the expressions derived above we can generate efficient numerical functions for use in the solution of the equations of motion.
Classical Potential
\begin{sageblock}
P0(x)=-9/(2*cosh(2*x)^2)
\end{sageblock}
\sageplot[width=.5\textwidth]{
plot(P0,(-3,3),axes_labels=['distance','energy'],
axes_labels_size=1,legend_label='potential')
}
Classical Force
\begin{sageblock}
F0(x)= -(18*sinh(2*x))/(cosh(2*x)^3)
\end{sageblock}
\sageplot[width=.5\textwidth]{
plot(F0,(-3,3),axes_labels=['distance','force'],axes_labels_size=1)
}
Quantum Potential
$ \sage{U(n,m).subs(dets).subs(dict(zip(xyk,xyv))).subs(constants).variables()} $
\begin{sageblock}
%ru0=fast_callable(U(n,m).subs(dets).subs(dict(zip(xyk,xyv))).subs(constants),
%vars=xyv, domain=RDF)
%def ru(x): return ru0(*x)
%\end{sageblock}
\bibliographystyle{bibstyles/utphys}
\bibliography{bibliography}
\end{document}