#!/usr/bin/env julia """Find eigenstates and eigenenergies of 1-D quantum problems""" using LinearAlgebra using Plots #println("\nLattice Laplacian operator") #println(D) function potential(x, n) """ The potential energy""" #return 0.0 # particle in a box #return 0.5 * x^2 # SHO with the spring constant k = 1 #return -6.0 * x^2 + 8.0 * x^6 # potential with zero ground state energy #return 0.1 * x^4 - 2.0 * x^2 + 0.0 * x # double-well potential # return 8 * x^6 - 8 * x^4 - 4 * x^2 + 1 # another double-well potential return abs(x)^n end #println("\nMatrix elements of Hamiltonian = ") #println(H) function map_n_to_energies(n) N = 1000 # number of lattice points L = 20.0 # x runs from -L/2 to L/2 dx = L / N D = zeros(N, N) # discrete laplacian operator V = zeros(N, N) # potential for i in 1:N D[i, i] = -2.0 end for i in 1:N-1 D[i, i+1] = 1.0 D[i+1, i] = 1.0 end for i in 1:N x = (i + 0.5) * dx - 0.5 * L # coordinates of lattice points V[i, i] = potential(x, n) end H = -0.5 * dx^(-2.0) * D + V # Hamiltonian. Here m = hbar = 1 e, v = eigen(H) # diagonalize Hamiltonian println("\n n = ", n) println("Ground state energy = ", e[1]) println("1st excited state energy = ", e[2]) println("2nd excited state energy = ", e[3]) println("3rd excited state energy = ", e[4]) println("4th excited state energy = ", e[5], "\n") return e end n_s = collect(0:1:18) n_to_e = [map_n_to_energies(n) for n in n_s] # plot e[0] for all N ground_state = [] excited_1 = [] excited_2 = [] excited_3 = [] for i in 1:length(n_to_e) push!(ground_state, n_to_e[i][1]) push!(excited_1, n_to_e[i][2]) push!(excited_2, n_to_e[i][3]) push!(excited_3, n_to_e[i][4]) end plot(ground_state, label = "groud state energy for n", xlabel = "n (level)", ylabel = "energy", title = "excited energy levels for V(n) = abs(x)^n", marker = :circle) plot!(excited_1, label = "1st excited state", marker = :circle) plot!(excited_2, label = "2nd excited state", marker = :circle) plot!(excited_3, label = "3rd excited state", marker = :circle) # plot the energies for an inifinite square well as a horizontial line # function excited_state_to_energy_inf_square_well(n) # return n^2 * pi^2 / 2 # end # ground_state_inf_square_well = [excited_state_to_energy_inf_square_well(1) for i in 1:length(n_s)] # excited_1_inf_square_well = [excited_state_to_energy_inf_square_well(2) for i in 1:length(n_s)] # excited_2_inf_square_well = [excited_state_to_energy_inf_square_well(3) for i in 1:length(n_s)] # excited_3_inf_square_well = [excited_state_to_energy_inf_square_well(4) for i in 1:length(n_s)] # plot!(ground_state_inf_square_well, label = "ground state energy for infinite square well") # plot!(excited_1_inf_square_well, label = "1st excited state for infinite square well") # plot!(excited_2_inf_square_well, label = "2nd excited state for infinite square well") # plot!(excited_3_inf_square_well, label = "3rd excited state for infinite square well") savefig("hw8/10-3.png") # gs(x) = exp(-0.5 * x^2) # Gaussian that is exact ground state of SHO # plot(potential) # plot(v[:, 1]) #plot(v[:,2]) # plot(gs) #= eList = zeros(0) for i in 1:20 push!(eList, e[i]) end bar(eList, orientation = :horizontal) =#