根据特征值的数量(n)绘制n x n个矩阵的特征值

时间:2018-11-15 20:01:58

标签: python python-3.x

我想用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循环中,但我不知道如何。希望有人能帮助我。

2 个答案:

答案 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')

Eigenvalues by matrix size

答案 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])]