【问题标题】:Strange behaviour of ARPACK for hermitian matrixHermitian 矩阵的 ARPACK 的奇怪行为
【发布时间】:2018-02-08 10:22:32
【问题描述】:

我想以数字方式获得某个厄米矩阵的基态能量(请参阅以下代码中该矩阵的定义)并根据矩阵参数“相位”绘制它。

import scipy.sparse as sparse
import scipy
import numpy
import numpy as np
import math
from scipy.special import binom
import cmath
import sympy
import matplotlib.pyplot as plt
import pylab
from copy import *
from numpy import linalg as LA



M=5#DIMENSION OF THE MATRIX


def tunneling(phase):#HAMILTONIAN MATRIX
    Matrix_hop = [[0 for x in range(M)] for y in range(M)]
    for i in range(M):
            if i+1==M:
                Matrix_hop[i][0] = -1.0
                Matrix_hop[i][i-1] = -1.0
        else:
                Matrix_hop[i][i+1] = -1.0
                Matrix_hop[i][i-1] = -1.0
    Matrix_hop[0][M-1]=-1.0*cmath.exp(1j*phase)
    Matrix_hop[M-1][0]=-1.0*cmath.exp(-1j*phase)
    return Matrix_hop 

def eigen_system(H):
    values, vectors = sparse.linalg.eigs(H,2,which='SR') #ARPACK!!
    energy_ground = values[0]
    return  vectors[:,0], energy_ground


init = 0.0
points = 1000  
final_value = 2*math.pi
steep = (final_value-init)/points
list_values_phase = np.arange(init,final_value,steep)
f1 = open("ground_state_energy.dat", "w")
for i in list_values_phase:
    phase = i
    f1.write(str(phase)+" ")
    H = np.asarray(tunneling(i))
    f1.write(str(np.real(eigen_system(H)[1]))+" ")
    f1.write("\n")
f1.close()



datalist = pylab.loadtxt("ground_state_energy.dat")
pylab.plot( datalist[:,0], datalist[:,1],label="ground state" )
pylab.legend()
pylab.xlabel("phase")
pylab.ylabel("Energy")
pylab.show()

我在 Python 中将 ARPACK 用于 Hermitian 矩阵,这是使用 sparse.linalg.eigs 完成的。问题是,如下图所示,基态能量没有正确计算,有很多峰值,这意味着基态没有正确找到。实际上似乎对于这个峰值,ARPACK 没有找到基态并且它获得了第一个激发态。 这是一个非常奇怪的问题,因为我使用的这个矩阵(来自量子力学)可以通过分析和使用 Mathematica 来解决,并且在 Python 中使用 ARPACK 不起作用。有人知道为什么会发生这种情况以及如何解决?谢谢

我正在使用 scipy 0.19.1 的最新版本

【问题讨论】:

    标签: python scipy eigenvalue arpack


    【解决方案1】:

    在这个函数中

    def eigen_system(H):
        values, vectors = sparse.linalg.eigs(H,2,which='SR') #ARPACK!!
        energy_ground = values[0]
        return  vectors[:,0], energy_ground
    

    你找到前两个特征值,然后取第一个。 eigs 函数不保证它找到的特征值是有序的,有时第一个不是最小的。

    与其找两个最小的,不如只找最小的?

        values, vectors = sparse.linalg.eigs(H, 1, which='SR')  # ARPACK!!
    

    当我做出改变时,我得到了这个情节:

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2018-10-12
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多