Запрошенное поведение
Я хотел бы решить неквадратную матрицу с помощью python. Матрица имеет два линейно зависимых вектора.
Текущее состояние
Сначала я пытался использовать numpy.linalg.solve(), но это работает только для квадратных матриц.
В других сообщениях StackOverflow рекомендуется использовать numpy.linalg.lstsq().
проблема
Однако я не понимаю, как правильно реализовать numpy.linalg.lstsq(). Функция правильно решает последний параметр, но не другие параметры. Один пост рекомендует это решение, который я тоже не понимаю.
Должен ли я как-то реализовать цикл?
Can someone provide me with a code example? How do solve this matrix problem using python?
Мой текущий код
import numpy as np
# defining a linear equation system E=F with
# | -2 * x1 - 4 * x2 + 1 * x3 - 9 * x4 + 0 * x5 = +5 |
# | 3 * x1 + 6 * x2 + 0 * x3 + 12 * x4 + 3 * x5 = +15 |
# | 1 * x1 + 2 * x2 + 1 * x3 + 3 * x4 + 1 * x5 = -17 |
# | -5 * x1 - 4 * x2 + 1 * x3 - 9 * x4 + 0 * x5 = +14 |
E=np.array(
[
[-2,-4,1,-9,0],
[3,6,0,12,3],
[1,2,1,3,1],
[-5,-10,3,-23,1]
]
)
F=np.array(
[3,15,-17,14]
)
solutionNonSquare = np.linalg.lstsq(E, F)
print('the solution vector is: {x1, x2, x3, x4, x5}=')
print(solutionNonSquare)Он возвращает (array([ -4.34615385, -8.69230769, -19.69230769, 2.30769231, 17.5 ]), array([], dtype=float64), 3, array([3.10597849e+01, 3.82343947e+00, 8.19190114e-01, 4.91552829e-16])) Но я бы хотел, чтобы он возвращал вектор, который решает матричную систему, что-то вроде -12,5, 0, -22, 0, 17.5 или (array([ -12,5, 0, -22, 0, 17.5 ]),
Нет ли функции или обходного пути, который вычисляет метод исключения Гаусса для неквадратных матриц?
У вас есть 3 независимых уравнения для 5 переменных. Есть много векторов, которые решают систему. Вы можете добавить произвольные кратные двух нулевых векторов, чтобы найти другое решение системы. Вы можете найти основу а для нулевого пространства с помощью scipy.linalg.null_space
Не могли бы вы опубликовать здесь пример кода, как бы вы решали уравнения, используя scipy.linalg.null_space?






Это недоопределенная система уравнений. Это означает, что существует много решений, и не существует такого понятия, как «то самое» решение. Тот факт, что метод исключения Гаусса и lstsq дают разные решения, не означает, что что-то не так.
Сгенерируем и проверим различные решения:
import scipy.linalg as sla
E_null = sla.null_space(E)
def check_solution(coeffs):
x = solutionNonSquare[0] + E_null @ coeffs
check = E @ x - F
with np.printoptions(precision=2, suppress=True):
print('x = {}'.format(x))
with np.printoptions(precision=5, suppress=True):
print('E . x - F = {}'.format(check))
print('|x| = {}'.format(np.linalg.norm(x)))
Мы можем проверить решение минимальной нормы, полученное lstsq:
>>> check_solution([0, 0])
x = [ -4.35 -8.69 -19.69 2.31 17.5 ]
E . x - F = [ 0. -0. -0. 0.]
|x| = 28.174593028253167
Мы можем сгенерировать и протестировать множество других решений
>>> check_solution(100 * np.random.randn(2))
x = [ -88.93 -139.06 66.64 88.64 17.5 ]
E . x - F = [ 0. 0. -0. 0.]
|x| = 199.62363490542995
>>> check_solution(100 * np.random.randn(2))
x = [-25.2 -26.99 -5.33 16.67 17.5 ]
E . x - F = [ 0. -0. -0. 0.]
|x| = 44.455362582961335
>>> check_solution(100 * np.random.randn(2))
x = [ 93.34 14.57 -55.74 -33.74 17.5 ]
E . x - F = [ 0. -0. -0. -0.]
|x| = 116.09338153741933
Мы можем даже посмотреть на ваше решение:
>>> my_favourite_solution = np.array([-12.5, 0, -22, 0, 17.5 ])
>>> my_favourite_coeffs = my_favourite_solution @ E_null
>>> check_solution(my_favourite_coeffs)
x = [-12.5 0. -22. -0. 17.5]
E . x - F = [ 0. -0. -0. 0.]
|x| = 30.765240125830324
Не могли бы вы подробнее рассказать о том, почему он недоопределен? Предположим, мы знаем все матрицы из Ax=b, где A равно m на n, x равно n на 1 вектор, b равно m на 1 вектор, и мы решаем x . Почему мы не можем получить результат с точностью до х?
В этом случае A представляет собой матрицу 4x5. Это означает, что у нас есть 4 уравнения для 5 переменных. Это может, в лучшем случае, позволить нам решить для 4 переменных как функцию 5-й переменной.
В общем случае, когда m<n, оно недоопределено. Если уравнения независимы, то при m>n оно переопределенное, при m=n существует единственное решение.
Какой ответ дает ваш код? Какой ответ вы ожидаете? Ваш код кажется мне правильным, если предположить, что я правильно интерпретировал ваш вопрос, за исключением того, что numpy.linalg.lstsq возвращает четыре величины, первая из которых является решением наименьших квадратов, которое вы хотите.