aboutsummaryrefslogtreecommitdiff
path: root/hw8/10-3-new.jl
diff options
context:
space:
mode:
Diffstat (limited to 'hw8/10-3-new.jl')
-rw-r--r--hw8/10-3-new.jl90
1 files changed, 90 insertions, 0 deletions
diff --git a/hw8/10-3-new.jl b/hw8/10-3-new.jl
new file mode 100644
index 0000000..fb819b8
--- /dev/null
+++ b/hw8/10-3-new.jl
@@ -0,0 +1,90 @@
+using Plots
+using LinearAlgebra
+
+m = 1
+hbar = 1
+xmin = -6.5
+xmax = 6.5
+N = 2000
+x = collect(range(xmin, stop = xmax, length = N + 1)) # one extra, want 1000 spaces
+dx = x[2] - x[1]
+println("dx = ", dx)
+p = 0.0
+V0 = 2 * p^2 / (2.0 * m)
+sig = 0.25
+x0 = 2.0 # a bit away to not interfere with the walls
+
+# setup the potential barrier
+# V = 0 .* x
+# # println("V = ", length(V))
+# for i in 1:length(V)
+# V[i] = abs(x[i])^n
+# end
+
+# make the initial wavefunction
+psi0 = exp.(-((x[2:end-1] .+ x0) .^ 2) / (2 * sig^2)) .* exp.(1.0im * p * x[2:end-1])
+
+C = sum(abs2.(psi0) .* dx)
+psi0 = psi0 / sqrt(C)
+# plot(x[2:end-1], abs.(psi0), xlabel = "x", ylabel = "Re(psi)", title = "Initial wavefunction", legend = :none)
+
+# # make the Hamiltonian
+# A = (hbar^2 / (2 * m * dx^2))
+# # main diagonal
+# d = A * ones(N - 1) + V[2:end-1] # add potential
+# # upper and lower diagonals
+# dl = (A / -2.0) * ones(N - 2)
+# du = (A / -2.0) * ones(N - 2)
+# H = Tridiagonal(dl, d, du)
+
+# # diagonalize matrix
+# E, psi = eigen(H)
+# psi1 = psi[:, 1]
+
+# print the energy levels
+# println("Energy levels: ", E[1:10])
+
+function get_energy_levels_for_n(n, pot_plot)
+ V = 0 .* x
+ for i in 1:length(V)
+ V[i] = abs(x[i])^n
+ end
+ # plot the potential
+ println("Plotting potential for n = ", n)
+ plot!(pot_plot, x, V, xlabel = "x", ylabel = "V(x)", title = "Potential V(x) = |x|^n", label = "n = $n")
+ println("Calculating energy levels for n = ", n)
+ # make the Hamiltonian
+ A = (hbar^2 / (2 * m * dx^2))
+ # main diagonal
+ d = A * ones(N - 1) + V[2:end-1] # add potential
+ # upper and lower diagonals
+ dl = (A / -2.0) * ones(N - 2)
+ du = (A / -2.0) * ones(N - 2)
+ H = Tridiagonal(dl, d, du)
+
+ println("Diagonalizing matrix for n = ", n)
+
+ # diagonalize matrix
+ E, psi = eigen(H)
+
+ println("Energy levels for n = ", n, ": ", E[1:10])
+ return E
+end
+
+po = plot!()
+energy_levels = []
+n_max = 19
+for n in 1:n_max
+ E = get_energy_levels_for_n(n, po)
+ push!(energy_levels, E)
+end
+savefig(po, "hw8/10-3-potentials.png")
+
+# plot the energy levels
+pl = plot(title = "Energy levels for n = 1 to $n_max", xlabel = "n", ylabel = "Energy")
+for i in 1:5
+ plot!(pl, 1:n_max, [E[i] for E in energy_levels], label = "Energy Level $i", marker = :circle)
+end
+savefig(pl, "hw8/10-3-energy-levels.png")
+
+