aboutsummaryrefslogtreecommitdiff
path: root/hw8/10-3-new.jl
blob: 42e71624bd2eb4809d5ca3bf31ac49a6728be679 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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]

C = sum(abs2.(psi0) .* dx)
psi0 = psi0 / sqrt(C)

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")