如何在python

时间:2016-12-15 11:40:24

标签: python matplotlib

我想制作该矩阵的两个第一特征值之差的颜色图。为了做到这一点,首先我定义了一个带有两个参数“x”和“y”的符号矩阵。然后我获得特征向量和特征值(短路)并计算两个第一特征值之间的间隙。最后(我认为这是问题...)我制作一个点X和Y的网格,以便用函数“energy_gap(x,y)”来评估它,将结果存储在Z中然后按顺序使用它做的情节,但它不起作用....任何想法为什么?

import numpy as np
import numpy
import matplotlib.pyplot as plt
from sympy.utilities.lambdify import lambdify
from sympy import symbols

x = symbols("x")
y = symbols("y")
matrix = [[x+2, x,y],[y**2,x,3],[y+4,2,1]]

simbolic_matrix = lambdify((x,y), matrix,'numpy')


def eigen_system(x,y):
    values, vectors = numpy.linalg.eig(np.array(simbolic_matrix(x,y)))
    values_short = np.sort(values)
    vectors_short = vectors[:,values.argsort()]
    return  values_short , vectors_short

def energy_gap(x,y):
    values , vectors = eigen_system(x,y)
    gap = abs(values[1])-abs(values[0])
    return gap

def plot_energy_gap():
    x = np.arange(1.1, 3.0, 0.1)
    y = np.arange(1.1, 3.0, 0.1)
    X, Y = np.meshgrid(x, y)
    Z = energy_gap(X,Y)
    im = plt.imshow(Z, cmap=plt.cm.RdBu,extent=(1.1,3,1.1,3))  
    plt.colorbar(im)  
    plt.show()

plot_energy_gap()

1 个答案:

答案 0 :(得分:0)

好的,经过一些广泛的测试后,我恐怕我得出的结论是numpy的Eigen stuff计算器可以像你正在尝试的矩阵网格一样运行。我能得到的最好的解决方案是手动创建网格:

def plot_energy_gap()
    Z = []
    for x in  np.arange(1.1, 3.0, 0.1):
        Z.append([])
        for y in np.arange(1.1, 3.0, 0.1):
            Z[-1].append(energy_gap(x, y))
    im = plt.imshow(Z, cmap=plt.cm.RdBu,extent=(1.1,3,1.1,3))  
    plt.colorbar(im)  

也许其他人可以对此进行矢量化。 编辑单行版本(忘了):

Z = [[energy_gap(x, y) for y in np.arange(1.1, 3.0, 0.1)] for x in np.arange(1.1, 3.0, 0.1)]]