Matplotlib - Ошибка в построении 2 значений с одинаковыми размерами - PullRequest
0 голосов
/ 13 октября 2018
def Hamiltonian(alpha,h):

    Sx = np.array([[0,1],[1,0]])
    Sy = np.array([[0,-1j],[1j,0]])
    Sz = np.array([[1,0],[0,-1]])
    I  = np.array([[1,0],[0,1]])

    H = -1*((alpha*np.kron(np.kron(Sx,Sx),I))
       + (alpha*np.kron(np.kron(Sy,Sy),I))
       + (alpha*np.kron(np.kron(I,Sx),Sx))
       + (alpha*np.kron(np.kron(I,Sy),Sy))
       + (h*np.kron(np.kron(I,Sz),I)))

    return H
np.set_printoptions(linewidth=100)
Hamiltonian(1,0.5).real

, который возвращает следующую матрицу (просто введите ее для ясности в том, что я пытаюсь сделать ниже) enter image description here

После определения гамильтониана я хочу искатьэнтропия как функция параметра h.Физика, стоящая за кодом, не имеет значения для этого типа вопросов.

# von Neumann entropy as a function of h and beta - Complete
# Definition of a mixed state: [Thermal Density Matrix used]
h = np.arange(0,2.5,0.1)
beta = 2
for i in range(h.size):
    H = Hamiltonian(1.0, h[i] )
    rho_thermal = expm(-1.0 * beta * H)
    tr = np.trace(rho_thermal)
    rho_thermal = rho_thermal / tr
    np.set_printoptions(linewidth=100)
    eigvals_rho_thermal, eigvecs_rho_thermal = LA.eigh(rho_thermal)
    # Entropy
    s = 0.0
    for i in range(eigvals_rho_thermal.size):
        s += -1.0 * (eigvals_rho_thermal[i] * np.log(eigvals_rho_thermal[i]))
    print(s)
plt.plot(h,s)

Мой вопрос: почему я получаю следующую ошибку: enter image description here

МойКод возвращает 25 значений для s и 25 для h, почему он не будет отображать их?

1 Ответ

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

Вам необходимо сохранить значение s, которое вы получите в каждом цикле где-нибудь, чтобы иметь возможность построить каждый s для каждого h в дальнейшем.В общем, вы можете немного упростить свой код и использовать функцию вместо цикла for.Вот как бы я это сделал.

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import expm

def Hamiltonian(alpha,h):

    Sx = np.array([[0,1],[1,0]])
    Sy = np.array([[0,-1j],[1j,0]])
    Sz = np.array([[1,0],[0,-1]])
    I  = np.array([[1,0],[0,1]])

    H = -1*((alpha*np.kron(np.kron(Sx,Sx),I))
       + (alpha*np.kron(np.kron(Sy,Sy),I))
       + (alpha*np.kron(np.kron(I,Sx),Sx))
       + (alpha*np.kron(np.kron(I,Sy),Sy))
       + (h*np.kron(np.kron(I,Sz),I)))

    return H

# von Neumann entropy as a function of h and beta - Complete
# Definition of a mixed state: [Thermal Density Matrix used]
def get_entropy(beta, h, alpha=1.0):
    H = Hamiltonian(alpha, h)
    rho_thermal = expm(-1.0 * beta * H)
    tr = np.trace(rho_thermal)
    rho_thermal = rho_thermal / tr
    eigvals_rho_thermal, eigvecs_rho_thermal = np.linalg.eigh(rho_thermal)
    # Entropy
    s = -np.sum(eigvals_rho_thermal*np.log(eigvals_rho_thermal))
    return s

h = np.arange(0,2.5,0.1)
beta = 2    
s = [get_entropy(beta, hi) for hi in h]
plt.plot(h,s)

plt.show()

enter image description here

...