我想用python编写一个脚本,该脚本生成偶数秩为2到10的矩阵(因此步长为2)并计算其特征值。我成功做到了。我能够生成矩阵,其中矩阵a横跨主对角线,而矩阵b沿对角线1离开主对角线,并计算特征值:
import numpy as np
import matplotlib.pyplot as plt
def Huckel(a,b):
for n in range(2,10,2):
huckel_matrix = np.zeros(shape(n,n))
np.fill_diagonal(huckel_matrix,a)
huckel_matrix[np.arange(n-1),np.arange(1,n)] = b
huckel_matrix[np.arange(1,n),np.arange(n-1)] = b
eigen_values = np.linalg.eigvalsh(huckel_matrix)
Huckel(0.0,-1.0)
但是,我也想将这些特征值(y轴)相对于相应的nxn矩阵(x轴)的等级(在给定a = 0.0和b = -1.0的情况下)进行散点图绘制。因此,我想写一条线,将特征值与对应矩阵(2、4、6、8)的等级进行散点图绘制,但我不知道该怎么做。
我是Python的新手,我不确定如何实现这一目标。我认为它应该写在for循环中,但我不知道如何。希望有人能帮助我。
答案 0 :(得分:2)
如果我对您的理解正确,那么您想要一个散点图,其特征值在y轴上,特征值数量在x轴上。
import numpy as np
import matplotlib.pyplot as plt
def Huckel(a,b):
res = []
for n in range(2,10,2):
huckel_matrix = np.zeros((n,n))
np.fill_diagonal(huckel_matrix,a)
huckel_matrix[np.arange(n-1),np.arange(1,n)] = b
huckel_matrix[np.arange(1,n),np.arange(n-1)] = b
eigen_values = np.linalg.eigvalsh(huckel_matrix)
res.append(eigen_values)
return res
fig, ax = plt.subplots()
for eigval in Huckel(0.0,-1.0):
ax.plot([eigval.size] * eigval.size, eigval, 'bo')
答案 1 :(得分:0)
我在这里要小心,因为我不完全了解所需输出的数学原理,但是,您在计算上没有做任何事情。我已经修改了您的代码以存储您的结果,然后您可以按照自己的意愿进行绘图。
import numpy as np
import matplotlib.pyplot as plt
def Huckel(a,b):
huckle_out = []
for n in range(2,10,2):
huckel_matrix = np.zeros(shape= (n,n))
np.fill_diagonal(huckel_matrix,a)
huckel_matrix[np.arange(n-1),np.arange(1,n)] = b
huckel_matrix[np.arange(1,n),np.arange(n-1)] = b
eigen_values = np.linalg.eigvalsh(huckel_matrix)
huckle_out.append(eigen_values)
return huckle_out
my_huck = Huckel(0.0,-1.0)
哪个返回列表:
Out[27]:
[array([-1., 1.]),
array([-1.61803399, -0.61803399, 0.61803399, 1.61803399]),
array([-1.80193774, -1.2469796 , -0.44504187, 0.44504187, 1.2469796 ,
1.80193774]),
array([-1.87938524, -1.53208889, -1. , -0.34729636, 0.34729636,
1. , 1.53208889, 1.87938524])]