1111

 

import numpy as np
import cmath

def ssh_hamiltonian(e,v,w,N):
    H = [[ 0 for i in range(2*N)] for j in range(2*N)]
    for i in range(2*N):
        H[i][i] = e
    for i in range(1,2*N,2):
        H[i-1][i] = v
        H[i][i-1] = v.conjugate()

        if i+1 < 2*N:
            H[i][i+1] = w
            H[i+1][i] = w.conjugate()
    a = np.linalg.eigvals(H)
    print(sorted(a))

    res = []
    for i in range(1,N+1):
        k = i*np.pi/(N+1)
        H01 = v + w.conjugate()*np.exp(-1j*k)
        H10 = v.conjugate() + w*np.exp(1j*k)
        res.append(e+cmath.sqrt(H01*H10))
        res.append(e-cmath.sqrt(H01*H10))
    print(res)

    return H

ssh_hamiltonian(e=0,v=1,w=2,N=5)



# only complex number
def hamiltonian_tri_complex_number_n(A=1,B1=2,B2=3,N=4):
    import time
    start = time.time()
    res = []
    for i in range(1,N+1):
        # print(theta(B))
        k = i*np.pi/(N+1)# - np.pi/2
        # A + 2*sqrt(B*B')* cos k
        res.append(A+2*cmath.sqrt(B1*B2)*np.cos(i*np.pi/(N+1))) ## 这个结果也是对的
        # A + B*e^{ik} + B*e^{-ik}
        # res.append(A+B1*np.exp(1j*k)+B2*np.exp(-1j*k))
    end = time.time()
    print('公式求解值时间为: {} s.'.format(end-start))
    print(sorted(np.array(res)))

    start = time.time()
    H = np.zeros((N,N),dtype="complex")
    for i in range(N):
        if i+1<N:
            H[i][i+1] = B1
            H[i+1][i] = B2
    for i in range(N):
        H[i][i] = A
    a = np.linalg.eigvals(H)
    end = time.time()
    print('严格求解值时间为: {} s.'.format(end-start))
    print(sorted(a))
    return H



def hamiltonian(x1,x2,x3,x4,x5,x6,Nx=4,Ny=4):
    # H = np.zeros((Nx*Ny,Nx*Ny),dtype="complex")
    H = [[ 0 for i in range(Nx*Ny)] for i in range(Nx*Ny)]
    for i in range(Nx):
        for j in range(Ny):
            index = Nx*j+i
            ## x1
            H[index][index] = x1

            ## x4
            ## (i, j) --> (i, j+1)
            if j + 1 < Ny:
                H[index][index+Nx] = x4
                H[index+Nx][index] = x4.conjugate()
                
            ## x2 matrix
            ## (i, j) --> (i+1, j)
            if i + 1 < Nx:
                H[index][index+1] = x2
                H[index+1][index] = x3

            ## x5
            ## (i, j) --> (i+1, j+1)
            if i + 1 < Nx and j + 1 < Ny:
                H[index][index+Nx+1] = x5
                H[index+Nx+1][index] = x5.conjugate()

            ## x6
            ## (i, j) --> (i+1, j-1)
            if i > 0 and j + 1 < Ny:
                H[index][index+Nx-1] = x6
                H[index+Nx-1][index] = x6.conjugate()
    return H


def main():
    x1 = 1
    x2 = 2
    x3 = 3
    x4 = 4 + 1j
    x5 = 0
    x6 = 0
    Nx = 4
    Ny = 4
    Ham = hamiltonian(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=Nx,Ny=Ny)
    a = np.linalg.eigvals(Ham)
    print(sorted(a))
    res = []
    for i in range(1,Nx+1):
        for j in range(1,Ny+1):
            kx = i*np.pi/(Nx+1)
            ky = j*np.pi/(Ny+1)

            H00 = x1 + x4*np.exp(1j*ky) + x4.conjugate()*np.exp(-1j*ky)
            H01 = x2 + x5*np.exp(1j*ky) + x6.conjugate()*np.exp(-1j*ky)
            H10 = x3 + x6*np.exp(1j*ky) + x5.conjugate()*np.exp(-1j*ky)

            tmp = H00 + 2*cmath.sqrt(H01*H10)*np.cos(kx)
            res.append(tmp)
    print(sorted(np.array(res)))
# main()

# x1 = 1
# x2 = 2
# x3 = 3
# x4 = 4
# x5 = 5
# x6 = 5
# Nx = 4
# Ny = 4

# ky = 0
# H00 = x1 + x4*np.exp(1j*ky) + x4.conjugate()*np.exp(-1j*ky)
# H01 = x2 + x5*np.exp(1j*ky) + x6.conjugate()*np.exp(-1j*ky)
# H10 = x3 + x6*np.exp(1j*ky) + x5.conjugate()*np.exp(-1j*ky)
# # hamiltonian_tri_complex_number_n(A=H00,B1=H01,B2=H10,N=4)

 

原文地址:http://www.cnblogs.com/ghzhan/p/16833658.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性