【数値計算法(黄明佑)】行列の固有値と固有ベクトルの計算(2):ヤコビクリアランス法(ヤコビ回転法の改良)【理論からプログラムまで】

  行列の固有値 (固有値) と固有ベクトル (固有ベクトル) は、多くのアプリケーションにおいて数学的および物理的に重要な意味を持ちます。 ヤコビ回転法は、対称行列の固有値と固有ベクトルを計算する反復法、ヤコビ通過法 a> はヤコビ回転法の改良版であり、その主な目的は計算作業を軽減し、実行速度を向上させることです。

  この記事では、Jacobi クリアランス法の基本原理と手順を詳しく紹介し、その Python 実装について説明します。

1. ヤコビ回転法

  ヤコビ回転法の各反復では、最大の非対角要素を持つ位置を選択し、対応する回転行列を構築し、同様の変換を実行して行列を徐々に対角化する必要があります。

  • 対称行列は、転置がそれ自体と等しい実数行列です。
  • 对于一个方阵 A A A,如果存在标量 λ λ λ 和非零向量 v v v A v = λ v Av = λv Av=λv,那么 λ λ λ A A A 的特征值, v v v 就是对应于 λ λ λ 的特征向量。

1. 基本的な考え方

  ヤコビ回転法の基本的な考え方は、一連の同様の変換を通じて対称行列を徐々に対角化し、非対角要素がゼロになる傾向があるようにすることです。このプロセス中に、固有値が対角線上に徐々に現れ、対応する固有ベクトルが徐々に見つかります。ヤコビ回転法の基本的な手順は次のとおりです。

  1. 回転角度を選択します: 回転角度 θ を選択します。通常は、回転行列の非対角要素がゼロになるようにして、対角化を実現します。通常は < a i=2>非対角要素の中で絶対値が最大のものが回転の対象となります。

  2. 回転行列の構築: 単位行列である回転行列 J を構築します。選択した非対角要素に対応する位置には、非ゼロ要素が 2 つだけあります。 、静止位置はゼロです。これら 2 つの非ゼロ要素の値は、回転角度 θ によって決定されます。たとえば、2x2 行列の場合、回転行列は次のように表すことができます。
    J = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] J = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & ; \cos(\theta) \end {bmatrix} J=[cos(θ)sin(θ)sin(θ)cos(θ)]

  3. 相似変換: 相似変換行列を計算します P P P、つまり P T A P P^TAP PTAP,其中 A A A 是原始矩阵, P P P は回転行列で、計算プロセスは次のとおりです。

P T A P = [ cos ⁡ ( θ ) sin ⁡ ( θ ) − sin ⁡ ( θ ) cos ⁡ ( θ ) ] T [ a 11 ~ 12 a 12 ~ 22 ] [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] P^TAP = \begin{bmatrix} \cos(\theta) & \sin(\theta) \\ -\sin(\theta) & \cos(\theta) \end{bmatrix}^T \begin{bmatrix} a_{11} & a_{12} \\ a_{12} & a_{22} \end{bmatrix} \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta)\end{bmatrix}PTAP=[cos(θ)sin(θ)sin(θ)cos(θ)]T[ある11 ある12 ある12 ある22 ][cos(θ)sin(θ)sin(θ)cos(θ)]

  行列乗算計算により、 P T A P P^TAP を得ることができます。PTAP の非対角要素。これら 2 つの要素が行列 (1,2) と (2,1) の位置。 a i j a_{ij} あるij 为这两个元素,即 a i j = a 12 = a 21 a_{ij}= a_{12} = a_{21} あるij =ある12 =ある21

  次に、適切な θ \theta を選択することで、θ使得 a i j a_{ij} あるij がゼロになり、対角化の目的が達成されます。つまり a 12 = a 21 a_{12} = a_{21} ある12 =ある21、さらに推測することができます

θ = 1 2 arctan ⁡ ( 2 ⋅ a i j a i i − a j j ) \theta = \frac{1}{2} \arctan\left(\frac{2 \cdot a_{ij}}{a_{ii} - a_{jj} }\右)=21 アークタン(あるiiあるjj2あるij )

  • a i i = a j j a_{ii}=a_{jj} あるii=あるjj a r c c o t arccot を使用します。arccotin
  1. 反復: 行列 A の非対角要素がゼロになるか、特定の精度要件を満たすまで、ステップ 1 ~ 3 を繰り返します。

  2. 固有値と固有ベクトルの抽出: 対角線上の要素は行列 A の固有値であり、P の列ベクトルはこれらの固有値ベクトルに対応する特徴です。

2. 注意事項

  ヤコビ回転法の利点は、任意のサイズの対称行列に使用できることですが、欠点は、多数の反復と大量の計算が必要なことです。実際のアプリケーションでは、通常、計算効率を向上させるために他の方法が組み合わされます。

2. ヤコビクリアランス法

  Jacobi のしきい値法は、Jacobi の回転法の改良版であり、その主な目的は、計算量を削減し、実行速度を向上させることです。この方法では、しきい値を動的に調整し、しきい値に従って非対角要素を選択的に回転させることにより、対称行列を徐々に対角化します。

1. 基本的な考え方

  1. 非対角要素の二乗和を計算します: 対称行列の場合 A A A は、非対角要素の二乗和を計算します。 u ( A ) u(A) u(A)。然后取平方根,得到 r ( A ) = u ( A ) r(A) = \sqrt{u(A)} r(A)=u(A)

  2. 设定初始阈值 θ \theta θ 预先设定一个初始阈值 θ 0 \theta_0 0

  3. 扫描非对角元素: 对于 a i j a_{ij} あるij 其中 i ≠ j i \neq j =j、行列の上三角部分または下三角部分をスキャンします。

  4. 選択的な回転変換を実行します: 絶対値が現在のしきい値 $\theta $ より大きい非対角要素の場合 a i j a_{ij }あるij 、ヤコビ回転変換を実行し、それをゼロに回転します。回転変換の具体的な手順は次のとおりです。

    • 回転角度の選択 ϕ \phi ϕ,解釈 Tan ⁡ ( 2 ϕ ) = 2 a i j a i i − a j j \tan(2\phi) = \frac{2a_ { ij}}{a_{ii} - a_{jj}} タン(2ϕ)=あるiiajj2aij 計算します。
    • 回転行列の構築 J J J,其中除了 J i i J_{ii} Jii J j j J_{jj} Jjj の外側の要素はすべてゼロであり、 J i j J_{ij} Jij J j i J_{ji} J 微小 cos ⁡ ( ϕ ) \cos(\phi) cos(ϕ) − sin ⁡ ( ϕ ) -\sin(\phi) sin(ϕ)决定。
    • 相似変換を実行します A = J T A J A = J^T A J =JTAJ
  5. 调整阈值 θ \theta θ: すべての非対角要素の絶対値が現在のしきい値より小さい場合 θ \シータ θ 时,缩小阈值,即 θ i + 1 = γ ⋅ θ i \theta_{i+1} = \gamma \cdot \theta_i i+1 =ci ,其中 γ \gamma γ は削減係数です。

  6. 手順 3 ~ 5 を繰り返します。 特定の収束条件が満たされるまで上記の手順を繰り返します。たとえば、 θ k < ϵ \theta_k です。 < \epsilon k <;ϵ ϵ \epsilon ϵ は小さな正の数です。

2. 注意事項

  しきい値を継続的に調整し、回転変換を選択的に実行することにより、ヤコビ パス法は非対角要素の絶対値を徐々に減らし、より優れた数値安定性を実現します。この方法の利点は、変換する非対角要素をインテリジェントに選択することで、反復回数を効果的に削減し、計算効率を向上できることです。

3. Pythonの実装

import numpy as np


def jacobi_threshold_method(A, epsilon=1e-10, gamma=0.9):
    n = A.shape[0]
    theta = np.sqrt(np.sum(np.abs(np.triu(A, k=1)) ** 2))
    eigenvectors = np.eye(n)

    while theta > epsilon:
        for i in range(n):
            for j in range(i + 1, n):
                if np.abs(A[i, j]) > theta:
                    # 计算旋转角度
                    phi = 0.5 * np.arctan2(2 * A[i, j], A[i, i] - A[j, j])

                    # 构造旋转矩阵
                    J = np.eye(n)
                    J[i, i] = J[j, j] = np.cos(phi)
                    J[i, j] = -np.sin(phi)
                    J[j, i] = np.sin(phi)

                    # 执行相似变换
                    A = np.dot(np.dot(J.T, A), J)

                    # 更新特征向量
                    eigenvectors = np.dot(eigenvectors, J)

        # 缩小阈值
        theta *= gamma

    # 提取特征值和特征向量
    eigenvalues = np.diag(A)

    return eigenvalues, eigenvectors


# 示例矩阵
A = np.array([[2, -1, 0], [-1, 2, -1], [0, -1, 2]])

# 执行 Jacobi 过关法
eigenvalues, eigenvectors = jacobi_threshold_method(A)

print("特征值:", eigenvalues)
print("特征向量:")
np.set_printoptions(precision=4, suppress=True)
print(eigenvectors)

ここに画像の説明を挿入します

反復プロセス (デバッグ)

  • 初め:

ここに画像の説明を挿入します

ここに画像の説明を挿入します

……

  • 最後の:
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_63834988/article/details/134678554