行列の固有値 (固有値) と固有ベクトル (固有ベクトル) は、多くのアプリケーションにおいて数学的および物理的に重要な意味を持ちます。 ヤコビ回転法は、対称行列の固有値と固有ベクトルを計算する反復法、ヤコビ通過法 a> はヤコビ回転法の改良版であり、その主な目的は計算作業を軽減し、実行速度を向上させることです。
この記事では、Jacobi クリアランス法の基本原理と手順を詳しく紹介し、その Python 実装について説明します。
1. ヤコビ回転法
ヤコビ回転法の各反復では、最大の非対角要素を持つ位置を選択し、対応する回転行列を構築し、同様の変換を実行して行列を徐々に対角化する必要があります。
- 対称行列は、転置がそれ自体と等しい実数行列です。
- 对于一个方阵 A A A,如果存在标量 λ λ λ 和非零向量 v v v, A v = λ v Av = λv Av=λv,那么 λ λ λ は A A A 的特征值, v v v 就是对应于 λ λ λ 的特征向量。
1. 基本的な考え方
ヤコビ回転法の基本的な考え方は、一連の同様の変換を通じて対称行列を徐々に対角化し、非対角要素がゼロになる傾向があるようにすることです。このプロセス中に、固有値が対角線上に徐々に現れ、対応する固有ベクトルが徐々に見つかります。ヤコビ回転法の基本的な手順は次のとおりです。
-
回転角度を選択します: 回転角度 θ を選択します。通常は、回転行列の非対角要素がゼロになるようにして、対角化を実現します。通常は < a i=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(θ)] -
相似変換: 相似変換行列を計算します 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
-
反復: 行列 A の非対角要素がゼロになるか、特定の精度要件を満たすまで、ステップ 1 ~ 3 を繰り返します。
-
固有値と固有ベクトルの抽出: 対角線上の要素は行列 A の固有値であり、P の列ベクトルはこれらの固有値ベクトルに対応する特徴です。
2. 注意事項
ヤコビ回転法の利点は、任意のサイズの対称行列に使用できることですが、欠点は、多数の反復と大量の計算が必要なことです。実際のアプリケーションでは、通常、計算効率を向上させるために他の方法が組み合わされます。
2. ヤコビクリアランス法
Jacobi のしきい値法は、Jacobi の回転法の改良版であり、その主な目的は、計算量を削減し、実行速度を向上させることです。この方法では、しきい値を動的に調整し、しきい値に従って非対角要素を選択的に回転させることにより、対称行列を徐々に対角化します。
1. 基本的な考え方
-
非対角要素の二乗和を計算します: 対称行列の場合 A A A は、非対角要素の二乗和を計算します。 u ( A ) u(A) u(A)。然后取平方根,得到 r ( A ) = u ( A ) r(A) = \sqrt{u(A)} r(A)=u(A)。
-
设定初始阈值 θ \theta θ: 预先设定一个初始阈值 θ 0 \theta_0 私0 。
-
扫描非对角元素: 对于 a i j a_{ij} あるij 其中 i ≠ j i \neq j 私=j、行列の上三角部分または下三角部分をスキャンします。
-
選択的な回転変換を実行します: 絶対値が現在のしきい値 $\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ϕ)=あるii−ajj2aij 計算します。
- 回転行列の構築 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。
-
调整阈值 θ \theta θ: すべての非対角要素の絶対値が現在のしきい値より小さい場合 θ \シータ θ 时,缩小阈值,即 θ i + 1 = γ ⋅ θ i \theta_{i+1} = \gamma \cdot \theta_i 私i+1 =c⋅私i ,其中 γ \gamma γ は削減係数です。
-
手順 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)
反復プロセス (デバッグ)
- 初め:
……
- 最後の: