Вычисление собственных значений матрицы как функции параметра - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь определить собственные значения матрицы 6x6 как функцию одного параметра, который я назвал «e».Как вы можете видеть из кода, я оцениваю собственные значения для диапазона значений в «отстройке».Я хочу построить эти 6 собственных значений как функцию этого параметра расстройки.Однако из-за того, что алгоритм linalg.eigh () возвращает собственные значения в порядке возрастания, информация о том, какое собственное значение соответствует тому, какой собственный вектор теряется.Так, например, горизонтальные линии при энергии 100 и -100 должны быть одного цвета, потому что они должны принадлежать одному и тому же собственному вектору.Но я просто сохранил собственные значения из linalg.eigh () в порядке их получения.И этот порядок не связан с собственными векторами, поэтому они делятся на разные цвета.Итак, мой вопрос, как мне отслеживать, какое собственное значение принадлежит какому собственному вектору?Прошу прощения, если это не ясно, у меня возникли трудности с пониманием проблемы самостоятельно.

from scipy import linalg as la
ez = 100
dez = 14
t = 10
U = 1000
e=0
hc=np.zeros([6,6])
hc[0,0]=-ez
hc[1,1]=-dez/2;hc[1,4:6]=t
hc[2,2]=dez/2;hc[3,4:6]=-t
hc[3,3]=ez
hc[4,1]=t;hc[4,2]=-t;hc[4,4] = U-e
hc[5,1]=t;hc[5,2]=-t;hc[5,5]=U+e
detuning=np.arange(-1500,1500,10)
Energy = np.zeros((6,len(detuning)))
for i, ep in enumerate(detuning):
    e = ep
    hc=np.zeros([6,6])
    hc[0,0]=-ez
    hc[1,1]=-dez/2;hc[1,4:6]=t
    hc[2,2]=dez/2;hc[3,4:6]=-t
    hc[3,3]=ez
    hc[4,1]=t;hc[4,2]=-t;hc[4,4] = U-e
    hc[5,1]=t;hc[5,2]=-t;hc[5,5]=U+e
    w,v = la.eigh(hc)
    Energy[:,i] = w
for i in np.arange(6):

    plt.plot(detuning,Energy[i,:],  label = i)
plt.legend()
plt.xlabel("$\epsilon (\mu$eV)",fontsize=15)
plt.ylabel("Energy ($\mu$eV)",fontsize=15)

plt.ylim([-200,200])
plt.show()

дает enter image description here plt.show ()

1 Ответ

0 голосов
/ 11 октября 2018

Это должно работать для вашей матрицы hc

ez = 100
dez = 14
t = 10
U = 1000
e=0
hc=np.zeros([6,6])
hc[0,0]=-ez
hc[1,1]=-dez/2;hc[1,4:6]=t
hc[2,2]=dez/2;hc[3,4:6]=-t
hc[3,3]=ez
hc[4,1]=t;hc[4,2]=-t;hc[4,4] = U-e
hc[5,1]=t;hc[5,2]=-t;hc[5,5]=U+e

Тогда

e_vals, e_vecs = la.eig(hc)

У вас есть как собственные значения, так и собственные векторы.

e_vals
array([ 100.        +0.j,   -7.19857058+0.j, 1000.19857058+0.j,
       1000.        +0.j, -100.        +0.j,    7.        +0.j])
e_vecs
array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  1.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00, -9.99899724e-01,  1.40379443e-02,
        -1.80074450e-31,  0.00000000e+00,  1.41795299e-02],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  9.99798653e-01],
       [ 1.00000000e+00,  1.85217641e-03, -1.57065317e-02,
         2.01599682e-31,  0.00000000e+00,  2.13455289e-03],
       [ 0.00000000e+00,  9.92753319e-03,  7.06949871e-01,
         7.07106781e-01,  0.00000000e+00,  9.92567093e-03],
       [ 0.00000000e+00,  9.92753319e-03,  7.06949871e-01,
        -7.07106781e-01,  0.00000000e+00,  9.92567093e-03]])
...