python - 如何从矩阵中为某些可变参数获得一致的特征向量?
问题描述
现在的问题是我使用 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 是特征向量必须一致的参数。
解决方案
推荐阅读
- nested - 嵌套数据框交互式 R 降价
- javascript - 异步/延迟 JavaScript 问题
- laravel - Laravel Eloquent 关系从另一个表中获取一列
- angular - 即使成功运行,我的角度组件也没有包含在我的角度模块中
- windows - 如何为 Windows 10 创建一个快捷方式来重命名评论属性或任何属性?
- c# - RedirectToAction() 和 View() 有什么区别
- types - 总和类型的结构类型
- python-3.x - 我如何在更大的列表中搜索列表而不考虑顺序?
- html - Blazor:浏览器不更新 HTML 按钮的样式属性
- python - 从python中的字符串中找到一个特殊字符并删除后面的部分