2016-12-15 10 views
2

その行列の2つの最初の固有値の差のカラープロットを作成したいと思います。これを行うために、最初に、2つのパラメータ "x"と "y"を持つ記号行列を定義しました。次に、固有ベクトルと固有値(短絡)を取得し、2つの最初の固有値との間のギャップを計算します。最後に(私はここに問題があると思う...)私は、関数 "energy_gap(x、y)"で結果をZに格納して評価するために点XとYのグリッドを作成し、プロットを行うには、それは動作しません....任意のアイデアなぜですか?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

[OK]を、いくつかの大規模なテストの後、私は私はあなたがしようとしているよう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 1つのラインバージョン(それを忘れてしまった):

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

関連する問題