A Lánczos-algoritmus egy hatékony numerikus módszer, amely a nagy méretű szimmetrikus mátrixok sajátértékeinek és sajátvektorainak meghatározására szolgál. Ez az algoritmus különösen hasznos a numerikus lineáris algebra területén, például a kvantummechanikában, a statisztikai fizikában és a gépi tanulásban.
A Lánczos-algoritmus a teljes mátrix helyett egy kisebb dimenziójú, tridiagonális mátrixot állít elő, amely numerikusan közelíti az eredeti mátrix sajátértékeit és sajátvektorait. Ez a módszer az úgynevezett Krylov-tér fogalmára épül.
A Krylov-tér egy mátrix és egy kezdővektor alapján a következő vektorok által generált altér: A Lánczos-algoritmus ezen altérben dolgozik, hogy közelítse az sajátértékeit.
Az algoritmus a Krylov-térben egy ortogonális bázist konstruál, és az mátrixot ebben a bázisban egy tridiagonális mátrixszá alakítja: Az tridiagonális mátrix sajátértékei az mátrix sajátértékeinek jó közelítését adják.
1. Kezdővektor kiválasztása: Válassz egy véletlen vagy specifikus kezdővektort, amelyet normálni kell ().
2. Iteráció:
ahol
- Ortogonalizálj a korábbi vektorokra.
3. Megállási feltétel: Az iterációt -edik lépésben állítsd le, ha kisebb, mint az mérete, vagy ha kicsi.
4. Tridiagonális mátrix: Az mátrix sajátértékeit és sajátvektorait kiszámítva megkapod az eredeti mátrix közelítését.
Az alábbi kód egy egyszerű Python implementációt mutat be a Lánczos-algoritmusra:
import numpy as np
def lanczos_algorithm(A, v, m):
"""
Lánczos-algoritmus szimmetrikus mátrix tridiagonális közelítéséhez.
Args:
A (numpy.ndarray): Szimmetrikus mátrix.
v (numpy.ndarray): Kezdővektor (normált).
m (int): Iterációk száma.
Returns:
T (numpy.ndarray): Tridiagonális mátrix.
V (numpy.ndarray): Ortogonális bázisvektorok.
"""
n = A.shape
V = np.zeros((n, m))
T = np.zeros((m, m))
v = v / np.linalg.norm(v)
V = v
beta = 0
w = np.zeros_like(v)
for j in range(m):
w = A @ V - beta * (V if j > 0 else 0)
alpha = V.T @ w
w = w - alpha * V
if j < m - 1:
beta = np.linalg.norm(w)
if beta < 1e-10: # Konvergencia
break
V = w / beta
T = alpha
if j < m - 1:
T = beta
T = beta
return T, V
# Példa: Egy 5x5-ös szimmetrikus mátrix sajátértékeinek közelítése
A = np.array(,
,
,
,
], dtype=float)
v = np.random.rand(A.shape) # Véletlen kezdővektor
v = v / np.linalg.norm(v) # Normálás
m = 3 # Iterációk száma
T, V = lanczos_algorithm(A, v, m)
print("Tridiagonális mátrix T:")
print(T)
# Sajátértékek összehasonlítása
eigvals, _ = np.linalg.eig(A)
lanczos_eigvals = np.linalg.eigvals(T)
print("\nEredeti mátrix sajátértékei:")
print(np.sort(eigvals))
print("\nTridiagonális közelítés sajátértékei:")
print(np.sort(lanczos_eigvals))
1. Kvantummechanika: Nagyméretű Hamilton-mátrixok sajátértékeinek meghatározása. 2. Statisztikai fizika: Adatcsökkentés (dimenziócsökkentés) a nagy adathalmazokból. 3. Gépi tanulás: Spektrális elemzés a PCA (főkomponens-analízis) során.
A Lánczos-algoritmus a gyakorlatban gyors és hatékony, különösen akkor, ha csak néhány sajátértékre van szükség, mert nem szükséges az egész mátrixot kezelni.