def plot_time_evolve_step_error(Ns, step, dts, log_scale=True): fig, ax = plt.subplots(figsize=(8, 4)) if log_scale: ax.set_yscale("log") for i, N in enumerate(Ns): n = 70 for j, dt in enumerate(dts): l, v = get_eig(N, V, 1) v = v[:, 0] A = step(N, V, dt) a = np.empty(n, dtype=np.complex128) a[0] = inner(v, v) for k in range(1, n): v = A @ v a[k] = inner(v, v) ax.plot(np.arange(n), a, label="$\Delta t / \Delta x^2={:.4f}$".format(dt * N**2), color=cm.viridis((i * 2 + j) / 4)) ax.set_xlabel("number of steps") ax.set_ylabel("$\\langle \psi_n | \psi_n \\rangle $") ax.legend() plt.tight_layout() name = FIG_PATH + "step_error" if log_scale: name += "log" plt.savefig(name + ".pdf")
def plot_eigvals(N, nev): l, v = get_eig(N, V, nev) n = np.arange(nev) + 1 fig, ax = plt.subplots(figsize=(8, 4)) ax.plot(n, l, "o") ax.set_xlabel("$n$") ax.set_ylabel("$E / [2mL/\hbar^2]$") plt.tight_layout() plt.savefig(FIG_PATH + "eigenvals.pdf")
def plot_diff_vals(N, Vrs): n = len(Vrs) diff1 = [] diff2 = [] l0, v0 = get_eig(N, lambda x: V(x, 0, V0), 2) for i in range(n): Vr = Vrs[i] l1, _ = get_eig(N, lambda x: V(x, Vr), 2) H_eff = get_H_eff(N, l0, v0, V, Vr) l2, _ = eig(H_eff) diff1.append(l1[1] - l1[0]) diff2.append(l2[1] - l2[0]) fig, ax = plt.subplots() ax.plot(Vrs, diff1, label="full system") ax.plot(Vrs, diff2, label="effective system") ax.legend() ax.set_ylabel("$\Delta E/ [2mL/\hbar^2]$") ax.set_xlabel("$V_r/ [2mL/\hbar^2]$") plt.show()
def plot_H_eff_vecs(N, Vrs): n = len(Vrs) fig, ax = plt.subplots(2) for i in range(n): Vr = Vrs[i] H_eff = get_H_eff(N, V, Vr) l, v = eig(H_eff) indx = np.argsort(l) v = v[:, indx] l, v2 = get_eig(N, lambda x:V(x, Vr), 2) x = get_x(N) ax[0].plot([0.25, 0.75], abs(v[:, 0])**2, "kx") ax2 = ax[0].twinx() ax2.plot(x, abs(v2[:, 0])**2, color=color(i, n)) ax[1].plot([0.25, 0.75], abs(v[:, 1])**2, "kx") ax3 = ax[1].twinx() ax3.plot(x, abs(v2[:, 1])**2, color=color(i, n)) plt.show()
def plot_superpos(N): l, v = get_eig(N, lambda x: V(x, V0), 2) alpha = np.array([1, 1]) / sqrt(2) x = get_x(N) fig, ax = plt.subplots() ax.plot(x, V(x, V0), "k--") ax.set_ylabel("$E / [2mL/\hbar^2]$") ax.set_xlabel("$x / [L]$") ax.set_title("$N={}$".format(N)) ax2 = ax.twinx() ax2.set_ylabel("$\Psi / [1]$") ax2.plot(x, time_evolve(v, l, 0, alpha), label="$\Psi(x, 0) \in \\bfR$") T = pi / (l[0] - l[1]) ax2.plot(x, time_evolve(v, l, T, alpha).real, label="$\Re(\\Psi(x, T))$") ax2.plot(x, time_evolve(v, l, T, alpha).imag, label="$\Im(\\Psi(x, T))$") ax2.legend() plt.tight_layout() plt.savefig(FIG_PATH + "super_pos.pdf")
def plot_error(Ns): l = roots(f, 0.1, V0) nev = len(l) n = np.arange(1, nev + 1) m = len(Ns) fig, ax = plt.subplots(figsize=(8, 4)) ax.set_xlabel("$n$") ax.set_ylabel("$|E_i-x_i|/x_0$") for i in range(m): N = Ns[i] l2, v = get_eig(N, V, nev) ax.plot(n, abs((l - l2) / l[0]), "x", label="$N={}$".format(Ns[i]), ms=12) ax.legend() plt.tight_layout() plt.savefig(FIG_PATH + "roots_error.pdf")
def plot_eigvecs(N, nev): l, v = get_eig(N, V, nev) x = np.linspace(1 / N, 1 - 1 / N, N - 1) fig, ax = plt.subplots(figsize=(12, 5)) ax.plot(x, V(x), "--k") ax.set_ylabel("$E / [2mL/\hbar^2]$") ax.set_xlabel("$x / [L]$") ax.set_title("$N={}$".format(N)) ax2 = ax.twinx() ax2.set_ylabel("$\Psi / [1]$") for i in range(nev): ax2.plot(x, v[:, i].real, color=cm.viridis(i / nev), label="$\\psi_{}$".format(i)) ax2.legend() plt.savefig(FIG_PATH + "eigenvecs.pdf")
def plot_error(ns, N_max, V): Ns = np.arange(10, N_max + 1) m = len(ns) fig, ax = plt.subplots(1, m, figsize=(12, 3), sharex=True) for i in range(m): n = ns[i] ls = [] for N in Ns: l, v = get_eig(N, V, n) ls.append(l[n - 1]) ls = np.array(ls) ax[i].plot(Ns, abs(ls - (pi * n)**2) / pi**2, label="$|E_{}-(\pi {})^2|/\pi^2$".format(n, n)) C = (Ns[0]**2 * abs(ls[0] - (pi * n)**2) / pi**2) ax[i].plot(Ns, C / Ns**2, "k:", label="${:.3f}/N^2$".format(C)) ax[i].set_ylabel("rel. error") ax[i].set_xlabel("$N$") ax[i].legend() plt.tight_layout() plt.savefig(FIG_PATH + "error.pdf")
def plot_eigvals(Ns, V, nev): n = np.arange(1, nev + 1) m = len(Ns) fig, ax = plt.subplots(m, 2, figsize=(12, 6), sharex=True) for i in range(m): N = Ns[i] l, v = get_eig(N, V, nev) ax[i, 0].plot(n, l, label="$E_n$") ax[i, 0].plot(n, (pi * n)**2, "k--") ax[i, 0].set_ylabel("$E / [2mL/\hbar^2]$") ax[i, 0].set_title("$N={}$".format(N)) ax[i, 0].legend() ax[i, 1].plot(n, abs((l - (pi * n)**2) / pi**2), label="$|E_n-(\pi n)^2|/\pi^2$") ax[i, 1].set_ylabel("rel. error") ax[i, 1].legend() ax[-1, 0].set_xlabel("$n$") ax[-1, 1].set_xlabel("$n$") plt.tight_layout() plt.savefig(FIG_PATH + "values.pdf")
def plot_vecs(N, Vr): l, v = get_eig(N, lambda x: V(x, Vr), 2) x = get_x(N) fig, ax = plt.subplots() v1 = v[:, 0] v2 = v[:, 1] print(inner(v1, V(x, Vr, 0)*v1)) print(inner(v2, V(x, Vr, 0)*v1)) print(inner(v2, V(x, Vr, 0)*v2)) print(inner(v1, V(x, Vr, 0)*v2)) ax.plot(x, v1) ax.plot(x, v2) ax2 = ax.twinx() ax2.plot(x, V(x, Vr), "k--") y1 = np.max(abs(v)) y2 = np.max(abs(V(x, Vr))) # ax.set_ylim(-y1*1.1, y1*1.1) ax2.set_ylim(-y2*1.1, y2*1.1) plt.plot() plt.show()
def plot_time_evolve(N): l, v = get_eig(N, lambda x: V(x, V0), 2) alpha = np.array([1, 1]) / sqrt(2) x = get_x(N) fig, ax = plt.subplots(figsize=(12, 4)) ax.plot(x, V(x, V0), "k--") ax.set_ylabel("$E / [2mL/\hbar^2]$") ax.set_xlabel("$x / [L]$") ax.set_title("$N={}$".format(N)) ax2 = ax.twinx() ax2.set_ylabel("$|\Psi|^2 / [1]$") n = 5 T = pi / (l[0] - l[1]) / n for i in range(n + 1): v_new = time_evolve(v, l, T * i, alpha) label = "$|\\Psi(x, {}T/{})|^2$".format(i, n) ax2.plot(x, abs(v_new)**2, label=label, color=color(i, n)) ax2.legend() plt.tight_layout() plt.savefig(FIG_PATH + "time_evolve.pdf")
def plot_eigvecs(N, V, nev): l, v = get_eig(N, V, nev) x = np.linspace(1 / N, 1 - 1 / N, N - 1) fig, ax = plt.subplots(nev, sharex=True, figsize=(5, 6)) ax[0].set_title("$N={}$".format(N)) for i in range(nev): v_exact = sin(pi * (i + 1) * x) c = 1 / sqrt(v_exact @ v_exact) ax[i].plot(x, v[:, i], "-", color=color(i, nev), label="$\psi_{}(x)$".format(i)) ax[i].plot(x, c * v_exact, "k:", label="$c\sin(2\pi{}x)$".format(i + 1)) ax[i].legend(loc=1) ax[i].set_ylabel("$\psi/[1]$") ax[-1].set_xlabel("$x / [L]$") plt.tight_layout() plt.savefig(FIG_PATH + "vector_N={}.pdf".format(N))