Решить переопределенную систему с QR-декомпозицией в Python - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь решить переопределенную систему с помощью QR-разложения и linalg.solve, но я получаю ошибку:

LinAlgError: Последние 2 измерения массива должны быть квадратными .

Это происходит, когда массив R не квадратный, верно?Код выглядит следующим образом

import numpy as np
import math as ma

A = np.random.rand(2,3)
b = np.random.rand(2,1) 
Q, R = np.linalg.qr(A)
Qb = np.matmul(Q.T,b)
x_qr = np.linalg.solve(R,Qb)

Есть ли способ написать это более эффективным способом для произвольных измерений A?Если нет, то как заставить этот код работать?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Как показано в документации numpy.linalg.solve:

Вычисляет «точное» решение x для точно определенной линейной матрицы с полным рангом, т.е.уравнение ax = b.

Ваша система уравнений недоопределена не переопределена.Обратите внимание, что у вас есть 3 переменные и 2 уравнения, таким образом, меньше уравнений, чем неизвестных.

Также обратите внимание, как в нем также упоминается, что в numpy.linalg.solve(a,b), a должна быть матрица MxM.Причина этого заключается в том, что решение системы уравнений Ax=b включает в себя вычисление обратного A, и только квадратные матрицы обратимы.

В этих случаях распространенным подходом является использование псевдообратного Мура-Пенроуза., который будет вычислять наилучшее решение (наименьших квадратов) системы.Поэтому вместо того, чтобы пытаться найти точное решение, используйте numpy.linalg.lstsq:

x_qr = np.linalg.lstsq(R,Qb)
0 голосов
/ 12 декабря 2018

Причина в том, что матрица R не является квадратной, возможно потому, что система переопределена.Вместо этого вы можете попробовать np.linalg.lstsq, найдя решение, которое минимизирует квадратичную ошибку (которая должна дать точное решение, если оно существует).

import numpy as np
import math as ma

A = np.random.rand(2,3)
b = np.random.rand(2,1) 
Q, R = np.linalg.qr(A)
Qb = np.matmul(Q.T,b)
x_qr = np.linalg.lstsq(R,Qb)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...