首页 > 解决方案 > 如何从矩阵中为某些可变参数获得一致的特征向量?

问题描述

假设我们有一个 2 x 2 矩阵, https://i.stack.imgur.com/Z11Wu.png

特征向量可以是这个 https://i.stack.imgur.com/NRJKI.png

或这个 https://i.stack.imgur.com/NBWrR.png

在哪里, https://i.stack.imgur.com/8ACFV.png

现在的问题是我使用 NumPy 来获取 x 和 y 的几个值的特征值和特征向量。对于给定的 x 和 y,有时 NumPy 会给出第一组特征向量,对于 x 和 y 的另一个值,它会给出其他特征向量集。这给出了不同的结果。

我在这里附上代码,

import numpy as np
from numpy import pi, sqrt
import numpy.linalg as lg
import matplotlib.pyplot as plt

def Matrix(x, y):
    arr = np.array([[0, x - 1.j*y],
                    [x + 1.j*y, 0]])
    return arr

def diagonalization(x, y):
    eigenValues, eigenVectors = lg.eig(Matrix(x, y))
    eigenval, evec = lg.eigvals(Matrix(x, y))
    idx = eigenValues.argsort()[::-1]   
    eigenValues = eigenValues[idx]
    eigenVectors = eigenVectors[:,idx]        #eigen vectors
    return eigenVectors
    
def analytical_eigenvectors(x, y):
    vec1 = (1/sqrt(2)) * np.array([1, (x + 1.j * y)/(abs(x + 1.j * y))])
    vec2 = (1/sqrt(2)) * np.array([-1, (x + 1.j * y)/(abs(x + 1.j * y))])    
    return vec1, vec2

def Berry_phase_from_analytical_eigen_vectors():
    circ_step = 1001
    circ_center = np.array([0, 0])
    circ_radius = 0.05
    vec_up_array = np.zeros((circ_step, 2), dtype = complex)
    vec_down_array = np.zeros((circ_step, 2), dtype = complex)
    
    for i in range(circ_step):
        ang = 2.0*np.pi*float(i)/float(circ_step-1)
        
        pt = np.array([np.cos(ang)*circ_radius,np.sin(ang)*circ_radius])
        pt += circ_center
        
        vec_up_array[i], vec_down_array[i] = analytical_eigenvectors(pt[0], pt[1])
        
    arr1, arr2 = np.ones((circ_step)), np.ones((circ_step))
    for i in range(circ_step):
        if i == circ_step - 1:
            j = 0
        else:
            j = i+1
        val1 = np.dot(vec_up_array[i], vec_up_array[j].conj())
        val2 = np.dot(vec_down_array[i], vec_down_array[j].conj())
        arr1[i], arr2[i] = -val1.imag, -val2.imag
    print("Berry phase from analytical eigenvectors are as follows ")
    print("  for upper energy equals    : ", round(sum(arr1)/pi, 2), 'times pi')
    print("  for lower energy equals    : ", round(sum(arr2)/pi, 2), 'times pi')
    print()
    
def Berry_phase_from_diagonalized_eigen_vectors():
    circ_step = 1001
    circ_center = np.array([0, 0])
    circ_radius = 0.05
    vec_up_array = np.zeros((circ_step, 2), dtype = complex)
    vec_down_array = np.zeros((circ_step, 2), dtype = complex)
    
    for i in range(circ_step):
        ang = 2.0*np.pi*float(i)/float(circ_step-1)
        
        pt = np.array([np.cos(ang)*circ_radius,np.sin(ang)*circ_radius])
        pt += circ_center
        
        vec_up_array[i], vec_down_array[i] = diagonalization(pt[0], pt[1])
        
    arr1, arr2 = np.ones((circ_step)), np.ones((circ_step))
    for i in range(circ_step):
        if i == circ_step - 1:
            j = 0
        else:
            j = i+1
        val1 = np.dot(vec_up_array[i], vec_up_array[j].conj())
        val2 = np.dot(vec_down_array[i], vec_down_array[j].conj())
        arr1[i], arr2[i] = -val1.imag, -val2.imag
    print("Berry phase from diagonalized eigenvectors are as follows ")
    print("  for upper energy equals    : ", round(sum(arr1)/pi, 2), 'times pi')
    print("  for lower energy equals    : ", round(sum(arr2)/pi, 2), 'times pi')
    print()

if __name__ == '__main__':
    Berry_phase_from_analytical_eigen_vectors()
    Berry_phase_from_diagonalized_eigen_vectors()

在这里,我试图计算 Berry 阶段。当我使用解析表达式时,它会给出正确的结果 pi。当我使用函数对角化的数值特征向量时,它给出了错误的结果。原因我前面已经讲过了,有什么办法可以解决这个问题吗?这里 x 和 y 是特征向量必须一致的参数。

标签: pythonnumpy

解决方案


推荐阅读