Beispiel #1
0
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
Beispiel #2
0
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()
Beispiel #3
0
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()