def test_spectrum_esfft(): """ correlation: comparing spectrum from es and fft methods """ # use JC model N = 4 wc = wa = 1.0 * 2 * np.pi g = 0.1 * 2 * np.pi kappa = 0.75 gamma = 0.25 n_th = 0.01 a = tensor(destroy(N), qeye(2)) sm = tensor(qeye(N), destroy(2)) H = wc * a.dag() * a + wa * sm.dag() * sm + \ g * (a.dag() * sm + a * sm.dag()) c_ops = [np.sqrt(kappa * (1 + n_th)) * a, np.sqrt(kappa * n_th) * a.dag(), np.sqrt(gamma) * sm] with warnings.catch_warnings(): warnings.simplefilter("ignore") tlist = np.linspace(0, 100, 2500) corr = correlation_ss(H, tlist, c_ops, a.dag(), a) wlist1, spec1 = spectrum_correlation_fft(tlist, corr) spec2 = spectrum_ss(H, wlist1, c_ops, a.dag(), a) assert_(max(abs(spec1 - spec2)) < 1e-3)
def test_spectrum_esfft(): """ correlation: comparing spectrum from es and fft methods """ # use JC model N = 4 wc = wa = 1.0 * 2 * np.pi g = 0.1 * 2 * np.pi kappa = 0.75 gamma = 0.25 n_th = 0.01 a = tensor(destroy(N), qeye(2)) sm = tensor(qeye(N), destroy(2)) H = wc * a.dag() * a + wa * sm.dag() * sm + \ g * (a.dag() * sm + a * sm.dag()) c_ops = [ np.sqrt(kappa * (1 + n_th)) * a, np.sqrt(kappa * n_th) * a.dag(), np.sqrt(gamma) * sm ] with warnings.catch_warnings(): warnings.simplefilter("ignore") tlist = np.linspace(0, 100, 2500) corr = correlation_ss(H, tlist, c_ops, a.dag(), a) wlist1, spec1 = spectrum_correlation_fft(tlist, corr) spec2 = spectrum_ss(H, wlist1, c_ops, a.dag(), a) assert_(max(abs(spec1 - spec2)) < 1e-3)
def _spectrum_fft(H, c_ops, a, b): times = np.linspace(0, 100, 2500) correlation = qutip.correlation_ss(H, times, c_ops, a, b) frequencies, spectrum = qutip.spectrum_correlation_fft(times, correlation) return spectrum, frequencies
c_ops = [ np.sqrt(kappa * (1 + n_th)) * a, np.sqrt(kappa * n_th) * a.dag(), np.sqrt(gamma) * sm ] """ calculate the correlation function using the mesolve solver, and then fft to obtain the spectrum. Here we need to make sure to evaluate the correlation function for a sufficient long time and sufficiently high sampling rate so that the discrete Fourier transform (FFT) captures all the features in the """ # resulting spectrum tlist = np.linspace(0, 100, 5000) corr = correlation_ss(H, tlist, c_ops, a.dag(), a) wlist1, spec1 = qt.spectrum_correlation_fft(tlist, corr) # calculate the power spectrum using spectrum, which internally uses essolve # to solve for the dynamics (by default) wlist2 = np.linspace(0.25, 1.75, 200) * 2 * np.pi spec2 = qt.spectrum(H, wlist2, c_ops, a.dag(), a) # plot the spectra fig, ax = plt.subplots(1, 1) ax.plot(wlist1 / (2 * np.pi), spec1, "b", lw=2, label="eseries method") ax.plot(wlist2 / (2 * np.pi), spec2, "r--", lw=2, label="me+fft method") ax.legend() ax.set_xlabel("Frequency") ax.set_ylabel("Power spectrum") ax.set_title("Vacuum Rabi splitting") ax.set_xlim(wlist2[0] / (2 * np.pi), wlist2[-1] / (2 * np.pi))