Сейчас я пытаюсь думать несколько в другом направлении.
Появилась тут ещё идея двигаться в третьем направлении: рассчитать псевдообращение недоопределённой матрицы
A по её
LU-разложению. Задача:

Матрицу
A раскладываем с пивотированием по столбцам (
P - перестановочная матрица):

Расщепляем верхнедиагональную матрицу
U на две половинки: квадратную (и поэтому обратимую) часть и всё остальное. Соответствующим же образом расщепляем и вектор
y:

В результате получается:

МНК решается стандартно по формуле:

Поскольку размер симметричной матрицы
G мал по сравнению с размером задачи (по условию), то трудозатраты на её обращение пренебрежимы по сравнению с
LU-декомпозицией. При этом, если на единицу нормировать матрицу
U, а не
L (как это обычно делается, например в MATLAB'е), то вся некондиционность уйдёт в матрицу
L (на сколько это возможно для этого разложения). Обращение квадратной половинки
U даст матрицу с элементами, близкими к единице, а элементы второй её части будут меньше единицы. В результате число обусловленности матрицы
G будет очень хорошее. Теоретически, нормировку столбцов
U можно попытаться подобрать так, чтобы число обусловленности
G стало ещё лучше, но это уже такие технические тонкости, о которых можно заботиться в самую последнюю очередь. Так же, есть надежда, что трудоёмкость задачи можно снизить, если воспользоваться тем, что матрица задачи разреженная.
В итоге, для псевдообращения
A через её
LU-разложение получается такая формула:

Возможно, её можно дальше упростить (
есть у меня такие подозрения), надо будет покрутить формулы.
Этот подход к псевдообращению применительно к моей задаче имеет дополнительный бонус. Дело в том, что матрица
A с числом строк и столбцов, соответственно

в моей задаче строится из первых (найденных) линейно независимых строк полной матрицы, у которой их

то есть много больше
m для больших
N. Сроки соответствуют линеаризированным связям, а их правильных выбор лежит в основе метода активного множества (в оптимизации).
LU-разложение позволяет отбрасывать по мере нахождения линейно зависимые (с уже выбранными) строки и продолжать без потерь двигаться дальше. В результате одним выстрелом я убиваю сразу трёх зайцев:
- Динамически нахожу активный набор связей;
- Рассчитываю вектор-направление для итерации Ньютона;
- Делаю это численно устойчивым методом (и, в потенциале, очень быстрым).
Надо теперь всё это реализовать и посмотреть что получается. Код на MATLAB'е, демонстрирующий работу формулы псевдообращения:
clc
clear all
format short
%format long
m = 6;
n = 10;
a = randn (m, n);
[u l p] = lu (a');
u = u';
l = l';
p = p';
u1 = u (:, 1 : m);
u2 = u (:, m + 1 : n);
u1_inv = u1 ^ -1;
b = u1_inv * l ^ -1;
c = u1_inv * u2;
g = c' * c + eye (n - m);
%disp (u1_inv)
%disp (c' * c)
%disp (' ')
%disp (svd (c)')
%disp (svd (g)')
disp (cond (c))
disp (cond (g))
disp (' ')
d1 = pinv (a);
d2 = [b; zeros(n - m, m)] + [-c; eye(n - m)] * g ^ -1 * c' * b;
d2 = p * d2;
disp (d1 - d2)