2016-12-15 2 views
2

Я хочу сделать цветной график разности двух первых собственных значений этой матрицы. Для этого сначала я определил символическую матрицу с двумя параметрами «x» и «y». Тогда я получаю собственные векторы и собственные значения (закороченные) и вычисляю пробел между двумя первыми собственными значениями. Наконец (и я думаю, что вот проблема ...) Я делаю сетку точек X и Y, чтобы оценить ее с помощью функции «energy_gap (x, y)», сохраняющей результат в Z, а затем используя это в порядке делать сюжет, но он не работает ... Любая идея, почему?как сделать график плотности собственных значений символьной матрицы в python

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

Хорошо, после некоторого обширного тестирования, я боюсь, что я пришел к выводу, что numpy сек Эйген материал калькулятор может работать на сетке матриц, как вы пытаетесь. Лучшим решением, которое я мог бы получить, было создание сетчатой ​​структуры:

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) 

Возможно, кто-то другой это может проголосовать. EDIT версии одна строка (забыл):

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)]] 
+0

О! Благодаря! Теперь работает очень хорошо. – Joe

Смежные вопросы