У меня есть n
вещественные числовые переменные (не знаю, все равно), назовем их X [n]
.
У меня также есть m >> n
отношения между ними, назовем их R [m]
в форме:
X [i] = alpha * X [j]
, альфа
- ненулевое положительное действительное число, i
и j
разные, но пара (i, j)
не обязательно уникальный (то есть могут быть две связи между одними и теми же переменными с разным альфа-фактором)
Я пытаюсь найти набор параметров альфа
, которые решают переопределенную систему по некоторым наименьшим квадратам смысл. Идеальным решением было бы минимизировать сумму квадратов разностей между каждым параметром уравнения и его выбранным значением, но меня устраивает следующее приближение:
Если я превращаю m уравнений в переопределенную систему из n неизвестных, любые псевдо -инверсный числовой решатель даст мне очевидное решение (все нули). Итак, что я сейчас делаю, так это добавляю еще одно уравнение в смесь, x [0] = 1
(на самом деле подойдет любая константа) и решаю сгенерированную систему в смысле наименьших квадратов, используя псевдообратную формулу Мура-Пенроуза. . Хотя это пытается минимизировать сумму (x [0] - 1) ^ 2
и квадратную сумму x [i] - alpha * x [j]
, я нахожу это хорошее и численно стабильное приближение к моей проблеме. Вот пример:
a = 1
a = 2*b
b = 3*c
a = 5*c
в Octave:
A = [
1 0 0;
1 -2 0;
0 1 -3;
1 0 -5;
]
B = [1; 0; 0; 0]
C = pinv(A) * B or better yet:
C = pinv(A)(:,1)
Что дает значения для a
, b
, c
: [0.99383; 0,51235; 0,19136]
Это дает мне следующие (разумные) отношения:
a = 1.9398*b
b = 2.6774*c
a = 5.1935*c
Итак, прямо сейчас мне нужно реализовать это на C / C ++ / Java, и у меня есть следующие вопросы:
Есть ли более быстрый способ решения моей проблемы, или я Я на правильном пути с генерацией переопределенной системы и вычислением псевдообратной?
Мое текущее решение требует разложения по сингулярным числам и трех умножений матриц, что немного, учитывая, что m
может быть 5000 или даже 10000. Существуют ли более быстрые способы вычисления псевдообратной матрицы (на самом деле, мне нужен только ее первый столбец, а не вся матрица, учитывая, что B равен нулю, кроме первой строки), учитывая разреженность матрицы (каждая строка содержит ровно два ненулевых значения, одно из которых всегда одно, а другое всегда отрицательное)
Какие математические библиотеки вы бы посоветовали использовать для этого? LAPACK в порядке?
Я также открыт для любых других предложений, при условии, что они численно стабильны и асимптотически быстры (скажем, k * n ^ 2
, где k
может быть большим).