4

scipy.linalg.eigが左右の固有ベクトルを計算する方法について質問があります。たぶん私はすべてを誤解しましたが、物事は私には正しくないようです...

最初から。固有値と両方の固有ベクトルを取得するために、次を使用しました。

ev, left_v, right_v = scipy.linalg.eig(A, left=True)

マニュアルによると、関数の呼び出し中に設定した後、i番目の列がi番目の固有値を参照するleft=True列として左固有ベクトルを取得することを期待する必要があります。left_vしかし、結果は私が期待したものではなかったので、私は簡単なチェックをしました。

関数を2回呼び出す左右の固有ベクトルを計算しました(詳細はこちらをご覧ください)。

right_ev, right_v_2 = scipy.linalg.eig(A)
left_ev, left_v_2 = scipy.linalg.eig(A.T)

ここで、の列は、のleft_v_2対応する値に関連付けられた固有ベクトルleft_evです。right_ev_2両方とも同じ固有値を与えることを強調する価値left_ev_2がありますが、それらは異なる順序であり、説明する必要があります。

比較するleft_evleft_ev_2(固有値に関して並べ替えた後)、前者が後者の共役であり、したがってwithleft_evから取得されたものが有効な左固有ベクトルではないことがすぐにわかります。scipy.linalg.eigleft=True

固有ベクトルの有効性に関する別のチェックは、任意の実数の正方行列に対して、左右の固有ベクトルが双直交であるという事実に基づいて行うことができます。

left_v.T.dot(right_v)対角行列を与える必要がありますが、次のように変更するまでは与えません:left_v.T.conj().dot(right_v)

その間:

left_v_2.T.dot(right_v_2)予想される対角行列を与えます。

誰かが以前に同様の問題に遭遇したことがありますか?私の言うことは正しいですか?説明中にsciPyマニュアルは少し不正確eigですか?何かアドバイスはありますか?

どうもありがとう!

4

1 に答える 1

4

についてvleigdocstringは言います:

a.H vl[:,i] = w[i].conj() b.H vl[:,i]

または、両側の共役転置b(つまり、エルミート転置)(.Hが意味するもの)を取り、それがアイデンティティであると仮定すると、

vl[:,i].H a = w[i] vl[:,i].H

したがって、の共役転置の行はvl、の実際の左固有ベクトルですa

Numpy配列には実際には.H属性がないため、.conj()。Tを使用する必要があります。

計算を検証するためのスクリプトは次のとおりです。

import numpy as np
from scipy.linalg import eig

# This only affects the printed output.
np.set_printoptions(precision=4)

a = np.array([[6, 2],
              [-1, 4]])

w, vl, vr = eig(a, left=True)

print "eigenvalues:", w
print

# check the left eigenvectors one-by-one:
for k in range(a.shape[0]):
    val = w[k]
    # Use a slice to maintain shape; vec is a 2x1 array.
    # That allows a meaningful transpose using .T.
    vec = vl[:, k:k+1]
    # rowvec is 1x2; it is the conjugate transpose of vec.
    # This should be the left eigenvector.
    rowvec = vec.conj().T
    # Verify that rowvec is a left eigenvector
    lhs = rowvec.dot(a)
    rhs = val * rowvec
    print "Compare", lhs, "to", rhs
    print rowvec, "is",
    if not np.allclose(lhs, rhs):
        print "*NOT*",
    print "a left eigenvector for eigenvalue", val

print
print "Matrix version:"
print "This"
print vl.conj().T.dot(a)
print "should equal this"
print np.diag(w).dot(vl.conj().T)

出力:

eigenvalues: [ 5.+1.j  5.-1.j]

Compare [[ 1.6330+2.4495j  4.0825+0.8165j]] to [[ 1.6330+2.4495j  4.0825+0.8165j]]
[[ 0.4082+0.4082j  0.8165-0.j    ]] is a left eigenvector for eigenvalue (5+1j)
Compare [[ 1.6330-2.4495j  4.0825-0.8165j]] to [[ 1.6330-2.4495j  4.0825-0.8165j]]
[[ 0.4082-0.4082j  0.8165+0.j    ]] is a left eigenvector for eigenvalue (5-1j)

Matrix version:
This
[[ 1.6330+2.4495j  4.0825+0.8165j]
 [ 1.6330-2.4495j  4.0825-0.8165j]]
should equal this
[[ 1.6330+2.4495j  4.0825+0.8165j]
 [ 1.6330-2.4495j  4.0825-0.8165j]]

さて、eigdocstringは戻り値の説明にも次のように書かれています。

vl : double or complex ndarray
    The normalized left eigenvector corresponding to the eigenvalue
    ``w[i]`` is the column v[:,i]. Only returned if ``left=True``.
    Of shape ``(M, M)``.

左固有ベクトルの従来の定義(例: http: //mathworld.wolfram.com/LeftEigenvector.htmlまたはhttp://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Left_and_right_eigenvectors)は行ベクトルであるため、これは誤解を招く可能性があります。 、したがって、それvlは実際には左固有ベクトルである列の共役転置です。

于 2013-03-22T03:48:56.560 に答える