Есть математическая сторона и программная сторона.Что касается математики, важно отметить, что если у ax = b есть несколько решений, то эти решения являются {y + b1 * t1 + b_2 * t_2 + ... + bN * tN |t1, ..., tN в действительных числах}, где y - любое решение ax = b (например, решение наименьших квадратов), а b1, ..., bN - базисные векторы для нулевого пространства a.На стороне программирования np.linalg.lstsq
получает решение наименьших квадратов, а scipy.linalg.null_space
получает пустое пространство.Один способ, которым вы могли бы собрать их вместе, чтобы получить результат, похожий на то, что вы хотите, заключается в следующем:
import numpy as np
import scipy.linalg
import sys
def print_parameterized_form(a, b):
one_solution = np.linalg.lstsq(a, b, rcond=None)[0]
null_space_basis = scipy.linalg.null_space(a)
for i in range(a.shape[1]):
sys.stdout.write('x{} = {}'.format(i, one_solution[i]))
for j in range(null_space_basis.shape[1]):
sys.stdout.write(' + ({}) * t{}'.format(null_space_basis[i, j], j))
sys.stdout.write('\n')
a = np.array([[1,2,4,1,0,2],[0,1,2,0,0,1],[0,0,0,2,2,0],[0,0,0,0,14,4],[0,0,0,0,0,-2]])
b = np.array([3,0,1,0,14])
print_parameterized_form(a, b)
Это должно дать вам что-то вроде этого:
x0 = 4.500000000000011 + (-3.5160449919006082e-15) * t0
x1 = 1.4000000000000128 + (0.8944271909999162) * t0
x2 = 2.7999999999999887 + (-0.4472135954999573) * t0
x3 = -1.499999999999997 + (9.065580383436411e-17) * t0
x4 = 2.0000000000000004 + (4.62652890306841e-18) * t0
x5 = -6.999999999999999 + (1.86607760441072e-16) * t0