Функция linalg.qr
Функция linalg.qr выполняет QR-разложение матрицы,
представляя её в виде произведения ортогональной матрицы Q
и верхнетреугольной матрицы R. Первым параметром функция
принимает двумерный массив (матрицу). Вторым параметром можно
задать режим разложения, определяющий формат возвращаемых матриц.
Синтаксис
np.linalg.qr(a, mode='reduced')
Параметры
Основные параметры функции:
-
a- входная матрица размером(M, N); -
mode- режим разложения, определяющий формат возвращаемых матриц. Доступные значения:'reduced'(по умолчанию),'complete','r','raw'.
Режимы разложения
Функция поддерживает несколько режимов работы:
-
'reduced'- возвращает матрицыQразмером(M, K)иRразмером(K, N), гдеK = min(M, N); -
'complete'- возвращает полную ортогональную матрицуQразмером(M, M)и верхнетреугольную матрицуRразмером(M, N); -
'r'- возвращает только матрицуRв экономичной форме; -
'raw'- возвращает матрицуRи информацию о преобразованиях Хаусхолдера в нестандартном формате.
Пример ⁅⋯n="sect"⁆
Выполним QR-разложение матрицы в стандартном режиме:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10]])
q, r = np.linalg.qr(arr)
print("Q:")
print(q)
print("R:")
print(r)
Результат выполнения кода:
Q:
[[-0.12309149 0.90453403 0.40824829]
[-0.49236596 0.30151134 -0.81649658]
[-0.86164044 -0.30151134 0.40824829]]
R:
[[ -8.1240384 -9.6011363 -11.4251423 ]
[ 0. 0.90453403 1.50755672]
[ 0. 0. 0.81649658]]
Пример ⁅⋯n="sect"⁆
Используем режим 'complete' для получения полной
квадратной матрицы Q:
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
q, r = np.linalg.qr(arr, mode='complete')
print("Q shape:", q.shape)
print("R shape:", r.shape)
print("Q:")
print(q)
Результат выполнения кода:
Q shape: (3, 3)
R shape: (3, 2)
Q:
[[-0.16903085 0.89708523 0.40824829]
[-0.50709255 0.27602622 -0.81649658]
[-0.84515425 -0.34503278 0.40824829]]
Пример ⁅⋯n="sect"⁆
Получим только матрицу R с помощью режима 'r':
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
r = np.linalg.qr(arr, mode='r')
print("R:")
print(r)
Результат выполнения кода:
R:
[[-5.09901951 -6.27717921 -7.45533891 -8.63349861]
[ 0. 0.98058068 1.96116135 2.94174203]]
Пример ⁅⋯n="sect"⁆
Проверим, что произведение Q и R даёт исходную матрицу:
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
q, r = np.linalg.qr(arr)
reconstructed = np.dot(q, r)
print("Original:")
print(arr)
print("Reconstructed:")
print(reconstructed)
print("Max difference:", np.max(np.abs(arr - reconstructed)))
Результат выполнения кода:
Original:
[[1 2]
[3 4]
[5 6]]
Reconstructed:
[[1. 2.]
[3. 4.]
[5. 6.]]
Max difference: 8.881784197001252e-16
Пример ⁅⋯n="sect"⁆
Используем QR-разложение для решения системы линейных уравнений методом наименьших квадратов:
import numpy as np
# Создаем матрицу коэффициентов и вектор правой части
A = np.array([[1, 1], [1, 2], [1, 3]])
b = np.array([2, 3, 4])
# Выполняем QR-разложение
q, r = np.linalg.qr(A)
# Решаем систему R * x = Q^T * b
qt_b = np.dot(q.T, b)
x = np.linalg.solve(r, qt_b)
print("Solution x:")
print(x)
Результат выполнения кода:
Solution x:
[1. 1.]