Skip to content

Instantly share code, notes, and snippets.

@coralmw
Forked from anonymous/gist:093477c6cffea98fb2f1
Last active November 15, 2015 16:48
Show Gist options
  • Save coralmw/013c1b903ffb47783b5d to your computer and use it in GitHub Desktop.
Save coralmw/013c1b903ffb47783b5d to your computer and use it in GitHub Desktop.
import pylab
from Tkinter import *
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import numpy as np
class ParticleMotion:
def __init__(self, master):
frame = Frame(master)
frame.grid(column = 0, row = 0)
frame.grid()
self.makeInputs(frame)
self.makeOutputs(frame)
self.makePlot(frame)
self.Ex = (self.eex.get())
self.Ey = (self.eey.get())
self.Ez = (self.eez.get())
self.Bx = (self.ebx.get())
self.By = (self.eby.get())
self.Bz = (self.ebz.get())
self.m = (self.em.get()) # Mass of the particle
self.q = (self.eq.get()) # Charge
self.x1 = (self.ex1.get()) # initial position x
self.y1 = (self.ey1.get()) # initial position y
self.z1 = (self.ez1.get()) # initial position z
self.vx = (self.evx.get()) # initial velocity vx
self.vy = (self.evy.get()) # initial velocity vy
self.vz = (self.evz.get()) # initial velocity vz
self.dt = (self.edt.get())
self.t = (self.et.get())
def makePlot(self, frame):
self.fig = Figure(figsize=(10,8), dpi=100)
self.canvas = FigureCanvasTkAgg(self.fig, frame)
self.canvas.show()
self.canvas.get_tk_widget().grid(column = 1, row = 0)
self.toolbar = NavigationToolbar2TkAgg(self.canvas, frame)
self.toolbar.update()
self.toolbar.grid(column = 1, row = 7)
def makeInputs(self, frame):
InputFrame = Frame(frame)
InputFrame.grid(column = 0, row = 0)
self.lbln = Label(InputFrame, text = "Set a value for Ex", justify=LEFT)
self.lbln.grid(column = 0, row = 0)
self.eex = Entry(InputFrame)
self.eex.insert(0, "0.0")
self.eex.grid(column = 1, row = 0)
self.lbln = Label(InputFrame, text = "Set a value for Ey", justify=LEFT)
self.lbln.grid(column = 0, row = 1)
self.eey = Entry(InputFrame)
self.eey.insert(0, "2.0")
self.eey.grid(column = 1, row = 1)
self.lbln = Label(InputFrame, text = "Set a value for Ez", justify=LEFT)
self.lbln.grid(column = 0, row = 2)
self.eez = Entry(InputFrame)
self.eez.insert(0, "0.0")
self.eez.grid(column = 1, row = 2)
self.lbln = Label(InputFrame, text = "Set a value for Bx", justify=LEFT)
self.lbln.grid(column = 0, row = 3)
self.ebx = Entry(InputFrame)
self.ebx.insert(0, "0.0")
self.ebx.grid(column = 1, row = 3)
self.lbln = Label(InputFrame, text = "Set a value for By", justify=LEFT)
self.lbln.grid(column = 0, row = 4)
self.eby = Entry(InputFrame)
self.eby.insert(0, "0.0")
self.eby.grid(column = 1, row = 4)
self.lbln = Label(InputFrame, text = "Set a value for Bz", justify=LEFT)
self.lbln.grid(column = 0, row = 5)
self.ebz = Entry(InputFrame)
self.ebz.insert(0, "4.0")
self.ebz.grid(column = 1, row = 5)
self.lbln = Label(InputFrame, text = "Set a value for m", justify=LEFT)
self.lbln.grid(column = 0, row = 6)
self.em = Entry(InputFrame)
self.em.insert(0, "2.0")
self.em.grid(column = 1, row = 6)
self.lbln = Label(InputFrame, text = "Set a value for q", justify=LEFT)
self.lbln.grid(column = 0, row = 7)
self.eq = Entry(InputFrame)
self.eq.insert(0, "5.0")
self.eq.grid(column = 1, row = 7)
self.lbln = Label(InputFrame, text = "Set a value for x0", justify=LEFT)
self.lbln.grid(column = 0, row = 8)
self.ex1 = Entry(InputFrame)
self.ex1.insert(0, "0.0")
self.ex1.grid(column = 1, row = 8)
self.lbln = Label(InputFrame, text = "Set a value for y0", justify=LEFT)
self.lbln.grid(column = 0, row = 9)
self.ey1 = Entry(InputFrame)
self.ey1.insert(0, "0.0")
self.ey1.grid(column = 1, row = 9)
self.lbln = Label(InputFrame, text = "Set a value for z0", justify=LEFT)
self.lbln.grid(column = 0, row = 10)
self.ez1 = Entry(InputFrame)
self.ez1.insert(0, "0.0")
self.ez1.grid(column = 1, row = 10)
self.lbln = Label(InputFrame, text = "Set a value for vx", justify=LEFT)
self.lbln.grid(column = 0, row = 11)
self.evx = Entry(InputFrame)
self.evx.insert(0, "20.0")
self.evx.grid(column = 1, row = 11)
self.lbln = Label(InputFrame, text = "Set a value for vy", justify=LEFT)
self.lbln.grid(column = 0, row = 12)
self.evy = Entry(InputFrame)
self.evy.insert(0, "10.0")
self.evy.grid(column = 1, row = 12)
self.lbln = Label(InputFrame, text = "Set a value for vz", justify=LEFT)
self.lbln.grid(column = 0, row = 13)
self.evz = Entry(InputFrame)
self.evz.insert(0, "2.0")
self.evz.grid(column = 1, row = 13)
self.lbln = Label(InputFrame, text = "Set a value for dt", justify=LEFT)
self.lbln.grid(column = 0, row = 14)
self.edt = Entry(InputFrame)
self.edt.insert(0, "0.001")
self.edt.grid(column = 1, row = 14)
self.lbln = Label(InputFrame, text = "Set a value for t0", justify=LEFT)
self.lbln.grid(column = 0, row = 15)
self.et = Entry(InputFrame)
self.et.insert(0, "0.0")
self.et.grid(column = 1, row = 15)
def euler(self):
self.Ex = (self.eex.get())
self.Ey = (self.eey.get())
self.Ez = (self.eez.get())
self.Bx = (self.ebx.get())
self.By = (self.eby.get())
self.Bz = (self.ebz.get())
self.m = (self.em.get()) # Mass of the particle
self.q = (self.eq.get()) # Charge
self.x1 = (self.ex1.get()) # initial position x
self.y1 = (self.ey1.get()) # initial position y
self.z1 = (self.ez1.get()) # initial position z
self.vx = (self.evx.get()) # initial velocity vx
self.vy = (self.evy.get()) # initial velocity vy
self.vz = (self.evz.get()) # initial velocity vz
self.dt = (self.edt.get())
self.t = (self.et.get())
self.d = []
self.e = []
self.f = []
while self.t < 10: # trace path until time reaches value e.g. 10
self.Fx = self.q * (self.Ex + (self.vy * self.Bz) - (self.vz * self.By) )
self.Fy = self.q * (self.Ey - (self.vx * self.Bz) + (self.vz * self.Bx) )
self.Fz = self.q * (self.Ez + (self.vx * self.By) - (self.vy * self.Bx) )
self.vx = self.vx + self.Fx/self.m * self.dt # Acceleration = F/m; dv = a.dt
self.vy = self.vy + self.Fy/self.m * self.dt
self.vz = self.vz + self.Fz/self.m * self.dt
self.x = self.x + self.vx * self.dt
self.y = self.y + self.vy * self.dt
self.z = self.z + self.vz * self.dt
self.d.append(x)
self.e.append(y)
self.f.append(z)
self.t += self.dt
ax = Axes3D(self.fig)
ax.plot3D(self.d,self.e,self.f, color='green', label='path')
ax.set_title("Path of charged particle under influence of electric and magnetic fields(Euler)")
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
self.canvas.show()
def RK4(self):
self.Ex = (self.eex.get())
self.Ey = (self.eey.get())
self.Ez = (self.eez.get())
self.Bx = (self.ebx.get())
self.By = (self.eby.get())
self.Bz = (self.ebz.get())
self.m = (self.em.get()) # Mass of the particle
self.q = (self.eq.get()) # Charge
self.x1 = (self.ex1.get()) # initial position x
self.y1 = (self.ey1.get()) # initial position y
self.z1 = (self.ez1.get()) # initial position z
self.vx = (self.evx.get()) # initial velocity vx
self.vy = (self.evy.get()) # initial velocity vy
self.vz = (self.evz.get()) # initial velocity vz
self.dt = (self.edt.get())
self.t = (self.et.get())
self.a = []
self.b = []
self.c = []
while self.t < 10: # trace path until time reaches value e.g. 10
k1x = velocx(self.vy, self.vz)
k2x = velocx(self.vy + (1/2.0)*k1x, self.vz + (1/2.0)*k1x)
k3x = velocx(self.vy + (1/2.0)*k2x, self.vz + (1/2.0)*k1x)
k4x = velocx(self.vy + k3x, self.vz + k3x)
self.vx += (1.0/6.0)*(k1x + 2*k2x + 2*k3x + k4x)
self.x1 += self.vx *self.dt
k1y = velocy(self.vx, self.vz)
k2y = velocy(self.vx + (1/2.0)*k1y, self.vz + (1/2.0)*k1y)
k3y = velocy(self.vx + (1/2.0)*k2y, self.vz + (1/2.0)*k1y)
k4y = velocy(self.vx + k3y, self.vz + k3y)
self.vy += (1.0/6.0)*(k1y + 2*k2y + 2*k3y + k4y)
self.y1 += self.vy*self.dt
k1z = velocz(self.vx, self.vy)
k2z = velocz(self.vx + (1/2.0)*k1z, self.vy + (1/2.0)*k1z)
k3z = velocz(self.vx + (1/2.0)*k2z, self.vy + (1/2.0)*k1z)
k4z = velocz(self.vx + k3z, self.vy + k3z)
self.vz += (1.0/6.0)*(k1z + 2*k2z + 2*k3z + k4z)
self.z1 += self.vz*self.dt
self.a.append(self.x1)
self.b.append(self.y1)
self.c.append(self.z1)
self.t += self.dt
ax = Axes3D(self.fig)
ax.plot3D(self.a,self.b,self.c, color='green', label='path')
ax.set_title("Path of charged particle under influence of electric and magnetic fields(RK4)")
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
self.canvas.show()
print(self.Ex,
self.Ey,
self.Ez,
self.Bx,
self.By,
self.Bz,
self.m,
self.q,
self.x1,
self.y1,
self.z1,
self.vx,
self.vy,
self.vz,
self.dt,
self.t,
self.a,
self.b,
self.c)
def makeOutputs(self, frame):
OutputFrame = Frame(frame)
OutputFrame.grid(column = 0, row = 16)
self.bt = Button(OutputFrame, text="GO RK4", width=10, command=self.RK4)
self.bt.grid(column = 1, row = 0)
self.bE= Button(OutputFrame, text="GO EULER", width=10, command=self.euler)
self.bE.grid(column = 1, row = 1)
root = Tk()
test = ParticleMotion(root)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment