In [1]:
from sympy import *
init_printing()
In [4]:
dt = symbols('dt')
Ex,Ey,Ez = symbols('Ex Ey Ez')
Bx,By,Bz = symbols('Bx By Bz')
Vx,Vy,Vz = symbols('Vx Vy Vz')
I = Matrix.eye(3)
# fields at time t
E = Matrix(3,1, [Ex,Ey,Ez])
B = Matrix(3,1, [Bx,By,Bz])
# velocity at time t-
V = Matrix(3,1, [Vx,Vy,Vz])
# Tajima Implicit Method
# v+ = v- + (E + (v+ + v-)/2 x B) dt
# v+ = (1-R dt/2)^{-1} (E dt + (1+R dt/2)v-)
# where R v = v x B
R = Matrix([[0,Bz,-By],[-Bz,0,Bx],[By,-Bx,0]])
M = simplify( (I-R*dt/2).inv() )
A = simplify( M.multiply(I+R*dt/2) )
Av = simplify( A.multiply(V) )
ME = simplify( M.multiply(E) * dt)
vv1 = simplify( Av + ME )
# Boris Method
# v+' = v+ - E dt/2
# v-' = v- + E dt/2
# v+' = v-' + ((v+' + v-')/2 x B) dt
# bt = B dt/2
# v+' = v-' + (v-' + v-' x bt) x 2 bt / (1+bt**2)
vm = V + E*dt/2
bt = B*dt/2
tm = (bt).dot(bt)
u1 = simplify( vm + vm.cross(bt) )
u2 = simplify( u1.cross(B*dt/(1+tm)) )
vv2 = simplify(vm + u2 + E*dt/2)
simplify( vv1 - vv2 )
Out[4]:
In [3]:
vv1
Out[3]:
In [ ]: