Created
November 15, 2015 16:43
-
-
Save anonymous/093477c6cffea98fb2f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(a,b,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