Folder full of pertinent coursework
class Schrodinger(object):12def __init__(self, V, start=-1, end=1, npts=100, mass=1.0):3self.m = mass4self.n = npts5self.x = np.linspace(start,end,npts)6self.dx = abs(self.x[1]-self.x[0])7self.__init_laplacian__()89self.Vx = V(self.x)10self.H = (-0.5/self.m)*self.laplace + np.diag(self.Vx)11self.E = np.array([])12self.psi = []1314def __init_laplacian__(self):15M = -2*np.identity(self.n,'d')16for i in xrange(1,self.n):17M[i,i-1] = M[i-1,i] = 118self.laplace = M / self.dx**21920def diagonalize(self):21E,U = np.linalg.eigh(self.H)22psi = []23for i, e in enumerate(E):24psi.append(U[:,i]/np.sqrt(self.dx) + e)25self.E = E26self.psi = psi2728def plot_spectra(self,levels=3):29if not self.psi: return30plt.plot(self.x, self.Vx ,color='k')31for i in xrange(0,levels):32plt.axhline(y=self.E[i],color='k',ls=":")33plt.plot(self.x,self.psi[i])34plt.title("Spectra and Eigenfunctions")35plt.xlabel("Position")36plt.ylabel("Energy")3738def wavefunction(s = Schrodinger, f = lambda x: no.exp(-100*(x-1)**2)):39dt = s.dx40now = f(s.x.astype(complex))41while True:42yield now43now = now - dt*(1j)*np.dot(s.H, now)4445def wave_to_prob(a):46p = (np.conjugate(a)*a).real47return p/p.sum()4849def plot_prob(s, w):50wave_to_prob(w)515253