def femharmosc(n=128,hL=6.0,k=1.0): doplot = False # hL stands for half-L, since I want the potential to go between +/- L/2 L = 2*hL dx = L/float(n) X = [-hL+dx*i for i in range(1,n)] T = Tfem(n,L) S = Sfem(n,L) V = zeros((n-1,n-1),'d') for i in range(n-1): xi = X[i] V[i,i] = 0.5*k*(dx**3/15. + 2*dx*xi**2/3.) if i < n-2: V[i,i+1] = V[i+1,i] = 0.5*k*(dx**3/20. + dx**2*xi/6. + dx*xi**2/6.) eval,evec = geigh(T+V,S) print eval[:6] if doplot: Xx,Ex,Vx = Exact(100,hL) print eval[:min(5,n)] phase0 = sign(evec[5,0])/sign(Vx[5,0]) plot(X,phase0*evec[:,0],'bo',label="0 FEM/32") plot(Xx,Vx[:,0],'b-',label="0 Exact") phase1 = sign(evec[5,1])/sign(Vx[5,1]) plot(X,phase1*evec[:,1],'go',label="1 FEM/32") plot(Xx,Vx[:,1],'g-',label="1 Exact") title("Harmonic oscillator wave functions") xlabel("x") legend() savefig("/Users/rmuller/Documents/tex/fem-pbox/fem-harmosc.eps") show() return
def main(n=10,**kwargs): xmax = kwargs.get('xmax',2.0) xmin = kwargs.get('xmin',-xmax) small = kwargs.get('small',1e-10) L = xmax-xmin dx = L/float(n) Xdvr,Edvr,Udvr = dvr(xmax=xmax,xmin=xmin) X = [xmin+i*dx for i in range(1,n)] T = Tfem(n,L) S = Sfem(n,L) V = zeros((n-1,n-1),'d') for i in range(n-1): xi = X[i] ax = abs(xi) V[i,i] = 1 # Commented out since it wouldn't compile: # if xi > dx: # V[i,i] = # if abs(xi) > tol: # V[i,i] += 4* # V[i,i] = -2*ax/dx \ # + pow((dx-ax)/dx,2)*(loga(xi)-loga(xi-dx)) \ # + pow((dx+ax)/dx,2)*(loga(xi+dx)-loga(xi)) #if i < n-2: # V[i,i+1] = V[i+1,i] = (2*ax+dx)/(2*dx) + ax*(dx+ax)/(dx*dx) *\ # (loga(xi+dx)-loga(xi)) E,U = geigh(T+V,S) print E[:4] print Edvr[:4] print X plot(Xdvr,abs(Udvr[:,0]),'b-') plot(X,abs(U[:,0]),'bo') show()
def main(n=30,**kwargs): L = kwargs.get('L',5.0) Z = kwargs.get('Z',1.0) tol = kwargs.get('tol',1e-5) dx = L/float(n) X = [i*dx for i in range(1,n)] T = Tfem(n,L) S = Sfem(n,L) V = zeros((n-1,n-1),'d') for i in range(n-1): xi = X[i] V[i,i] = Z + Z*pow((xi+dx)/dx,2)*log(xi+dx) if abs(xi) > tol: V[i,i] += 4*Z*xi*log(xi)/dx if abs(xi-dx) > tol: V[i,i] += Z*pow((xi-dx)/dx,2)*log(xi-dx) E,U = geigh(T+V,S) plot(X,U[:,0]) # Exact solutions, for comparison E10,Psi10 = ExactH(1,0) plot(X,[Psi10(x) for x in X],'b-') print E[0],E10 # DVR solutions, for comparison #E10dvr,Psi10dvr = DVR(X,1,0) #plot(X,Psi10dvr,'bo') show()