PythonでBloch方程式を可視化する⑤〜周波数掃引〜
前回までで実装したフーリエ変換を周波数を変えて行い,実際の測定に近づけていく.
なお,まだ窓関数は使っていない.
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
N = 1024
time = 10 ** -9
ga = -1.7608 * 10 ** 11
M0 = 1
range_om = 100 # 掃引の点数
d_om = 0.01 # 掃引の間隔
def func(v, t, om, H0, H1, T1, T2):
return [ga*H0*v[1]-v[1]*om-v[1]/T2,
-ga*H0*v[0]+v[0]*om+ga*H1*v[2]-v[1]/T2,
-ga*H1*v[1]-(v[2]-M0)/T1]
T1, T2 = 5 * 10 ** -8, 5 * 10 ** -8
H0, H1 = 3.3 * 10 ** -3, 10 ** -5
v0 = [0, 0, 1]
t = np.arange(0, time, time/N)
spc = [0] * range_om
plt.figure()
for i in range(range_om):
om = (9.5 + d_om * (i - np.floor(range_om/2))) * 10 ** 9
v = odeint(func, v0, t, args=(om, H0, H1, T1, T2))
sp = np.fft.fft(v[:,1])
freq = np.fft.fftfreq(v[:,1].shape[-1])
spc[i] = np.abs(sp)
# plt.plot(freq,np.abs(sp))
for i2 in range(N):
spc_tot = np.sum(spc,axis=0)
plt.plot(freq,spc_tot)
plt.show()
2回のforループでスペクトルの行列生成,および各周波数に対するスペクトルの総和を取っているが,もっと簡単な方法があるような気がする.