Решение переопределенной системы ограничений

У меня есть 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 может быть большим).

7
задан Radu Dan 20 August 2011 в 04:40
поделиться