При анализе связей в задаче часто появляется необходимость решать матричное уравнение

Как правило оно однородное (все элементы
Y равны нулю), но тем не менее. Тут возможны различные ситуации, связанные с тем, как соотносятся между собой ранк матрицы
A, ранк расширенной матрицы, количество строк и количество столбцов матрицы
A. Когда решение существует, его можно выразить в виде

с некоторыми "волшебными" матрицами
B и
C и столбцом независимых (свободных) переменных
Z. Последние два объекта могут отсутствовать, если исходная матрица квадратная и невырожденная или если она переопределённая (число строк больше числа столбцов), но система в целом совместна. Как учат в курсе линейной алгебры, от исходной системы к решению (с искомыми матрицами
B и
C) можно естественным образом перейти, если воспользоваться методом Гаусса (для матрицы
A, дополненной справа единичной матрицей) и построить приведённую ступенчатую форму по строкам (
reduced row echelon form, функция
rref в Matlab). Матрица
B при этом получается из единичной. Дальше свободные переменные переносятся в правую часть, где коэффициенты перед ними образуют матрицу
C после "подстыковки" снизу единичной матрицы с правильным знаком. Её столбцы образуют базис решения, но они не являются в определённом смысле наилучшими. В идеале хотелось бы, чтобы он был ортонормированным. Предпочтительность такого базиса связана с тем, что его матрица очень хорошо обусловлена (лучше в принципе уже нельзя), что важно для точности численных вычислений, и вообще является полезным свойством. Можно, конечно, применить к результату ортогонализацию Грамма-Шмидта или ещё какой-нибудь алгоритм (функция
orth в Matlab). Но существует более прямолинейный метод решения системы через
сингулярное разложение матрицы (функция
svd).
Меня сейчас будет интересовать случай, когда число строк
M матрицы
A меньше числа столбцов
N (как следствие, она имеет нетривиальное ядро, с нахождением базиса в котором связано вычисление матрицы C). При этом либо уравнение совместно, либо однородно. Сингулярное разложение матрицы действительных чисел — это представление в виде

где матрицы
U и
V являются матрицами поворота (и, возможно, включают в поворот отражение, то есть их определитель может быть равен −1). Это означает, что они квадратные и ортогональные (с единичным по модулю определителем):

Их размер разный: размер
U совпадает с числом строк
M матрицы
A, а размер
V — с числом столбцов
N. Размер матрицы
Σ совпадает с размером
A, она заполнена нулями, кроме главной диагонали, на которой стоят сингулярные значения матрицы
A (неотрицательные числа) в убывающем порядке. Её рангом
r является число этих значений, превышающих некоторый порог, который обычно принимается равным произведению первого сингулярного значения на малую величину, то есть величина
δ из поста выше. В зависимости от задачи порог можно увеличить, но уменьшать его нет смысла, потому что он связан с конечностью машинной точности. В любом случае, с учётом разложения решаемое уравнение примет вид:

Перейдём к новым переменным:

Матрица
Σ имеет вид, где в верхнем левом углу стоит квадратная матрица с ненулевой главной диагональю, а все остальные элементы вокруг — нулевые:

Уравнение совместно, если оно однородно или если на последних строках его матричной записи стоят только нули, в том числе в столбце
Y'. То есть, если ранг
r матрицы
A (и матрицы
Σ) меньше числа строк, то решение о совместности системы принимается на основе того, что последние элементы столбца
Y' равны нулю с заданной/желаемой точностью, так как вычисления с плавающей точкой по своей природе неточные. В результате уравнение преобразуется

Нижние элементы столбца
X' выбираются произвольно, это свободные переменные в решении (я сразу обозначаю их как столбец
Z), а верхние — вычисляются по формуле:

нижний индекс
r у матрицы
U означает, что перед транспонированием берутся первые
r столбцов этой матрицы, а остальные — отбрасываются. Здесь вычисление обратной матрицы
Σ в силу её природы заключается лишь в обращении элементов главной диагонали. Столбец искомых переменный выражается так:

Здесь отрицательный индекс −
r означает, что у матрицы
V берутся только последние столбцы, которые дополняют её первые
r до квадратной. Окончательно имеем:

Здесь матрица
C с ходу является ортонормированным базисом пространства решений, потому что матрица
V является ортогональной, как следствие любой набор её столбцов (или строк) является ортонормированным. Получается, сингулярное разложение позволяет найти решение системы линейных уравнений в общем виде и, не смотря на конечную точность вычислений с плавающей точкой, принять информированное решение о том, чему равен ранг системы, какова размерность пространства решений и является ли вообще система совместной:

Чувствую себя разочарованным, обманутым и обделённым в связи с тем, что в курсе линейной алгебры нам даже не заикнулись о существовании такого мощного и робастного инструмента для решения систем линейных уравнений. На сингулярное разложение наткнулся буквально на днях в процессе поиска хоть чего-нибудь, что позволит решать недоопределённые системы в общем виде, но не потребует от меня вручную кодить алгоритм Гаусса со всеми необходимыми проверками корректности, и будет давать максимально точное и красивое решение.
Надо заметить, что в программе Matlab функции
null,
orth и
rank, имеющие непосредственно отношение к задаче, (а так же, возможно, некоторые другие, например
norm) — все работают через функцию
svd даже тогда, когда время выполнения можно было бы в 2 раза улучшить с другими алгоритмами. Это делается потому, что сингулярное разложение даёт более точные и стойкие результаты.