gpt4 book ai didi

python - 如何从 NumPy 特征向量分量的复角中去除不连续性?

转载 作者:行者123 更新时间:2023-12-04 07:38:10 26 4
gpt4 key购买 nike

我在方阵上使用 NumPy 的 linalg.eig。我的方阵是一个 2D 域的函数,我正在沿着该域上的参数化圆查看其特征向量的复角。只要我考虑的路径是平滑的,我希望每个特征向量分量的复角是平滑的。但是,在某些情况下,Python 不是这种情况(尽管其他编程语言是这样)。对于参数 M=0 (我的矩阵中出现在其对角线上的一些参数),我有如下所示的组件:
enter image description here
enter image description here
当它们理想地看起来像( M=0.1 )时:
enter image description here
enter image description here
我尝试过的:

  • 我验证了这两种情况下的矩阵都是厄米矩阵。
  • 当我使用 linalg.eigh 时,M=0.1变得不连续,而 M=0有时变得连续。
  • 使用 np.unwrap什么也没做。
  • 分量相位之间的差异(即 np.angle(v1-v2) 用于特征向量 v=[[v1],[v2]] )是平滑/连续的,但这不是我想要的。
  • 在求解之前修复 NumPy 种子对种子的不同值没有任何作用。例如:np.random.seed(1) .

  • 我还可以做些什么?我正在尝试使用 Sympy 的 eigenvects只是因为我的选择用完了,我问了另一个问题,询问这里的另一种潜在方法: How do I force first component of NumPy eigenvectors to be real? .但是,我不知道我还能尝试什么。
    这是一个在 Jupyter 笔记本中运行良好的最小工作示例:
    import numpy as np
    from numpy import linalg as LA
    import matplotlib.pyplot as plt

    M = 0.01; # nonzero M is okay
    M = 0.0; # M=0 causes problems

    def matrix_generator(kx,ky,M):
    a = 2.46; t = 1; k = np.array((kx,ky));
    d1 = (a/2)*np.array((1,np.sqrt(3)));d2 = (a/2)*np.array((1,-np.sqrt(3)));d3 = -a*np.array((1,0));
    sx = np.matrix([[0,1],[1,0]]);sy = np.matrix([[0,-1j],[1j,0]]);sz = np.matrix([[1,0],[0,-1]]);
    hx = np.cos(k@d1)+np.cos(k@d2)+np.cos(k@d3);hy = np.sin(k@d1)+np.sin(k@d2)+np.sin(k@d3);
    return -t*(hx*sx - hy*sy + M*sz)

    n_segs = 200; #number of segments in (kx,ky) loop
    evecs_along_loop = np.zeros((n_segs,2,2),dtype=float)
    # parameterize circular loop
    kx0 = 0.5; ky0 = 1; r1=0.2; r2=0.2;
    a = np.linspace(0.0, 2*np.pi, num=n_segs+2)
    kloop=np.zeros((n_segs+2,2))
    for i in range(n_segs+2):
    kloop[i,:]=np.array([kx0 + r1*np.cos(a[i]), ky0 + r2*np.sin(a[i])])

    # assign eigenvector complex angles
    for j in np.arange(n_segs):
    np.random.seed(2)
    H = matrix_generator(kloop[j][0],kloop[j][1],M)
    eval0, psi0 = LA.eig(H)
    evecs_along_loop[j,:,:] = np.angle(psi0)

    # plot eigenvector complex angles
    for p in np.arange(2):
    for q in np.arange(2):
    print(f"Phase for eigenvector element {p},{q}:")
    fig = plt.figure()
    ax = plt.axes()
    ax.plot((evecs_along_loop[:,p,q]))
    plt.show()
    澄清 anon01 的评论:
    enter image description here
    对于 M=0 , 某个值为 (kx,ky) 的样本矩阵看起来像:
    a = np.matrix([[0.+0.j, 0.99286437+1.03026667j],
    [0.99286437-1.03026667j, 0.+0.j]])
    对于 M =/= 0 ,对角线将是非零(但实数)。

    最佳答案

    我认为总的来说这是一个棘手的问题。根本问题是特征向量(与特征值不同)没有明确定义。具有特征值 c 的 M 的特征向量 v 是任何非零向量,其中

    M*v = c*v
    特别是对于任何非零标量 s,将特征向量乘以 s 会产生一个特征向量,即使您(像往常一样)要求特征向量的长度为 1,我们仍然可以自由地乘以任何绝对值为 1 的标量。更糟糕的是,如果 v1,..vd 是 c 的正交特征向量,则 v 的任何非零线性组合也是 c 的特征向量。
    因此,不同的特征分解例程很可能会产生非常不同的特征向量并且仍然在做他们的工作。此外,一些例程可能会产生相距很远的矩阵的特征向量。
    一个简单易处理的情况是,您知道所有特征值都是非退化的(即每个特征空间的维数为 1),并且您碰巧知道对于特定的 i,每个特征向量的第 i 个分量将不为零。然后你可以将特征向量 v 乘以一个绝对值为 1 的标量,选择后 v[i] 是一个正实数。在 C
    s = conj(v[i])/cabs(v[i])
    where
    conj(z) is the complex conjugate of the complex number z,
    and cabs(z) is the absolute value of the complex number z
    请注意,上面假设我们对每个特征向量使用相同的索引,尽管因子 s 因特征向量而异。
    这将对特征向量施加唯一性,并且,人们希望,这意味着它们会随着矩阵的参数而不断变化。

    关于python - 如何从 NumPy 特征向量分量的复角中去除不连续性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67640569/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com