for循环中Python中的特征值排序

时间:2018-07-05 20:22:44

标签: python sorting numpy matplotlib linear-algebra

我正在根据参数x计算和绘制5x5数组的特征值。我知道我必须对特征值进行排序,因为它们不一定要用numpy排序,因此最简单的方法是使用argsort()并将它们从最小到最大排序(反之亦然):

    import matplotlib.pyplot as plt
    import numpy as np

    #matrix values
    A=20
    B=8
    C=10
    D = 10
    E=30
    q1 = 6
    q2=5

    xx = np.linspace(0,30,300) 


    ev1=np.array([])
    ev2=np.array([])
    ev3=np.array([])
    ev4=np.array([])
    ev5=np.array([])
    for x in np.arange(0,30, 0.1):
      vals, vecs = (np.linalg.eig([[A,0,x,0,0],[0,B,q1,0,0][x,q1,C,0,0][q2,0,q2,D,0],[0,0,0,0,E]]))
      idx = vals.argsort()[::-1]   
      vals = vals[idx]
      vecs = vecs[:,idx]
      ev1=np.append(ev1, vals[0])
      ev2=np.append(ev2, vals[1])
      ev3=np.append(ev3, vals[2])
      ev4=np.append(ev4, vals[3])
      ev5=np.append(ev5, vals[4])

      plt.figure(figsize=(7.5,4.5))
      plt.plot(xx, ev1)
      plt.plot(xx, ev2)
      plt.plot(xx, ev3)
      plt.plot(xx, ev4)
      plt.plot(xx, ev5)
      plt.savefig('eigenvalues.jpg')
      plt.show()

但是,我对结果不满意(请参见附图),因为这不能正确地反映特征值,例如蓝色的水平线最初会切换为橙色,但我希望它保持蓝色,红色曲线的相似性。但是,我不知道该如何实现。

提前感谢您的建议!

graph showing current results

1 个答案:

答案 0 :(得分:0)

我相信您在这里使问题变得过于复杂。当在特征值上使用argsort并附加时,您只是在获得最高,第二高,最低值等的列表,而忽略了特征向量数据。如果您删除了代码的整个argsort部分,则绘图代码将可以正常工作,因为特征值在位置上已链接到正确的特征向量。enter image description here