Спасибо за ответы, которые помогли мне и указали в правильном направлении.
Теперь у меня есть простое пошаговое решение моей проблемы для произвольного k<n
.
1. Найти одно решение для всех приведенных уравнений. Это можно сделать с помощью
solution_vec = numpy.linalg.lstsq(A,b)
это дает решение, как видно из ukemis answer . В моем примере выше матрица A
равна коэффициентам уравнений с левой стороны, b
представляет вектор с правой стороны.
2. Определите пустое пространство вашей матрицы A
.
Это все векторы v
, так что скалярное произведение v*A_i = 0
для каждой (!) Строки A_i
из A
. Следующая функция, найденная в этой теме , может использоваться для получения представителей пустого пространства A
:
def nullSpaceOfMatrix(A, eps=1e-15):
u, s, vh = scipy.linalg.svd(A)
null_mask = (s <= eps)
null_space = scipy.compress(null_mask, vh, axis=0)
return scipy.transpose(null_space)
3. Создайте столько (N
) "случайных" линейных комбинаций (то есть со случайными коэффициентами) из solution_vec
и результирующих векторов пустого пространства матрицы, сколько хотите! Это работает, потому что скалярное произведение аддитивно, а векторы с нулевым пространством имеют скалярное произведение 0 на векторы уравнений. Эти линейные комбинации всегда должны содержать solution_vec
, как в:
linear_combination = solution_vec + a*null_spacevec_1 + b*nullspacevec_2...
, где a
и b
могут быть выбраны случайным образом.