我想制作该矩阵的两个第一特征值之差的颜色图。为了做到这一点,首先我定义了一个带有两个参数“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()
答案 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)]]