Как лучше всего решить систему линейных уравнений с бесконечными решениями? - PullRequest
0 голосов
/ 28 января 2019

Я хочу решить систему линейных уравнений (SLE, Ax = b, где A состоит из 8 строк и столбцов), но эта система всегда будет иметь бесконечные решения.Многие люди обращаются к Эйгену, когда дело доходит до решения системы линейных уравнений.Однако в результате было бы замечательно, если бы у меня были какие-то «зависимости» между переменными, так что мне просто нужно установить значения свободных переменных и получить результаты.Например:

x1 = 5.234*x2 + 2.3232x3
x2 = 3.234 + 1.3*x3
x3 = free.

Я посмотрел в документации Eigen, но они не упоминают SLE с бесконечным множеством решений.Способен ли Eigen выполнять подобные вычисления или есть лучшая библиотека?

С уважением

РЕДАКТИРОВАТЬ:

Система может выглядеть как

0.4*f1+0.0*f2+0.6*f3+0.0*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx
0.0*f1+0.4*f2+0.0*f3+0.6*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.3*f5+0.0*f6+0.7*f7+0.0*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.0*f5+0.0*f6+0.5*f7+0.5*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx
0.0*f1+0.0*f2+0.0*f3+0.0*f4+0.0*f5+0.0*f6+0.0*f7+0.0*f8= fx

Где число строк с коэффициентами, равными только нулю, может варьироваться, а fx - произвольное значение.Тривиальное решение f1 = f2 = f3 = f4 = f5 = f6 = F7 = f8 = fx = 0 не может быть использовано.Я мог бы повторять строки, чтобы избавиться от строк с пустыми коэффициентами.

1 Ответ

0 голосов
/ 28 января 2019

Если x1 и x2 - два решения, то A(x1 - x2) = 0, то есть вектор x1 -x2 принадлежит пустому пространству A (ядро Ker A).

Следовательно, если x0 является конкретным решением и если v[i] образуют основу Ker A, то множество всех решений обеспечивается:

x = x0 + sum_i a[i] v[i], where a[i] are any real numbers

ВСобственно, некоторые разложения являются показательными, например FullPivLU.

Согласно сайту Eigen, вы можете получить основу ядра, например:

Matrix3f A;
.......
FullPivL<Matrix3f> lu_decomp(A);
auto K = lu_decomp.kernel();

Так как FullPivLU имеет решатель, вы должны получить одно конкретное решение с:

lu_decomp.solve (...);
...